Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.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
Net使用VBA访问Excel数据透视表_Excel_Vba_Vb.net - Fatal编程技术网

Net使用VBA访问Excel数据透视表

Net使用VBA访问Excel数据透视表,excel,vba,vb.net,Excel,Vba,Vb.net,我创建了一个包含多个工作表的xlsx文件,每个工作表至少有一个透视表,该透视表由同一工作表上的某种图表使用。所有这些数据透视表都使用另一张名为“数据”的表中的相同数据。在我完成所有工作后,我去录制了一些宏,然后创建了一些VBA代码,以便在运行代码时更新透视表。所有这些工作都非常出色,我制作了一个xlsm文件 我决定是时候将所有内容合并到VB.Net中了。我的代码执行一个存储过程,并将我成功放入“数据”表的正确位置的数据带回,所有其他表都可以访问它。 然后我从第一张有透视表的表开始,这就是我的问题

我创建了一个包含多个工作表的xlsx文件,每个工作表至少有一个透视表,该透视表由同一工作表上的某种图表使用。所有这些数据透视表都使用另一张名为“数据”的表中的相同数据。在我完成所有工作后,我去录制了一些宏,然后创建了一些VBA代码,以便在运行代码时更新透视表。所有这些工作都非常出色,我制作了一个xlsm文件

我决定是时候将所有内容合并到VB.Net中了。我的代码执行一个存储过程,并将我成功放入“数据”表的正确位置的数据带回,所有其他表都可以访问它。 然后我从第一张有透视表的表开始,这就是我的问题开始的地方。下面是Excel中可用的代码:

Sub UpdatePreviousMonth(intRecordCount As Integer)

    Sheets("Prev Month").Select

    Range("A6").Select

    ActiveSheet.PivotTables("ptPreviousMonth").ChangePivotCache _
        ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "C:\Users\me\Documents\[My Charts.xlsm]Data!R1C4:R" & CStr(intRecordCount) & "C4", Version:=xlPivotTableVersion15)

    ActiveSheet.PivotTables("ptPreviousMonth").PivotFields("Names").AutoSort xlAscending, "Names"

End Sub
以下是我在VB.Net中的代码,该代码不起作用:

Private Sub UpdatePreviousMonth(intRecordCount As Integer, xlWorkbook As Excel.Workbook, xlWorkSheets As Excel.Sheets, xlWorkSheetData As Excel.Worksheet)
        Try
            Dim xlWorkSheet As Excel.Worksheet = CType(xlWorkSheets("Prev Month"), Excel.Worksheet) ' This line works...

            xlWorkSheet.PivotTables("ptPreviousMonth").ChangePivotCache _
                (xlWorkbook.PivotCaches.Create(SourceType:=Excel.XlPivotTableSourceType.xlDatabase, SourceData:=xlWorkSheetData.Range("R1C4:R" & CStr(intRecordCount) & "C4"), Version:=xlPivotTableVersion15))    

xlWorkSheet.PivotTables("ptPreviousMonth").PivotFields("Names").AutoSort(Excel.XlSortOrder.xlAscending, "Names")

            Catch ex As Exception
                End Try
  End Sub
问题从整个xl工作表.PivotTables(“ptPreviousMonth”).ChangePivotCache行开始xlWorkSheet.PivotTables(“ptPreviousMonth”).ChangePivotCache警告“延迟绑定解析;可能发生运行时错误”。我在xlWorkSheet.PivotTables(“ptPreviousMonth”).PivotFields(“Names”).AutoSort行收到了相同的警告

版本:=xlPivotTableVersion15是未声明的“xlPivotTableVersion15”的例外。由于其保护级别,可能无法访问

正如你所看到的,我声明了一个警告,所以我不知道为什么我会收到警告,除非它与我不认识的行的其余部分有关

据我所知,xlPivotTableVersion15是可选的,因此我尝试在没有版本的情况下运行代码:=xlPivotTableVersion15,并得到

来自HRESULT的异常:0x800A03EC

这似乎意味着我缺少一个参数

xlWorkSheetData是数据所在的“数据”表


有人能帮忙吗?我觉得我很接近,但找不到解决方案?

编辑-我应该早点意识到这一点,但您不能在
范围
函数中使用RC样式。这导致
xlWorkbook.PivotCaches.Create语句的参数无效。以下代码已更正为使用有效语法


我真的建议您启用选项Strict。您已经在使用一些强类型的互操作变量,没有理由不完成这项工作并避免后期绑定的不确定性

从以下文件中:

返回表示单个数据透视表(数据透视表)的对象 数据透视表对象)或所有数据透视表的集合(a 工作表上的数据透视表(数据透视表对象)

由于此函数可以返回多种类型,请使用VB将返回的
对象
转换为
数据透视表

对于版本问题,学习使用对象浏览器的(键盘:F2或“视图”菜单->对象浏览器)搜索功能。它有助于找到这些项的定义位置和定义方式

Private Sub UpdatePreviousMonth(intRecordCount As Integer, xlWorkbook As Excel.Workbook, xlWorkSheets As Excel.Sheets, xlWorkSheetData As Excel.Worksheet)
    Try
        Dim xlWorkSheet As Excel.Worksheet = CType(xlWorkSheets("Prev Month"), Excel.Worksheet)

        Dim pt As Excel.PivotTable = TryCast(xlWorkSheet.PivotTables("ptPreviousMonth"), Excel.PivotTable)
        If pt IsNot Nothing Then
            Dim ver As Excel.XlPivotTableVersionList = Excel.XlPivotTableVersionList.xlPivotTableVersion15
            Dim sourceDataRange As Excel.Range = xlWorkSheetData.Range("A1:A1").Resize(intRecordCount)
            Dim cache As Excel.PivotCache = xlWorkbook.PivotCaches.Create(SourceType:=Excel.XlPivotTableSourceType.xlDatabase, SourceData:=sourceDataRange, Version:=ver)
            pt.ChangePivotCache(cache)
        End If

        pt = CType(xlWorkSheet.PivotTables("ptPreviousMonth"), Excel.PivotTable)
        If pt IsNot Nothing Then
            Dim field As Excel.PivotField = CType(pt.PivotFields("Names"), Excel.PivotField)
            field.AutoSort(Excel.XlSortOrder.xlAscending, "Names")
        End If

    Catch ex As Exception
    End Try
End Sub

请原谅,但是声明
XlPivotTableVersionList
变量有什么意义呢?@JohnyL,它主要是为了提醒大家注意在OP中定义了什么类型的
xlPivotTableVersion15
,因为OP在查找它时遇到了一个问题。好吧,这很公平,但我认为它不是一个好的样式,因为它会使代码膨胀…:)感谢TnTinMn,但遗憾的是,我仍然在Dim cache中得到与Excel.PivotCache=xlWorkbook.PivotCaches.Create(SourceType:=Excel.XlPivotTableSourceType.xlDatabase,SourceData:=xlWorkSheetData.Range(“R1C4:R”&CStr(intRecordCount)和“C4”),Version:=ver)相同的错误@TillingCode,我刚刚验证了这个代码模式是否有效。我建议您验证传递给
updatepreiousmonth
的参数是否正确,并断开
SourceData
范围以验证其正确性。i、 e.:
Dim sourceDataRange作为Excel.Range=xlWorkSheetData.Range(“R1C4:R”和CStr(intRecordCount)和“C4”)