• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数シート、計算範囲が可変でのピボットテーブルマクロ)

複数シート、計算範囲が可変でのピボットテーブルマクロ

このQ&Aのポイント
  • 初めてのマクロで困っています。エラーメッセージは、実行時エラー '13': 型が一致しません。すみませんが、どなたかご指摘お願いします。
  • マクロの目的は、複数のシートで計算範囲が可変のピボットテーブルを作成することです。
  • マクロの途中で取得したテキストファイルのデータを使用してピボットテーブルを作成しています。

質問者が選んだベストアンサー

  • ベストアンサー
  • pauNed
  • ベストアンサー率74% (129/173)
回答No.1

こんにちは。 複数シートからのピボットのSourceDataは、 R1C1形式アドレスの『配列』である事が必要のようです。 文字列をArray()に入れるのではなく、素直に配列に格納したほうが良さそう。 Sub sample()   Dim ws As Worksheet 'For Each...Next WorksheetsLoop用   Dim r  As Range   '検索結果セル格納用   Dim rs As Range   '各Sheetピボット元データ範囲格納用   Dim v  As Variant  'アドレス,Sheet名格納用Array   Dim x() As Variant  'Arrayをさらに格納する配列   Dim i  As Long   '該当Sheetカウントアップ用(配列サイズ変更)   ActiveSheet.UsedRange.Clear   For Each ws In Worksheets     With ws       If Not ws Is ActiveSheet And .Name <> "template" Then         Set r = .Cells.Find(What:="業務名", _                   After:=.Cells(2, 2), _                   LookIn:=xlFormulas, _                   LookAt:=xlPart, _                   SearchOrder:=xlByRows, _                   SearchDirection:=xlNext, _                   MatchCase:=False, _                   MatchByte:=False)         If Not r Is Nothing Then           Set rs = .Range(.Cells(r.Row, 3), .Cells(Rows.Count, 19).End(xlUp))           v = VBA.Array(rs.Address(1, 1, xlR1C1, True), .Name)           ReDim Preserve x(0 To i)           x(i) = VBA.Array(v(0), v(1))           i = i + 1           Set r = Nothing           Set rs = Nothing         End If       End If     End With   Next ws   'ピボット計算-------   With ThisWorkbook.PivotCaches.Add(SourceType:=xlConsolidation, _                    SourceData:=x) _            .CreatePivotTable(TableDestination:=Range("A11"), _                     TableName:="ピボットテーブル1")     .DataFields(1).Function = xlSum   End With End Sub ちなみに検索範囲がC列限定なら、データ範囲を確定させる部分は下記でも。 Set r = .Columns("C").Find(What:="業務名", _               After:=.Cells(3), _               LookIn:=xlFormulas, _               LookAt:=xlPart, _               SearchOrder:=xlByRows, _               SearchDirection:=xlNext, _               MatchCase:=False, _               MatchByte:=False) Set rs = .Range(r, .Cells(Rows.Count, 19).End(xlUp))

sarasa0611
質問者

お礼

pauNedさん こんばんは。 できました! ありがとうございました! データ型としてrangeを指定したり、VBA.Arrayなどは 本には載っていないし、初心者には難しい部分だったようですね。 大変勉強になりました。 教えていただいたソースは全て理解はまだできていませんが じっくり考えて理解して使えるようになりたいと思います。 自分の書いたソースは回りくどく、美しくありませんでしたが こんなにすっきりと簡潔にできるのですね。 本当に、どうもありがとうございました。

関連するQ&A