Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
12
返回列表 发新帖
楼主: 张雄友

[已解决]数据格式转换

[复制链接]
发表于 2014-10-11 11:32 | 显示全部楼层
Sub test4()
    Dim A, B, BT, r, c, i, j, k
    Dim n
    Dim gl
    Dim fz
    Dim s       '输出区的行数
    Dim zu%     '组的序号
    Dim py      '工作表列的偏移

    n = 7       '【几人为一组】
    fz = 4      '【输出去如果1组是1列,共有多少列】
    gl = 1      '【每组之间隔几列】
    Range("AW:IV").ClearContents
    BT = [m2:p2]
    A = Range("m3:p" & Range("m65536").End(xlUp).Row + n)
    r = UBound(A): c = UBound(A, 2)
    If r Mod n = 0 Then zu = r / n Else zu = r / n + 1
    ReDim B(1 To zu * (n + 3), 1 To (c + gl) * fz - gl)
    zu = 0: s = 1

    For i = 1 To r - n Step n
        zu = zu + 1
        If zu Mod fz = 1 Then py = 0

        '1)序号
        B(s, c + py) = zu

        '2)标题
        For j = 1 To c
            B(s + 1, j + py) = BT(1, j)
        Next j

        '3)组中的人员
        For k = 1 To n
            For j = 1 To c
                'B(组的基 + 本组已用行数 + 行的偏移,列 + 工作表列的偏移)
                B(s + 1 + k, j + py) = A(i + k - 1, j)
            Next j
        Next k
        py = py + c + gl
        If zu Mod fz = 0 Then s = s + n + 3
    Next i
    [aw2].Resize(s, UBound(B, 2)) = B
End Sub



想晕了,不想了。。。。。好像没错
手动修改 n,fz,gl 吧
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

 楼主| 发表于 2014-10-11 17:59 | 显示全部楼层
本帖最后由 张雄友 于 2014-10-11 18:08 编辑
爱疯 发表于 2014-10-11 11:32
Sub test4()
    Dim A, B, BT, r, c, i, j, k
    Dim n

test4  代码实现的效果导致最后二个员工没有转换到。就是当数据不是整除时,最后有几个没有转换到。

Sub test4()
    Dim A, B, BT, r, c, i, j, k
    Dim n
    Dim gl
    Dim fz
    Dim s       '输出区的行数
    Dim zu%     '组的序号
    Dim py      '工作表列的偏移

    n = 7       '【几人为一组】
    fz = 2      '【输出去如果1组是1列,共有多少列】
    gl = 1      '【每组之间隔几列】
    Range("AW:IV").ClearContents
    BT = [m2:p2]
    A = Range("m3:p" & Range("m65536").End(xlUp).Row + n)
    r = UBound(A): c = UBound(A, 2)
    If r Mod n = 0 Then zu = r / n Else zu = r / n + 1
    ReDim B(1 To zu * (n + 3), 1 To (c + gl) * fz - gl)
    zu = 0: s = 1

    For i = 1 To r - n Step n
        zu = zu + 1
        If zu Mod fz = 1 Then py = 0

        '1)序号
        B(s, c + py) = zu

        '2)标题
        For j = 1 To c
            B(s + 1, j + py) = BT(1, j)
        Next j

        '3)组中的人员
        For k = 1 To n
            For j = 1 To c
                'B(组的基 + 本组已用行数 + 行的偏移,列 + 工作表列的偏移)
                B(s + 1 + k, j + py) = A(i + k - 1, j)
            Next j
        Next k
        py = py + c + gl
        If zu Mod fz = 0 Then s = s + n + 3
    Next i
    [aw2].Resize(s, UBound(B, 2)) = B
End Sub


回复

使用道具 举报

发表于 2014-10-11 20:21 | 显示全部楼层    本楼为最佳答案   
Sub test5()
    Dim A, B, BT, r%, c, i, j, k
    Dim n       '【几人为一组】
    Dim t       '【输出区以1组为1条,共几条】
    Dim g       '【每组之间隔几列】
    Dim s       '输出区的行数
    Dim zu%     '组的序号
    Dim py      '工作表列的偏移

    n = 7
    t = 3
    g = 2
    Range("AW:IV").ClearContents
    r = Range("m65536").End(xlUp).Row - 2
    If r Mod n = 0 Then
        zu = r / n
    Else
        zu = r / n + 1
    End If
    r = zu * n    '让成员的个数,补充为n的倍数
    BT = [m2:p2]
    A = Range("m3:p" & r + 2)
    c = UBound(A, 2)
    ReDim B(1 To zu * (n + 3), 1 To (c + g) * t - g)    '3 = 序号占1行+标题占1行+空行占1行
    zu = 0: s = 1
   
    For i = 1 To r - n + 1 Step n    '从第1组第1行,到最后1组第1行
        zu = zu + 1
        If zu Mod t = 1 Then py = 0    '如果组在第1条,就没有组列的偏移
        '1)序号
        B(s, c + py) = zu
        '2)标题
        For j = 1 To c
            B(s + 1, j + py) = BT(1, j)
        Next j
        '3)组中的人员
        For k = 1 To n    '从组里的第1个成员,到组里的第n个成员
            For j = 1 To c
                'B(组的基 + 本组已用行数 + 行的偏移,列 + 工作表列的偏移)
                B(s + 1 + k, j + py) = A(i + k - 1, j)
            Next j
        Next k
        py = py + c + g    '相对输出区的第1列的偏移量
        If zu Mod t = 0 Then s = s + n + 3    '如果组在最后1条,就增加组的基数
    Next i
    [aw2].Resize(UBound(B), UBound(B, 2)) = B
End Sub
回复

使用道具 举报

 楼主| 发表于 2014-10-11 20:27 | 显示全部楼层
爱疯 发表于 2014-10-11 20:21
Sub test5()
    Dim A, B, BT, r%, c, i, j, k
    Dim n       '【几人为一组】

test4   修改最后一句代码也可以的,测试了一些数据。不知对不对?????

Sub test4()
    Dim A, B, BT, r, c, i, j, k
    Dim n
    Dim gl
    Dim fz
    Dim s       '输出区的行数
    Dim zu%     '组的序号
    Dim py      '工作表列的偏移

    n = 7       '【几人为一组】
    fz = 2      '【输出去如果1组是1列,共有多少列】
    gl = 1      '【每组之间隔几列】
    Range("AW:IV").ClearContents
    BT = [m2:p2]
    A = Range("m3:p" & Range("m65536").End(xlUp).Row + n)
    r = UBound(A): c = UBound(A, 2)
    If r Mod n = 0 Then zu = r / n Else zu = r / n + 1
    ReDim B(1 To zu * (n + 3), 1 To (c + gl) * fz - gl)
    zu = 0: s = 1

    For i = 1 To r - n Step n
        zu = zu + 1
        If zu Mod fz = 1 Then py = 0

        '1)序号
        B(s, c + py) = zu

        '2)标题
        For j = 1 To c
            B(s + 1, j + py) = BT(1, j)
        Next j

        '3)组中的人员
        For k = 1 To n
            For j = 1 To c
                'B(组的基 + 本组已用行数 + 行的偏移,列 + 工作表列的偏移)
                B(s + 1 + k, j + py) = A(i + k - 1, j)
            Next j
        Next k
        py = py + c + gl
        If zu Mod fz = 0 Then s = s + n + 3
    Next i
    [aw2].Resize(zu * (n + 3) , UBound(B, 2)) = B
End Sub

回复

使用道具 举报

发表于 2014-10-11 20:46 | 显示全部楼层
    For i = 1 To r - n Step n
    Next i
这是一组组循环,从第1组到最后1组,最后1组
如果刚好n个人,不会越界;
如果不足n个人,更不会越界。


For i = 1 To r - n+1 Step n
Next i
我这么写,只不过自己觉得好理解些。Test5前面,将人员总数凑足为n的倍数,确实没必要。是因为查错时。。。。小心过头了,就用14楼吧,可以的。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-4 12:43 , Processed in 0.306852 second(s), 7 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表