首页 文章

数据透视缓存类型不匹配错误VB.NET Excel

提问于
浏览
1

请参阅底部编辑,了解我目前所处的位置,谢谢 .

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

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行的数据制作数据透视表?

3 回答

  • 2

    嗯,这有点像噩梦,但我找到了一个有效的解决方案 . 我注意到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")
    

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

  • 1

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

  • 1

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

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

相关问题