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未満の場合は正常に機能しますが、2番目に範囲を65537に増やすと、タイプの不一致が発生します。これは、65537以上のすべての数値に当てはまります。65535かそこらがExcelの最後の行であったことは知っていますが、現在はそうではありません。また、Excelで手動でピボットテーブルを作成しても問題はなく、すべてのデータが含まれています。私はintまたはlongを使用しているので、オーバーフローなどであってはなりません。VB.NETで65537行を超えるデータに基づいてピボットテーブルを作成できない理由について、誰かが考えていますか?

4

3 に答える 3

3

それは少し悪夢でしたが、私はうまくいく修正を見つけました。vbaの人々も同じ問題を抱えていて、r1c1表記に切り替えていることに気付きましたが、それも機能しませんでしたが、この投稿とそこにある答えの最後のコメントに解決策がありました。

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

したがって、名前付き範囲を作成し、それを参照します。単純な範囲オブジェクトから抽象化する必要があり、ピボットテーブルを作成できるようになるという考えだと思います。

于 2012-05-03T18:45:44.910 に答える
1

SpecialCells(XlCellType.xlCellTypeLastCell)は、最後に使用されたセルを提供します。使用にはあらゆる種類のフォーマットが含まれるため、最後のセルに有効なデータが含まれていない可能性があり、pivotCacheの作成が失敗する可能性があります。
データを含む最後のセルを見つけるためのより堅牢な方法を
試すLastRow=Range( "A65535")。end(xlup).row
またはLastRow = Cells.Find( "*"、SearchOrder:= xlByRows、SearchDirection:= xlPrevious )。行

于 2012-05-03T07:26:20.730 に答える
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");
于 2013-07-18T13:29:29.617 に答える