我已经搜索并找到了许多类似的问题(在这里和其他地方),但是我无法理解如何适应自己的需求。通常,我会使用VBA找到类似数据透视数据的数据透视,或者我无法弄清楚如何正确地搜索(描述)我所需要的东西,或者我丢失了一些东西。
我获取主题/类别对的数据(最多3万行),并对它们进行计数/分组以得到:
Subject Category Count
A C1 1
A C2 4
B C1 8
B C2 1
B C3 2
C C2 4
我需要数据显示为
Subject C1 C2 C3
A 1 4 0
B 8 1 2
C 0 4 0
有没有一种方法可以使用Excel VBA做到这一点?我尝试直接从原始数据转换为这种格式,但无法弄清楚,因此希望这种方法能更好地工作。
任何帮助将不胜感激-即使是告诉我如何更好地寻求解决方案。
编辑:哦,是的,并且每次运行此数据时类别列表都不相同。必须定期进行,并且每次都会更改。所以我一直在寻找如何按照类别从左到右的顺序增加类别(然后我总是可以在以后对它们进行排序)...
假设您已按主题对Sheet1进行了排序。我会为您拼凑几块。这是未经测试的,因为它不完整。但是,这些概念将为您提供想要实现的目标。
我将从创建第二张表开始。在遍历Sheet1时,您需要跟踪正在处理的行。
Dim tRow As Long 'tRow to represent the target row, one for each subject on Sheet1
tRow = 1 'Start on row 1, the code below takes into account the header row
在Sheet1上建立lastRow。
lastRow = Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row
在Sheet1上获取所有唯一的类别名称。您可以构建类别数组。“ categoryList()”
链接至Chip Pearson页面的此链接提供了许多有关从不同值构建数组的良好信息。
使用这些名称在Sheet2上构建列标题。执行循环
For c = 0 To UBound(categoryList)
Sheets("Sheet2").Cells(1, c + 2) = categoryList(c) 'c+2 because column 2 is the first Category
Next c
逐行浏览Sheet1。设置一个名为“ lastSubject”的变量,并将该行的列A中的值与lastSubject进行比较。
Dim lastSubject As String
lastSubject = ""
For r = 2 To lastRow
If Sheets("Sheet1").Cells(r, 1) <> lastSubject Then
lastSubject = Sheets("Sheet1").Cells(r, 1)
tRow = tRow + 1 'Add 1 to target row on Sheet2, because the subject changed.
Sheets("Sheet2").Cells(tRow, 1) = Sheets("Sheet1").Cells(r, 1) 'Set the Subject on Sheet2
End If
For c = 0 to UBound(categoryList)
If Sheets("Sheet1").Cells(r, 2).Value = categoryList(c) Then
Sheets("Sheet2").Cells(tRow, c + 2) = Sheets("Sheet1").Cells(r, 3) 'Set the Count
End If
next c
next r
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句