VB.Net使用VBA访问Excel Pivot表

时间:2018-08-23 14:07:49

标签: excel vba 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

问题从整个 xlWorkSheet.PivotTables(“ ptPreviousMonth”)。ChangePivotCache 行开始。 xlWorkSheet.PivotTables(“ ptPreviousMonth”)。ChangePivotCache 警告“后期绑定分辨率; 我在 xlWorkSheet.PivotTables(“ ptPreviousMonth”)。PivotFields(“ Names”)。AutoSort 行中收到相同的警告。

并且版本:= xlPivotTableVersion15 'xlPivotTableVersion15'的例外,未声明。由于其保护级别,它可能无法访问。

您可以看到我声明了xlWorkSheet,所以我不知道为什么收到警告,除非它与我不认识的其余行有关。

根据我的了解,xlPivotTableVersion15是可选的,因此我尝试在没有 Version:= xlPivotTableVersion15 的情况下运行代码,并获得

  

HRESULT异常:0x800A03EC

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

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

有人可以帮忙吗?我觉得我已经接近了,但是找不到解决方案?

1 个答案:

答案 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