【问题标题】:Pivot Cache Type Mismatch error VB.NET Excel数据透视缓存类型不匹配错误 VB.NET Excel
【发布时间】:2012-05-02 23:19:16
【问题描述】:

请查看底部编辑了解我目前所处的位置,谢谢。

我创建了一个数据透视表,当数据透视缓存定义为:

        Dim ptCache As Excel.PivotCache = mainHighway.PivotCaches.Add(SourceType:=Excel.XlPivotTableSourceType.xlDatabase, SourceData:=mainHighwayData.Range("a1:v7500"))

我的问题是行数每天都在变化,所以我计算出工作表中的行数,然后在我的数据透视缓存中使用它:

Dim highlRow As Integer
highlRow = mainHighwayData.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Row
Dim ptCache As Excel.PivotCache = mainHighway.PivotCaches.Add(SourceType:=Excel.XlPivotTableSourceType.xlDatabase, SourceData:=mainHighwayData.Range("a1:V" & highlRow))

从历史上看,这个解决方案对我来说效果很好,但是当我在这里这样做时,我得到:

Type mismatch. (Exception from HRESULT: 0x80020005 (DISP_E_TYPEMISMATCH))

我一直在摆弄它,发现如果我这样做:

highlRow = 7000
Dim ptCache As Excel.PivotCache = mainHighway.PivotCaches.Add(SourceType:=Excel.XlPivotTableSourceType.xlDatabase, SourceData:=mainHighwayData.Range("a1:V" & highlRow))

它工作正常,所以我想知道如何使用 specialcells 命令定义 highlRow 并将其存储为整数有什么问题。我觉得这里有某种类型或铸造问题,但我无法解决。我试过了:

highlRow = CType(mainHighwayData.Cells.SpecialCells(XlCellType.xlCellTypeLastCell).Row, Integer)

那也不好。也许我找到最后一行的方法在这里不适用?无论如何,我已经花了很长时间修补它,此时我只是在转动我的轮子。如果您有任何想法,将不胜感激。

一如既往地谢谢你。

编辑:我也试过了:

UsedRange.Rows.Count

这在历史上一直有效,但也无法运行。在这一点上,我很好奇为什么枢轴缓存似乎特别有这个问题。

@charles 有一个好主意,可以尝试其他方法来获取最后一个单元格。我试过了:

highlRow = mainHighwayData.Range("A65535").End(XlDirection.xlUp).Row

我得到它来提供正确的行,但它仍然抛出类型不匹配错误。

highlRow = mainHighwayData.Cells.Find("*", SearchOrder:=Excel.XlSearchOrder.xlByRows, SearchDirection:=XlSearchDirection.xlPrevious).Row

这将返回最后一行的正确数字,但再次引发相同的类型不匹配错误。

编辑:我发现了另一条信息,但我不确定如何处理它。如果数据透视表中的值 = 65537 的数字都是如此。我知道 65535 左右曾经是 excel 中的最后一行,但现在不再如此。此外,当我在 excel 中手动创建数据透视表时,我没有遇到任何问题,并且它包含所有数据。我使用的是 int 或 long,所以它不应该是溢出或任何东西。有人对为什么 VB.NET 不允许我根据超过 65537 行的数据制作数据透视表有任何想法吗?

【问题讨论】:

  • 使用SpecialCells代码赋值后highlRow的值是多少?
  • 17105 或类似的东西。这对我来说似乎只是一个数字,这让我感到困惑。我看不出它与仅将其设置为 17105 有何不同。

标签: .net vb.net excel pivot-table


【解决方案1】:

好吧,这有点像一场噩梦,但我找到了一个可行的修复方法。我注意到 vba 中的人也遇到了同样的问题,他们正在切换到 r1c1 表示法,但我也无法让它工作,但我发现了这个 post 并且对答案的最后评论有解决方案。

highlRow = mainHighwayData.Range("A500000").End(XlDirection.xlUp).Row
Dim rng As Excel.Range
rng = mainHighwayData.Range("A1:Q" & highlRow)
mainHighway.Names.Add(Name:="Range1", RefersTo:=rng)
Dim ptCache As Excel.PivotCache = mainHighway.PivotCaches.Add(SourceType:=Excel.XlPivotTableSourceType.xlDatabase, SourceData:="Range1")

因此,您创建了一个命名范围,然后引用它。我想这个想法是你需要从简单的范围对象中抽象出来,这样你就可以制作你的数据透视表。

【讨论】:

    【解决方案2】:

    SpecialCells(XlCellType.xlCellTypeLastCell) 为您提供最后使用的单元格。使用的包括任何类型的格式,因此最后一个单元格可能不包含任何有效数据,因此可能导致 pivotCache 创建失败。
    尝试一种更可靠的方法来查找最后一个包含数据的单元格
    您可以尝试 LastRow = Range("A65535").end(xlup).row
    或 LastRow = Cells.Find("*",SearchOrder:=xlByRows,SearchDirection:=xlPrevious).Row

    【讨论】:

    • 这是个好主意。我尝试了你的两个想法,并用代码和结果更新了我的帖子。
    • 对为什么第一种方法一直返回 1 有任何想法(请参阅主帖中的代码编辑)?
    • 我整理出来了。我需要在工作表中比 65000 更深入。它仍然会引发相同的类型不匹配错误。不过是个好主意,谢谢你的建议。
    【解决方案3】:

    通过这种方式解决了这个问题:

    Excel.Worksheet oSheet = oBook.Worksheets.get_Item(sourceSheet);
    
    Excel.Range oRange = oSheet.UsedRange;
    
    oBook.Names.Add(Name: "Range1", RefersTo: oRange);
    
    Excel.PivotCache oPivotCache = oBook.PivotCaches().Add(SourceType: Excel.XlPivotTableSourceType.xlDatabase, SourceData: "Range1");
    

    【讨论】:

      猜你喜欢
      • 2015-08-27
      • 2017-05-26
      • 1970-01-01
      • 2011-10-08
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多