我创建了一个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
问题从整个 xlWorkSheet.PivotTables(“ ptPreviousMonth”)。ChangePivotCache 行开始。 xlWorkSheet.PivotTables(“ ptPreviousMonth”)。ChangePivotCache 警告“后期绑定分辨率; 我在 xlWorkSheet.PivotTables(“ ptPreviousMonth”)。PivotFields(“ Names”)。AutoSort 行中收到相同的警告。
并且版本:= xlPivotTableVersion15 是'xlPivotTableVersion15'的例外,未声明。由于其保护级别,它可能无法访问。
您可以看到我声明了xlWorkSheet,所以我不知道为什么收到警告,除非它与我不认识的其余行有关。
根据我的了解,xlPivotTableVersion15是可选的,因此我尝试在没有 Version:= xlPivotTableVersion15 的情况下运行代码,并获得
HRESULT异常:0x800A03EC
这似乎意味着我缺少一个参数?
xlWorkSheetData是数据所在的“数据”表。
有人可以帮忙吗?我觉得我已经接近了,但是找不到解决方案?
答案 0 :(得分:1)
编辑-我应该早就意识到这一点,但是您不能在Range
函数中使用RC样式。这导致xlWorkbook.PivotCaches.Create
语句的参数无效。下面的代码已更正为使用有效的语法。
我真的建议您启用Option Strict。您已经在使用一些强类型化的互操作变量,没有理由不完成工作并避免后期绑定的不确定性。
摘自Worksheet.PivotTables Method的文档:
返回一个对象,该对象代表单个数据透视表报表( 数据透视表对象)或所有数据透视表报表的集合( 数据透视表对象)。
由于此函数可以返回多种类型,请使用VB的TryCast Operator将返回的Object
转换为PivotTable
。
关于版本问题,学习使用对象浏览器的(键盘: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