dポイントプレゼントキャンペーン実施中!

ピポットをマクロに自動登録しました。ところが作動するとデバックが起きてしまいます。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

A 回答 (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
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/22 19:05

エラーの内容(エラー番号、メッセージ)とか、状況(例えば1回目は


上手くいくのに2回目は失敗するとか)の説明がないと回答側にはエラー
の原因がつかめません。

なぜなら、コードには問題がなく、シート上のデータ側に問題があるなど
コード上では読み取れない原因があるのかもしれないからです。
そのため、少なくともこのような情報の提供が必要なのです。

で、気になる点を。

> [集計(1).xls]answer!R1C1

という表記はおかしくないですか?単に answer!R1C1 にしてみたら?
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/09/22 19:07

> ところが作動するとデバックが起きてしまいます。



どの行でエラーになるのかを書かないと。。それから、どのような状況で
エラーになるのかの説明、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("性別")

この回答への補足

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

よろしくお願いします。

補足日時:2007/09/21 18:53
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!