枢轴cachingtypes不匹配错误VB.NET Excel

请参阅底部的编辑我目前在哪里,谢谢。

我已经创build了一个数据透视表,在透视caching被定义为:

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

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

 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)) 

这个解决scheme对我来说历来是非常棒的,但是当我在这里做的时候,我得到了:

 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并将其存储为一个整数问题有什么问题。 我觉得这里有一些types或演员的问题,但我不能把它放在手上。 我试过了:

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

而且这也不好。 也许我find最后一行的方法在这里不适用? 无论如何,我已经花了很长时间来修补它,而我现在只是在旋转车轮。 如果您有任何想法,将不胜感激。

谢谢你一如既往。

编辑:我也试过了:

 UsedRange.Rows.Count 

历史上曾经工作过,而且也无法运行。 在这一点上,我很好奇为什么枢轴caching专门似乎有这个问题。

@charles有一个好主意,尝试其他方式获得最后一个单元格。 我试过了:

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

我得到它给正确的行,但它仍然会引发types不匹配错误。

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

这将返回最后一行的正确数字,但会再次抛出相同types的不匹配错误。

编辑:我发现了另一个信息,但我不知道该怎么办。 数据透视表工作正常,如果它的值是<= 65536,但第二我增加范围为65537我得到了types不匹配,一直困扰着我。 对于所有数字> = 65537的情况都是如此。我知道65535或以前是excel中的最后一行,但事实不是这样。 另外,当我在Excel中手动创build数据透视表时,我没有任何问题,它具有所有的数据。 我使用int或long,所以它不应该是溢出或任何东西。 任何人都有任何想法,为什么VB.NET不会让我基于数据超过65537行的数据透视表?

那么这是一个噩梦,但我find了一个修复工程。 我注意到vba中的人有同样的麻烦,他们正在切换到r1c1符号,但是我也无法得到这个工作,但是我发现这个post和最后一个评论答案有解决scheme。

 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") 

所以你创build一个命名的范围,然后引用它。 我想这个想法是你需要从简单的范围对象抽象,这将允许你做你的数据透视表。

SpecialCells(XlCellType.xlCellTypeLastCell)为您提供最后使用的单元格。 使用包括任何forms的格式,所以最后一个单元格可能不包含任何有效的数据,因此可能导致pivotCache创build失败。
尝试一种更强大的方式来find最后一个包含数据的单元格
你可以试试LastRow = Range(“A65535”)。end(xlup).row
或LastRow = Cells.Find(“*”,SearchOrder:= xlByRows,SearchDirection:= xlPrevious).Row

这样解决了这个问题:

 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");