• ベストアンサー

ピポットをマクロ登録したのですが

ピポットをマクロに自動登録しました。ところが作動するとデバックが起きてしまいます。VBAに特別なプログラムを付け加える必要があるのでしょうか? 初心者なので勉強不足のところが多いのですが、どうかよろしくお願いします。 なお、シートは3枚で「data」「number」「answer」があり、「data」には価格の情報がないので、「number」シートからvlookupで情報を拾ってきています。ピポットは「answer」シートに作り、値の貼り付けをしてセルA1の列幅を20にしています。 Range("D1").Select ActiveCell.FormulaR1C1 = "担当"    ActiveCell.Characters(1, 2).PhoneticCharacters = "タントウ" Range("D2").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C1:R92C1,number!R2C1:R109C2,2,0)"   Selection.AutoFill Destination:=Range("D2:D92"), Type:=xlFillDefault Range("D2:D92").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A2").Select Application.CutCopyMode = False ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ "data!R1C1:R92C4").CreatePivotTable TableDestination:="[集計(1).xls]answer!R1C1" _ , TableName:="ピボットテーブル1", DefaultVersion:=xlPivotTableVersion10 With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("性別") .Orientation = xlColumnField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("商品番号") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("担当") .Orientation = xlRowField .Position = 1 End With ActiveSheet.PivotTables("ピボットテーブル1").PivotSelect "商品番号[All]", xlLabelOnly, _ True Range("B2").Select ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("商品番号").Orientation = _ xlHidden ActiveSheet.PivotTables("ピボットテーブル1").AddDataField ActiveSheet.PivotTables( _ "ピボットテーブル1").PivotFields("価格"), "合計 / 価格", xlSum Columns("A:A").Select Selection.ColumnWidth = 20 Cells.Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub

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

  • ベストアンサー
  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.3

こんにちは。 作った集計表を数値化していますが、 TableName:="ピボットテーブル1" のピボットテーブルが存在するとか、TableDestination:="[集計(1).xls]answer!R1C1"のブック名が異なっているとか、確認してみてください。 省略できる引数もあるので、ヘルプファイルを活用して、分からないコードは調べるクセをつけるといいですよ。 作成先のシートを指定している場合は、 一旦、シートのセルをクリアしてから作成するのが常套手段だと思います。 また、複数のピボットテーブルを操作するのでなければ、 名前を省略して、INDEXで指定してあげると処理がすっきりします。 また、ピボットテーブルの作成は、手作業での手順が把握できたら、 ウィザード3/3のレイアウトで組むようにするといいです。 ワークシートで組むのと違ってすっきりしたコードが書けます。 記録したコードの編集ですが、 ほとんど場合、□.Select、Selection.△と続く処理は、□.△というようにつないで書くことができます。画面のちらつきもなくなりますし、 処理が早くなります。ぜひコードの編集にチャレンジしてください。 下に、サンプルを掲示しますので、F8でステップ実行しながら、 murasakishさんの処理の参考にしてみてください。 Sub 例えば() With Worksheets("data")   .Range("D1").Value = "担当"   With .Range("D2")     .FormulaR1C1 = "=VLOOKUP(R2C1,number!R2C1:R109C2,2,0)"     .AutoFill Destination:=.Parent.Range("D2:D92"), Type:=xlFillDefault   End With   With .Range("D2:D92")     .Copy     .PasteSpecial Paste:=xlPasteValues, _       Operation:=xlNone, SkipBlanks:=False, Transpose:=False   End With   Application.Goto Reference:=.Range("A2") End With Worksheets("answer").Cells.Clear ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, _   SourceData:=Worksheets("data").Range("A1").CurrentRegion.Address(External:=True)) _   .CreatePivotTable TableDestination:=Worksheets("answer").Range("A1") With Worksheets("answer")   .Activate   With .PivotTables(1)     .PivotFields("商品番号").Subtotals(1) = False     .AddFields RowFields:=Array("商品番号", "担当"), ColumnFields:="性別"     .PivotFields("価格").Orientation = xlDataField     With .TableRange1       .Copy       .PasteSpecial Paste:=xlPasteValues, _         Operation:=xlNone, SkipBlanks:=False, Transpose:=False       Application.CutCopyMode = False       .Interior.ColorIndex = xlNone       Application.Goto Reference:=.Range("A1")     End With   End With   .Columns("A:A").ColumnWidth = 20 End With End Sub

murasakish
質問者

お礼

ご丁寧にありがとうございます。参考にさせていただいたら動くようになりました。F8でのステップ実行、これから習慣にします。

その他の回答 (2)

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

エラーの内容(エラー番号、メッセージ)とか、状況(例えば1回目は 上手くいくのに2回目は失敗するとか)の説明がないと回答側にはエラー の原因がつかめません。 なぜなら、コードには問題がなく、シート上のデータ側に問題があるなど コード上では読み取れない原因があるのかもしれないからです。 そのため、少なくともこのような情報の提供が必要なのです。 で、気になる点を。 > [集計(1).xls]answer!R1C1 という表記はおかしくないですか?単に answer!R1C1 にしてみたら?

murasakish
質問者

お礼

自動記録で作ったので可笑しいところには気がつきませんでした。これでも実行されましたので、ここが原因ではなかったようですが…。今後のこともありますので覚えるようにします。ありがとうございました。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.1

> ところが作動するとデバックが起きてしまいます。 どの行でエラーになるのかを書かないと。。それから、どのような状況で エラーになるのかの説明、Excel や OS のバージョン等も書かないと。。 試してないけど、とりあえず気づいた部分です。 ■ [追加] 1行目にシートのアクティブ化コード Range("D1").Select ActiveCell.FormulaR1C1 = "担当"    ↓ Worksheets("data").Activate Range("D1").Select ActiveCell.FormulaR1C1 = "担当" ■ [修正]VLOOKUP 関数の第一引数がヘン ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C1:R92C1,number!R2C1:R109C2,2,0)"    ↓ ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C1,number!R2C1:R109C2,2,0)" ■ [追加] シートのアクティブ化コード With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("性別") ↓ Worksheets("answer").Activate With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("性別")

murasakish
質問者

補足

Excel2003です。失礼しました。VBA用に書き直しました。デバックが起きるのは※の部分です。 Dim L As Integer Worksheets("data").Activate Range("D1").Select ActiveCell.FormulaR1C1 = "担当" Range("D2").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C1,number!R2C1:R109C2,2,0)" Selection.AutoFill Destination:=Range("D2:D92"), Type:=xlFillDefault Range("D2:D92").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A2").Select Sheets("answer").Select Range("A1").Select Worksheets("answer").Activate ※ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ "data!R1C1:R92C4").CreatePivotTable TableDestination:="[集計(1).xls]answer!R1C1" _ , TableName:="ピボットテーブル1", DefaultVersion:=xlPivotTableVersion10 With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("性別") Worksheets("answer").Activate .Orientation = xlColumnField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("商品番号") .Orientation = xlRowField .Position = 1 End With With ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("担当") .Orientation = xlRowField .Position = 1 End With ActiveSheet.PivotTables("ピボットテーブル1").PivotSelect "商品番号[All]", xlLabelOnly, _ True Range("B2").Select ActiveSheet.PivotTables("ピボットテーブル1").PivotFields("商品番号").Orientation = _ xlHidden ActiveSheet.PivotTables("ピボットテーブル1").AddDataField ActiveSheet.PivotTables( _ "ピボットテーブル1").PivotFields("価格"), "合計 / 価格", xlSum Columns("A:D").Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Range("A21").Select End Sub よろしくお願いします。

関連するQ&A

専門家に質問してみよう