Excel宏将数百列数据透视为3列
我收到一份包含数百个专栏的每周报告。这些列是每周的,包含两个子列的度量值(销售额、单位和销售额) 我想将这些列转换为4:客户名称、周数、销售额、售出单位。我已经成功地编写了一个宏来实现这一点,它最初运行得非常快,但后来运行得非常慢。我认为唯一发生的变化是我的IT部门更新了我的Excel 365版本 因此,如果我有这些数据:Excel宏将数百列数据透视为3列,excel,vba,Excel,Vba,我收到一份包含数百个专栏的每周报告。这些列是每周的,包含两个子列的度量值(销售额、单位和销售额) 我想将这些列转换为4:客户名称、周数、销售额、售出单位。我已经成功地编写了一个宏来实现这一点,它最初运行得非常快,但后来运行得非常慢。我认为唯一发生的变化是我的IT部门更新了我的Excel 365版本 因此,如果我有这些数据: Client Name | Week 1 Sales | Week 1 Units | Week 2 Sales | Week 2 Units ... ___________
Client Name | Week 1 Sales | Week 1 Units | Week 2 Sales | Week 2 Units ...
___________________________________________________________________________
ABC Co | 100,000 | 10 | 150,000 | 21 ...
我想将其转换为:
Client Name | Week | Sales | Units
______________________________________
ABC Co | Week 1 | 100,000 | 10
ABC Co | Week 2 | 150,000 | 21
等
numCols=Application.WorksheetFunction.CountA(dataSh.Range(“1:1”))
numRows=Application.WorksheetFunction.CountA(dataSh.Range(“A:A”))+1
对于i=3到numRows
对于j=2至numCols步骤2
如果dataSh.Cells(i,j)“,则
pivotStartRng.Offset(匹配项,0)=数据单元格(i,1)
pivotStartRng.Offset(匹配项,1)=数据单元格(1,j)
pivotStartRng.Offset(匹配项,2)=数据单元格(i,j)
pivotStartRng.Offset(匹配项,3)=数据单元格(i,j+1)
匹配项=匹配项+1
如果结束
下一个j
接下来我
代码主体查看报表数据的每个单元格,如果不是空的,则将这些结果复制到“合并数据”选项卡。它循环遍历大约15000个单元格(150列x100行)
我还尝试了一个代码,它基本上复制并粘贴每个列到数据表,然后删除空白行。但这也很慢
我的问题是,这种在15000个单元格中循环的宏是否总是运行缓慢,或者这不是问题所在?也就是说,以不同的方式编写宏会更好吗更新今天早上我运行了原始代码,它运行得非常快。我粘贴到的范围是一个表,左侧有查找公式,粘贴数据时这些公式会向下复制行。这似乎大大降低了速度,当我移除表并运行宏时,它运行得非常快。我不确定粘贴到Excel中的表格是否会导致其运行如此缓慢,或者是否有其他原因?将所有数据加载到变量数组中,循环该数组并加载另一个变量数组,然后将变量数组发布到新工作表上。限制vba引用工作表上数据的次数
numcols = Application.WorksheetFunction.CountA(dataSh.Range("1:1"))
numrows = Application.WorksheetFunction.CountA(dataSh.Range("A:A")) + 1
Dim dat As Variant
dat = dataSh.Range(dataSh.Cells(3, 2), dataSh.Cells(numrows, numcols)).Value
Dim odat As Variant
ReDim odat(1 To ((UBound(dat, 2) - 1) / 2) * UBound(dat, 1), 1 To 4)
matches = 1
For I = LBound(dat, 1) To UBound(dat, 2)
For J = LBound(dat, 2) + 1 To UBound(dat, 2) Step 2
If dat(I, J) <> "" Then
odat(matches, 1) = dat(I, 1)
odat(matches, 2) = dat(1, J)
odat(matches, 3) = dat(I, J)
odat(matches, 4) = dat(I, J + 1)
matches = matches + 1
End If
Next J
Next I
pivotStartRng.Resize(UBound(odat, 1), 4).Value = odat
numcols=Application.WorksheetFunction.CountA(dataSh.Range(“1:1”))
numrows=Application.WorksheetFunction.CountA(dataSh.Range(“A:A”))+1
Dim dat作为变量
dat=dataSh.Range(dataSh.Cells(3,2),dataSh.Cells(numrows,numcols)).Value
Dim-odat作为变体
重读odat(1到((UBound(dat,2)-1)/2)*UBound(dat,1),1到4)
匹配项=1
对于I=LBound(dat,1)到UBound(dat,2)
对于J=LBound(dat,2)+1至UBound(dat,2)步骤2
如果dat(I,J)“,则
odat(匹配项,1)=dat(I,1)
odat(匹配项,2)=dat(1,J)
odat(匹配项,3)=dat(I,J)
odat(匹配项,4)=dat(I,J+1)
匹配项=匹配项+1
如果结束
下一个J
接下来我
pivotStartRng.Resize(UBound(odat,1),4)。值=odat
将所有数据加载到变量数组中,循环该数组并加载另一个变量数组,然后将变量数组发布到新工作表上。限制vba引用工作表上数据的次数
numcols = Application.WorksheetFunction.CountA(dataSh.Range("1:1"))
numrows = Application.WorksheetFunction.CountA(dataSh.Range("A:A")) + 1
Dim dat As Variant
dat = dataSh.Range(dataSh.Cells(3, 2), dataSh.Cells(numrows, numcols)).Value
Dim odat As Variant
ReDim odat(1 To ((UBound(dat, 2) - 1) / 2) * UBound(dat, 1), 1 To 4)
matches = 1
For I = LBound(dat, 1) To UBound(dat, 2)
For J = LBound(dat, 2) + 1 To UBound(dat, 2) Step 2
If dat(I, J) <> "" Then
odat(matches, 1) = dat(I, 1)
odat(matches, 2) = dat(1, J)
odat(matches, 3) = dat(I, J)
odat(matches, 4) = dat(I, J + 1)
matches = matches + 1
End If
Next J
Next I
pivotStartRng.Resize(UBound(odat, 1), 4).Value = odat
numcols=Application.WorksheetFunction.CountA(dataSh.Range(“1:1”))
numrows=Application.WorksheetFunction.CountA(dataSh.Range(“A:A”))+1
Dim dat作为变量
dat=dataSh.Range(dataSh.Cells(3,2),dataSh.Cells(numrows,numcols)).Value
Dim-odat作为变体
重读odat(1到((UBound(dat,2)-1)/2)*UBound(dat,1),1到4)
匹配项=1
对于I=LBound(dat,1)到UBound(dat,2)
对于J=LBound(dat,2)+1至UBound(dat,2)步骤2
如果dat(I,J)“,则
odat(匹配项,1)=dat(I,1)
odat(匹配项,2)=dat(1,J)
odat(匹配项,3)=dat(I,J)
odat(匹配项,4)=dat(I,J+1)
匹配项=匹配项+1
如果结束
下一个J
接下来我
pivotStartRng.Resize(UBound(odat,1),4)。值=odat
将所有数据加载到变量数组中,循环该数组并加载另一个变量数组,然后将变量数组发布到新工作表上。限制vba引用工作表上数据的时间。将所有数据加载到变量数组中,循环该数组并加载另一个变量数组,然后将变量数组发布到新工作表上。限制vba引用工作表上数据的时间。谢谢Scott。我还没有和数组打过交道,所以我必须花一些时间来理解这是怎么回事。我要说的是,在我的代码中加入这个会产生一些奇怪的结果,但运行得非常快!所以,如果我能仔细分析一下,并根据我的电子表格进行调整,我想我会有一个赢家。谢谢斯科特。我还没有和数组打过交道,所以我必须花一些时间来理解这是怎么回事。我要说的是,在我的代码中加入这个会产生一些奇怪的结果,但运行得非常快!所以,如果我能对这个进行一点剖析,并根据我的电子表格进行调整,那么我想我会有一个赢家。