Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel宏将数百列数据透视为3列_Excel_Vba - Fatal编程技术网

Excel宏将数百列数据透视为3列

Excel宏将数百列数据透视为3列,excel,vba,Excel,Vba,我收到一份包含数百个专栏的每周报告。这些列是每周的,包含两个子列的度量值(销售额、单位和销售额) 我想将这些列转换为4:客户名称、周数、销售额、售出单位。我已经成功地编写了一个宏来实现这一点,它最初运行得非常快,但后来运行得非常慢。我认为唯一发生的变化是我的IT部门更新了我的Excel 365版本 因此,如果我有这些数据: Client Name | Week 1 Sales | Week 1 Units | Week 2 Sales | Week 2 Units ... ___________

我收到一份包含数百个专栏的每周报告。这些列是每周的,包含两个子列的度量值(销售额、单位和销售额)

我想将这些列转换为4:客户名称、周数、销售额、售出单位。我已经成功地编写了一个宏来实现这一点,它最初运行得非常快,但后来运行得非常慢。我认为唯一发生的变化是我的IT部门更新了我的Excel 365版本

因此,如果我有这些数据:

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。我还没有和数组打过交道,所以我必须花一些时间来理解这是怎么回事。我要说的是,在我的代码中加入这个会产生一些奇怪的结果,但运行得非常快!所以,如果我能仔细分析一下,并根据我的电子表格进行调整,我想我会有一个赢家。谢谢斯科特。我还没有和数组打过交道,所以我必须花一些时间来理解这是怎么回事。我要说的是,在我的代码中加入这个会产生一些奇怪的结果,但运行得非常快!所以,如果我能对这个进行一点剖析,并根据我的电子表格进行调整,那么我想我会有一个赢家。