3

昔は (Visual Studio pkg の一部として) vb を使用していましたが、新しい仕事では、サイド プロジェクトの一部として VBA を少し使用する必要があります。私は初心者のボートのストレートだとは言いませんが、以前に行ったことの多くをまだ再学習しています (言うまでもなく、VB を学習していたときに触れられなかった Excel 固有のビットを組み込むことは言うまでもありません)ビジュアルスタジオで)

私はすでに別のプロジェクトで vba を介していくつかのピボット テーブルを作成しましたが、現在、特定のプロジェクトで困惑しています。

VBA Excel リファレンス ブックに記載されているピボット テーブルの一部のコードを再利用してきましたが、今のところ問題なく動作しています。しかし、この特定のワークブックでは、いくつかの変数を渡しながら関数を呼び出すワークシートのボタンが押されます。通常はすべてうまくいきますが、キャッシュを作成しようとすると、不一致エラーがあるというエラーが表示されます。私の理解では、ピボット キャッシュを作成するときに文字列とバリアントをソース データとして渡すことができますが、以前に以下のコードを何度か繰り返したので、今まで問題はありませんでした。


Private Function createPivotTable(ByRef sheetName As Variant, ByVal sheetNum As Integer)

Dim DataRange As Range
Dim pivotTableCache As PivotCache
Dim pivotTableReport As PivotTable

ActiveWorkbook.Worksheets("EXAMPLE SHEET").Activate
Range("A1").Select
Set DataRange = Selection.CurrentRegion

Worksheets.Add.Name = sheetName

Set pivotTableCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, _ 
      SourceData:=DataRange)
Set pivotTableReport = pivotTableCache.createPivotTable(TableDestination:=ActiveWorkbook.Worksheets(sheetName).Range("A1"), _
TableName:="PVR")

.... 

だから私は本質的に立ち往生しています。ここで同様の問題を回避する別のスレッドを見つけました。最も評価の高いコメントは、範囲の場所に沿って文字列として渡したときに不一致がなくなったという点で、1 つの問題を解決しましたが、実際のテーブル自体を作成しようとすると、1004 エラーが発生し続けました。複数のデータ行を選択する必要があること (私が解釈できるものから-悲しいことに、エラーコードのメッセージボックスが行を切り取っていますが、これはちょっとおかしいです)。しかし、再確認したところ、選択は実際にテーブル全体 (6 列すべてと 1000 行) を取得します。

助けや正しい方向への指摘をいただければ幸いです。

*検証します; ユーザーにワークシートに名前を付けるように求める入力ボックスを使用するため、文字列ではなくバリアントとして sheetName を渡します。フェイル セーフとして、入力ボックスのハンドルをバリアントとして指定すると、ユーザーがワークシートをキャンセルしたかどうかを確認できます。操作 (空白文字列の代わりに false の値を返します)。

4

2 に答える 2

2

適切な範囲が特定されているように見えますが、範囲がデータを含むシートを参照していないため、データが見つかりません。あなたは試してみたいかもしれません:

Private Function createPivotTable(ByRef sheetName As Variant, ByVal sheetNum As Integer)

   Dim pivotTableCache As PivotCache
   Dim pivotTableReport As PivotTable

   Worksheets.Add.Name = sheetName

   Set pivotTableCache = ActiveWorkbook.PivotCaches.Create(xlDatabase, _ 
     SourceData:=Sheets("EXAMPLE SHEET").Range("A1").CurrentRegion)
   Set pivotTableReport = pivotTableCache.createPivotTable( _
     TableDestination:=ActiveWorkbook.Worksheets(sheetName).Range("A1") _
     , TableName:="PVR")

   .... 
于 2013-03-06T03:54:46.190 に答える
0

少し遅れていますが、同様の問題に遭遇したため、私の解決策が他の人に役立つかもしれません。

まず、マイクロソフトのドキュメントには次のように書かれています。

「範囲を渡すときは、文字列を使用してワークブック、ワークシート、およびセル範囲を指定するか、名前付き範囲を設定して名前を文字列として渡すことをお勧めします。範囲オブジェクトを渡すと、「型の不一致」エラーが発生する場合があります意外と。」

したがって、私の経験では、範囲オブジェクトを渡すとほとんどの場合問題なく動作しますが、型の不一致が返されることがあります。「予期せぬ」結末は、非常に単純な回避策に私を駆り立てたものです。アクティブシートがデータシートである場合にのみメソッドが DataRange.Address を受け入れることがわかったので、次のようにします。

DataRange.Worksheet.Activate()
cache = ActiveWorkbook.PivotCaches().Create(1, DataRange.Address, 6)
pivot = cache.CreatePivotTable(destination, name, True, 6)

pywintypes を使用して Python でこれを行っていることに注意してください。そのため、VBA ではおそらく括弧なしで「.Activate」になり、オブジェクト変数が宣言および設定されます。

CreatePivotTable メソッドの「destination」は範囲オブジェクトで、今のところ問題ありませんでした。

于 2018-08-21T17:58:31.530 に答える