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
Excel VBA从多个动态合并范围自动创建数据透视表_Vba_Excel_Pivot Table - Fatal编程技术网

Excel VBA从多个动态合并范围自动创建数据透视表

Excel VBA从多个动态合并范围自动创建数据透视表,vba,excel,pivot-table,Vba,Excel,Pivot Table,我正在尝试自动化从动态数据表创建透视表的过程,这些数据表总是以表上方的日期开始。CountExpos统计数据范围中的日期数,以便代码知道需要向具有多个合并范围的透视表中输入多少数据表。然后,代码根据第一个日期的起始位置生成一个数据范围字符串,并根据世博会计数的多少将适当的数据范围添加到该字符串中。然后,它构建一个字符串(statString),该字符串可以直接放入透视表的创建中,从SourceData开始,到version结束,然后代码应该输出透视表,但返回运行时错误“1004”:应用程序定义的

我正在尝试自动化从动态数据表创建透视表的过程,这些数据表总是以表上方的日期开始。CountExpos统计数据范围中的日期数,以便代码知道需要向具有多个合并范围的透视表中输入多少数据表。然后,代码根据第一个日期的起始位置生成一个数据范围字符串,并根据世博会计数的多少将适当的数据范围添加到该字符串中。然后,它构建一个字符串(statString),该字符串可以直接放入透视表的创建中,从SourceData开始,到version结束,然后代码应该输出透视表,但返回运行时错误“1004”:应用程序定义的错误或对象定义的错误

即使我将statString的输出直接复制并粘贴到pivot表代码中,也会创建pivot表,但当我只键入statString时,代码无法运行。谢谢你的帮助,谢谢

Sub CountExpos()

Dim lastRow As Long

Set sht = ThisWorkbook.Worksheets("Orc Text")

For i = 1 To 1000
    If IsEmpty(sht.Cells(i, 1)) = False Then
    lastRow = i
    End If
Next i

Dim expoCount
expoCount = 0

For J = 1 To lastRow
If IsDate(sht.Cells(J, 1)) = True Then
    expoCount = expoCount + 1
    End If
Next J


MsgBox (expoCount)

Dim count
count = 0


ReDim expos(0 To expoCount) As String
ReDim rgs(0 To expoCount) As String

For Y = 1 To lastRow
If IsDate(sht.Cells(Y, 1)) = True Then
    expos(count) = sht.Cells(Y, 1)
    rgs(count) = "Array(" & Chr(34) & "'Orc Text'!R" & (Y + 3) & "C1:" & "R" & (Y + 12) & "C10"
    count = count + 1
End If
Next Y

Dim statString As String
statString = " Array("

For X = 0 To expoCount - 1
 If X = expoCount - 1 Then
    statString = statString & rgs(X) & Chr(34) & ", " & Chr(34) & expos(X) & Chr(34) & ")"
 Else
    statString = statString & rgs(X) & Chr(34) & ", " & Chr(34) & expos(X) & Chr(34) & "), "
    End If

Next X

statString = statString & ")"
On Error GoTo 0

MsgBox (statString)






ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
    statString, Version:=xlPivotTableVersion15).CreatePivotTable _
    TableDestination:="", TableName:= _
    "PivotTable1", DefaultVersion:=xlPivotTableVersion15
ActiveSheet.PivotTables("PivotTable1").DataPivotField.PivotItems( _
    "Sum of Value").Position = 1

End Sub
现在,下面的代码用于从多个表构建数据透视表,但每次数据范围更改时都需要对其进行调整。我无法理解为什么statString在向代码中输入相同的内容时不起作用

Sub GrandPivot()

 ActiveWorkbook.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:= _
    Array(Array("'Orc Text'!R7C1:R16C10", "Item1"), Array("'Orc Text'!R22C1:R31C10", _
    "Item2"), Array("'Orc Text'!R37C1:R46C10", "Item3"), Array( _
    "'Orc Text'!R52C1:R61C10", "Item4"), Array("'Orc Text'!R67C1:R76C10", "Item5"), _
    Array("'Orc Text'!R82C1:R91C10", "Item6"), Array("'Orc Text'!R97C1:R106C10", _
    "Item7"), Array("'Orc Text'!R112C1:R121C10", "Item8"), Array( _
    "'Orc Text'!R127C1:R136C10", "Item9"), Array("'Orc Text'!R142C1:R151C10", "Item10" _
    ), Array("'Orc Text'!R157C1:R166C10", "Item11"), Array("'Orc Text'!R172C1:R181C10" _
    , "Item12"), Array("'Orc Text'!R187C1:R196C10", "Item13"), Array( _
    "'Orc Text'!R202C1:R211C10", "Item14")), Version:=xlPivotTableVersion15).CreatePivotTable _
    TableDestination:="", TableName:= _
    "PivotTable2", DefaultVersion:=xlPivotTableVersion15
ActiveSheet.PivotTables("PivotTable2").DataPivotField.PivotItems( _
    "Sum of Value").Position = 1

End Sub

可能是引用的问题。看看这个答案:。我解决了这个问题,为expocount的数量添加了If语句,知道这个数字将在12到18之间,然后为每个expocount创建透视表,从正确的点抓取多个数据范围。这不是最干净的方法,但很有效。可能是引号的问题。看看这个答案:。我解决了这个问题,为expocount的数量添加了If语句,知道这个数字将在12到18之间,然后为每个expocount创建透视表,从正确的点抓取多个数据范围。这不是最干净的方法,但它很有效。