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