2012-05-02 7 views
1

私が現在どこにいるのか、下の編集をご覧ください。ありがとうございます。ピボットキャッシュタイプの不一致エラーVB.NET Excel

として、私は、ピボットキャッシュが定義されているときに正常に動作し、ピボットテーブルを作成しました:私の問題は、行数が日から日に変更されたので、私は、行の数を把握することをある

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

それは正常に動作しますので、私は私が定義する方法に問題が何であるか疑問に思ったままにしていますhighlRow specialcellsコマンドを使用し、それを整数として格納します。私はここに何らかの種類や鋳造の問題があるように感じますが、私はそれに私の指を置くことはできません。私は試しました:

そして、それはどちらも良いことではありませんでした。おそらく最後の行を見つけるための私の方法は、ここでは適用できません?とにかく、私は長い時間をかけてそれを試してきました。私はこの時点で私の車輪を回転させています。あなたが思考を持っているなら、それは非常に高く評価されるでしょう。

いつもありがとうございます。

編集:私も試してみた:

歴史的に働いて、また実行することができませんでしたい
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になります。タイプミスマッチが発生しています。これは65535以上のすべての数字に当てはまります。私は65535かそこそこのExcelがExcelの最後の行に使われていたことは知っていますが、それはもはや事実ではありません。また、私が手動でピボットテーブルを作成しても問題はなく、すべてのデータを持っています。私はintまたはlongを使用しているので、オーバーフローまたは何かであってはなりません。 VB.NETが65537以上の行を持つデータに基づいてピボット・テーブルを作成することができない理由について誰もが考えていますか?

+0

あなたはSpecialCellsコードを使用して、それを割り当てた後highlRowの値は何ですか? –

+0

17105または同様のもの。それはちょうど私に番号であるように見えます、それは私を混乱させるものです。私はそれが17105と同じに設定することとはどのように違うのか分かりません。 – asjohnson

答えて

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 =範囲( "A65535")を試みることができるデータ
を含む最後のセルを見つけることのより堅牢な方法を試してみてくださいエンド(xlup)
またはLASTROW = Cells.Find( "*" を.row、SearchOrder:= xlByRows、 SearchDirection:= xlPrevious).Row

+0

それは良い考えです。私は両方のあなたのアイデアを試して、コードと結果で私のポストを更新しました。 – asjohnson

+0

最初のアプローチが1を返す理由についての考え(コードのメインポストでの編集を参照)? – asjohnson

+0

私はそれを選別した。ワークシートの65000より下に移動する必要がありました。同じタイプの不一致エラーが発生します。しかし、良いアイデア、提案に感謝します。 – asjohnson

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