请参阅底部编辑了解我目前所处的位置,谢谢。
我创建了一个数据透视表,当数据透视缓存定义为:
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
这将返回最后一行的正确数字,但再次引发相同的类型不匹配错误。
编辑:我发现了另一点信息,但我不确定如何处理它。如果数据透视表中的值 <= 65536,则数据透视表可以正常工作,但是第二次我将范围增加到 65537,我得到了一直困扰我的类型不匹配。对于所有 >= 65537 的数字都是如此。我知道 65535 左右曾经是 excel 中的最后一行,但现在已经不是这样了。此外,当我在 excel 中手动创建数据透视表时,我没有遇到任何问题,并且它包含所有数据。我使用的是 int 或 long,所以它不应该是溢出或任何东西。有人对为什么 VB.NET 不允许我根据超过 65537 行的数据制作数据透视表有任何想法吗?