Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3907|回复: 6

[已解决]請問如何加總不同工作表的個數?

[复制链接]
发表于 2011-10-27 21:47 | 显示全部楼层 |阅读模式
老師好
我有兩張分屬不同工作表的表格,如下:
第一張表是個人專長
姓名        專長
a        水電
b        機械
c        土木
d        水電
e        水電
f        機械
g        土木
h        機械
i        水電
j        土木
k        土木

第2張表是加入的公司

公司        姓名
甲        a
甲        c
乙        e
乙        k
乙        b
甲        g
丙        i
甲        f
乙        d
乙        j


想要再另一張工作表計算各別公司所擁有專長人數表


公司        水電        機械        土木
甲        1        1        2
乙        2        1        2
丙        1        0        0


我不想先合併這兩張工作表,請問要如何編寫代碼才能完成?
謝謝老師
最佳答案
2011-10-28 11:51
本帖最后由 mxg825 于 2011-10-28 12:01 编辑
  1. Sub 生成数据()
  2. Dim D As New Dictionary, LD As New Dictionary, ID As New Dictionary '字典
  3. Dim Arr1, Arr2, Arr3 '数组
  4. Dim 列&, 行&, L&, R&, X& '行 列 号变量
  5. Arr1 = Sheets("專長表").Range("a2:B" & Sheets("專長表").Range("a65536").End(xlUp).Row)
  6. Arr2 = Sheets("所屬公司").Range("a2:B" & Sheets("所屬公司").Range("a65536").End(xlUp).Row)
  7. L = 1: R = 1
  8. LD("公司\專長") = L
  9. For X = 1 To UBound(Arr1)
  10.    If Not LD.Exists(Arr1(X, 2)) Then
  11.       L = L + 1
  12.       LD(Arr1(X, 2)) = L
  13.    End If
  14.    D(Arr1(X, 1)) = LD(Arr1(X, 2))
  15. Next
  16. If L = 1 Then Exit Sub
  17. Arr3 = Application.Transpose(LD.keyS)
  18. For X = 1 To UBound(Arr2)
  19.    行 = D(Arr2(X, 2))
  20.    If ID.Exists(Arr2(X, 1)) Then
  21.         列 = ID(Arr2(X, 1))
  22.         Arr3(行, 列) = Arr3(行, 列) + 1
  23.     Else
  24.         R = R + 1
  25.         ID(Arr2(X, 1)) = R
  26.         ReDim Preserve Arr3(1 To L, 1 To R)
  27.         Arr3(1, R) = Arr2(X, 1)
  28.         Arr3(行, R) = 1
  29.     End If
  30. Next
  31. Sheets("生成").Cells.Clear
  32. Sheets("生成").Range("A1").Resize(R, L) = Application.Transpose(Arr3)
  33. MsgBox "完成", , "mxg825提示"
  34. End Sub
复制代码

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2011-10-28 00:32 | 显示全部楼层
建议放在一起,用函数做。最好上传附件,问题更易被解决
回复

使用道具 举报

发表于 2011-10-28 00:32 | 显示全部楼层
建议放在一起,用函数做。最好上传附件,问题更易被解决
回复

使用道具 举报

 楼主| 发表于 2011-10-28 07:27 | 显示全部楼层
謝謝老師。煩請解答

Book1.rar

7.6 KB, 下载次数: 19

回复

使用道具 举报

发表于 2011-10-28 11:51 | 显示全部楼层    本楼为最佳答案   
本帖最后由 mxg825 于 2011-10-28 12:01 编辑
  1. Sub 生成数据()
  2. Dim D As New Dictionary, LD As New Dictionary, ID As New Dictionary '字典
  3. Dim Arr1, Arr2, Arr3 '数组
  4. Dim 列&, 行&, L&, R&, X& '行 列 号变量
  5. Arr1 = Sheets("專長表").Range("a2:B" & Sheets("專長表").Range("a65536").End(xlUp).Row)
  6. Arr2 = Sheets("所屬公司").Range("a2:B" & Sheets("所屬公司").Range("a65536").End(xlUp).Row)
  7. L = 1: R = 1
  8. LD("公司\專長") = L
  9. For X = 1 To UBound(Arr1)
  10.    If Not LD.Exists(Arr1(X, 2)) Then
  11.       L = L + 1
  12.       LD(Arr1(X, 2)) = L
  13.    End If
  14.    D(Arr1(X, 1)) = LD(Arr1(X, 2))
  15. Next
  16. If L = 1 Then Exit Sub
  17. Arr3 = Application.Transpose(LD.keyS)
  18. For X = 1 To UBound(Arr2)
  19.    行 = D(Arr2(X, 2))
  20.    If ID.Exists(Arr2(X, 1)) Then
  21.         列 = ID(Arr2(X, 1))
  22.         Arr3(行, 列) = Arr3(行, 列) + 1
  23.     Else
  24.         R = R + 1
  25.         ID(Arr2(X, 1)) = R
  26.         ReDim Preserve Arr3(1 To L, 1 To R)
  27.         Arr3(1, R) = Arr2(X, 1)
  28.         Arr3(行, R) = 1
  29.     End If
  30. Next
  31. Sheets("生成").Cells.Clear
  32. Sheets("生成").Range("A1").Resize(R, L) = Application.Transpose(Arr3)
  33. MsgBox "完成", , "mxg825提示"
  34. End Sub
复制代码

生成报表.rar

11.67 KB, 下载次数: 19

回复

使用道具 举报

 楼主| 发表于 2011-10-28 12:06 | 显示全部楼层
謝謝老師
謝謝老師
回复

使用道具 举报

发表于 2011-10-28 12:16 | 显示全部楼层
注:手工清除多余字符后,test才有效。
sheets(2)的A7的第2个字符,为什么代码替换不掉呀,等会再去问问

Sub test()
    Dim A, B, C, i%, j%, k%, l%
    A = Sheets(1).Range("a1:b" & Sheets(1).Range("a65536").End(xlUp).Row)
    B = Sheets(2).Range("a1:b" & Sheets(2).Range("a65536").End(xlUp).Row)
    C = Sheets(3).Range("a1:d" & Sheets(3).Range("a65536").End(xlUp).Row)
    For i = 2 To UBound(C)
        For j = 2 To UBound(C, 2)
            C(i, j) = 0
            For k = 2 To UBound(B)    '公司-姓名
                If C(i, 1) = B(k, 1) Then
                    For l = 2 To UBound(A)    '姓名-专业
                        If B(k, 2) = A(l, 1) And A(l, 2) = C(1, j) Then
                            C(i, j) = C(i, j) + 1
                        End If
                    Next l
                End If
            Next k
        Next j
    Next i
    Sheets(3).Cells(1, 1).Resize(UBound(C), UBound(C, 2)) = C
End Sub
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 01:14 , Processed in 0.253727 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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