Excel VBAで表組みしたらデバック発生

このQ&Aのポイント
  • Excel VBAを使用して表を作成しようとすると、実行時エラーが発生します。
  • マクロを記録したブックを再度開いて表を作成しようとすると、インデックスが有効範囲にないというエラーメッセージが表示されます。
  • 特に、9行目の記述Windows("Book1").Activateに問題があるようですが、正しい記述はわかりません。Excel VBAに詳しい方、教えていただけませんか?
回答を見る
  • ベストアンサー

Excel VBAで表組みしたらデバック発生

Excel VBAの初心者です。Windows Vistaで Excel2007を使っています。 表をマクロの実行で作成したいと思っています。 何もないエクセルブックより 「開発」→「マクロの記録」→「相対参照」 →「表の作成」→「記録終了」→「相対参照で記録の解除」 →「エクセルマクロ有効ブックで保存」 ところがこのマクロ記録が入ったブックを再度立ち上げ、 表をオールクリアにし、マクロボタンより表作成を実行 させようとすると、次のエラーメッセージがでました。 『実行時エラー'9' インデックスが有効範囲にありません。』 デバックからModule1をみると以下の記述となっていました。 Sub 表組み() ' ' 表組み Macro ' ' ActiveCell.Range("A1:E5").Select Selection.Copy Windows("Book1").Activate ActiveSheet.Paste ActiveCell.Columns("A:A").EntireColumn.Select ActiveCell.Rows("1:1").EntireRow.RowHeight = 11.25 ActiveCell.Rows("1:5").EntireRow.Select Selection.RowHeight = 21.75 ActiveCell.Columns("A:A").EntireColumn.ColumnWidth = 14.88 ActiveCell.Offset(0, 4).Range("A1").Select Application.CutCopyMode = False With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With ActiveCell.Offset(1, -3).Range("A1:D4").Select Selection.NumberFormatLocal = "#,##0_ " ActiveCell.Select ActiveCell.FormulaR1C1 = "78000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "102000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "9800" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "65000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "204000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "500" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "86000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "151000" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "10200" ActiveCell.Offset(-2, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(RC[-3]:RC[-1])" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-1]C)" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, -3).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(0, 1).Range("A1").Select ActiveCell.FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)" ActiveCell.Offset(-4, -2).Range("A1:D1").Select Selection.AutoFilter End Sub 上から9行目(?)のWindows("Book1").Activateに 黄色い矢印が示され、また行全体が黄色く四角に 覆われていました。 おそらくこの記述に問題があると思いますが、 どんな記述に変えたらいいのか分かりません。 Excel VBAにお詳しい方ご教示願います。 なお、マクロで作成したい図を添付いたします。 参考にしていただければ幸いです。

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

  • ベストアンサー
  • ap_2
  • ベストアンサー率64% (70/109)
回答No.2

前回はエラー原因だけで、処理はちゃんと見てませんでした^^; 最前面のブックのA1~E5を選択 ActiveCell.Range("A1:E5").Select 選択範囲をコピー Selection.Copy 別のブック"Book1"を最前面に開く Windows("Book1").Activate 最前面のブックに貼り付け ActiveSheet.Paste 以下、表の中の数字・計算式を入力する処理 … >補足 1&2.上記の通り、2つのブック(Excelファイル)間で表をコピーして、表の中身だけ書き換えるマクロになっています。どうも期待する処理じゃなさそうですね… 3.オールクリアした=コピー元が無いので、表の数値入力だけ行われているのかな。 記録機能は、あくまで同じ操作を繰り返すだけです。コピーをする場合、当然ながらコピー元のデータが必要です。ファイルを切り替える場合は、ファイル名が固定になってしまうので、改造が必要になります。 …ということで、添付図通りの表をボタンひとつで作りたいなら、「まっさらなシートに表を作る」過程を記録しないとダメです。作ってみました↓ ※読み易いよう、記録に手を加えてあります。 Sub Macro1()  '表の範囲選択。Selectionは選択範囲  Range("A1:E5").Select  '罫線を設定  Selection.Borders(xlDiagonalDown).LineStyle = xlNone  Selection.Borders(xlDiagonalUp).LineStyle = xlNone  Selection.Borders(xlEdgeLeft).LineStyle = xlContinuous  Selection.Borders(xlEdgeTop).LineStyle = xlContinuous  Selection.Borders(xlEdgeBottom).LineStyle = xlContinuous  Selection.Borders(xlEdgeRight).LineStyle = xlContinuous  Selection.Borders(xlInsideVertical).LineStyle = xlContinuous  Selection.Borders(xlInsideHorizontal).LineStyle = xlContinuous  '書式設定  Range("A1:E5").VerticalAlignment = xlCenter '縦位置  Range("B1:E1").HorizontalAlignment = xlCenter '横位置  Range("B2:E5").NumberFormatLocal = "#,##0_ " '数値書式  Range("B1:E4").AutoFilter 'オートフィルタ  Columns("A:A").ColumnWidth = 14.88 '幅  Rows("1:5").RowHeight = 21.75 '高さ  '表の中(Formulaは計算式)  Range("A1") = "品名"  Range("A2") = "乳製品"  Range("A3") = "栄養ドリンク"  Range("A4") = "清涼飲料"  Range("A5") = "合計"  Range("B1") = "営業一課"  Range("C1") = "営業二課"  Range("D1") = "営業三課"  Range("E1") = "合計"  Range("B5").Formula = "=SUM(B2:B4)"  Range("C5").Formula = "=SUM(C2:C4)"  Range("D5").Formula = "=SUM(D2:D4)"  Range("E5").Formula = "=SUM(E2:E4)"  Range("E2").Formula = "=SUM(B2:D2)"  Range("E3").Formula = "=SUM(B3:D3)"  Range("E4").Formula = "=SUM(B4:D4)"  '値の入力も必要?  Range("B2") = 78000  Range("B3") = 102000  Range("B4") = 9800  Range("C2") = 65000  Range("C3") = 204000  Range("C4") = 500  Range("D2") = 86000  Range("D3") = 151000  Range("D4") = 10200 End Sub こんな感じですか?このまま使うワケじゃないでしょうし、補足いただければ直しますよ。

dradra33
質問者

補足

たびたびのご回答ありがとうございます。 >1&2.上記の通り、2つのブック(Excelファイル)間で表をコピーして、 表の中身だけ書き換えるマクロになっています。どうも期待する処理じゃ なさそうですね… 1&2.ご指摘の通りです。 『10日で覚えるExcelVBA入門教室』という本の最初の方の 例題をやっているため、別のブックを立ち上げて そこからでも同じマクロを実行する記述ではないようですね。 それはこれから勉強してできるようにします。 3.ご回答のコードをコピペしてご説明の部分を 削除したら、表ができました。また違うシートにも マクロを実行することができました。ありがとうございます。 最後に一つ質問です。 コードをそのままコピーしたときご説明の日本語部分は エディターの中で緑色になっていましたが、これは 削除した方がいいですよね? 三度にわたる質問ですが、よろしくお願いします。

その他の回答 (2)

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.3

なるほど、勉強目的でしたか。10日で覚える懐かしいですね、僕も立ち読みした記憶がありますw 「'」からその行の最後までは、コメント(緑色)になります。残しておいて構いません。複雑なマクロを作る場合は、コメントがあると何の処理かわかりやすいので、積極的に書き足していくといいですよ。 このさき、記録だけじゃなく、コードを自分で書くようにもなっていくと思います。慣れるまでは悩みも多いと思いますが、VBAはそれほど難しいモノじゃないので、がんばってください! |_・)ノシ またお会いしましょう

dradra33
質問者

お礼

たびたびご丁寧なアドバイスありがとうございます。 毎日ちょっとずつ勉強して、早く表計算の自動処理が できるようになりたいです。

  • ap_2
  • ベストアンサー率64% (70/109)
回答No.1

> インデックスが有効範囲にありません データや、シートが見つからない時に発生するエラーです。 > 上から9行目(?)のWindows("Book1").Activateに ということは、"Book1"が無いんじゃないかな? セルをコピーし、Book1に切り替えて、貼り付けを行ってます。この処理が不要なら削除、必要ならブック名を直してください。 1操作毎に記録内容を見ることも、F8キーで1行ずつ実行することもできます。各行の意味を調べるのは難しくないと思うので、不要な部分は削除しちゃうといいですよ。

dradra33
質問者

補足

早速のご回答ありがとうございます。 ご回答について3点質問事項があります。 まだはじめて4日目なのでap_2さんの ご回答の内容をよく理解できず恐縮です。 1.「セルをコピーし、Book1に切り替えて、貼り付けを行ってます」 この作業は、単にエクセルを立ち上げて、「表をコピペする」 という意味でしょうか? 2.1で「表をコピペする」した後、シートの内容をオールクリアに した後、マクロを実行することによって同一の表を作成するには どうすれば良いでしょうか? 3.Module1のWindows("Book1").Activateを削除した後、 シートの内容をオールクリア、再度マクロを実行すると フィルタ機能と表の数字の部分だけが残り、品目名や 課名、罫線は作成されませんでした(質問の画像を参照 してください)。これはなぜでしょうか?

関連するQ&A

  • EXCELのマクロについて

    お世話になっております。 以下のマクロを1万行分繰り返したいのですが、回数を1万回と指定する構文を 教えてください。よろしくお願いします。 Sub Macro16() ' ' Macro16 Macro ' ' Keyboard Shortcut: Ctrl+Shift+Z ' ActiveCell.Offset(1, 0).Rows("1:1").EntireRow.Select Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove ActiveCell.Offset(-1, 0).Range("A1:M1").Select Selection.Copy ActiveCell.Offset(1, 0).Range("A1").Select ActiveSheet.Paste ActiveCell.Offset(-1, 2).Range("A1").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "7/5/1905" ActiveCell.Offset(1, 0).Range("A1").Select ActiveCell.FormulaR1C1 = "7/6/1905" ActiveCell.Offset(1, -2).Range("A1").Select End Sub

  • エクセルマクロでの参照方法の変更

    久々にエクセルのマクロで手直しが必要になりました。 色々調べましたが、判らなくて質問致します。 以下のマクロでAJ6に検索キーを作成しています。 Range("C5").Select 行 = Selection.End(xlDown).Row Range("AJ6").Select ActiveCell.FormulaR1C1 = "=RC[-35]&"" ""&RC[-34]&"" ""&RC[-33]&"" ""&RC[-32]" Selection.AutoFill Destination:=Range("AJ6:AJ" & 行) Range(Selection, Selection.End(xlDown)).Select Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks :=False, Transpose:=False ActiveSheet.Paste Application.CutCopyMode = False Range("A5").Select の様にRC[-35]ではなく$A6の様に絶対参照?にしたいのです 理由として間の列が追加になるたびにRC[-35]の数値の増減しないといけないので手間が掛かります。 列を増やしても$A6の様に固定ってできないでしょうか?

  • エクセルVBAでの関数

    下記、コードでセルに関数を入れるようにしてるのですが 関数で得られた値をセルに反映されるようにしたいのですが Dimを使用してもどう指定してよいのかわからず苦戦しております。 宜しくお願い致します。 Range("F1").Select Do Until ActiveCell.Offset(0, -1).Value = ""       With ActiveCell .FormulaR1C1 = "=MID(RC[-1],2,3)" .Offset(1, 0).Select End With Loop Range("A1").Select Do Until ActiveCell.Offset(0, 2).Value = "" With ActiveCell .FormulaR1C1 = "=RC[11]&RC[5]&Rc[8]&rc[9]&rc[3]" .Offset(1, 0).Select End With Loop

  • VBAでVlookupを使って

    いつもお世話になっています。 VBAで現場検索登録シートと言うところに 一覧シートからVlookupを使って 表示させようと思い作りました。 エラーも何もでません。 ただ、表示されるものがちゃんと検索されるものと まったくされないものがあります。 Vlookupはマクロの記録から作ったものです。 原因がわかりません。 よろしくお願い致します。 '検索ボタン Private Sub CommandButton6_Click() '送り方 Range("C4:D4").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,22,FALSE)" Selection.Value = Selection.Value '封筒 Range("C5:D5").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,23,FALSE)" Selection.Value = Selection.Value '得意先名ふりがな Range("C6:F6").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,6,FALSE)" Selection.Value = Selection.Value '得意先名 Range("C7:F8").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,4,FALSE)" Selection.Value = Selection.Value '現場名ふりがな Range("C9:H11").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,9,FALSE)" Selection.Value = Selection.Value '現場名 Range("C10:H11").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(R2C5,一覧!R5C1:R2000C54,7,FALSE)" Selection.Value = Selection.Value End Sub エラーも何もなく、ちゃんと動くことは動きます。 検索結果が、検索コードによって違うのです。 よろしくお願い致します

  • Excel VBAについて

    以下のコードをFor Nextでまわすには どうしたらよいでしょうか? Sub sample() Range("A2").Select ActiveCell.FormulaR1C1 = "=テスト!R[1]C" Range("A3").Select ActiveCell.FormulaR1C1 = "=テスト!R[3]C" Range("A4").Select ActiveCell.FormulaR1C1 = "=テスト!R[5]C" Range("A5").Select ActiveCell.FormulaR1C1 = "=テスト!R[7]C" Range("A6").Select ActiveCell.FormulaR1C1 = "=テスト!R[9]C" Range("A7").Select ActiveCell.FormulaR1C1 = "=テスト!R[11]C" End Sub

  • エクセルVBAが書ける方へ

    お世話になります。 下記VBAはB19からB28までのデータをA11:12の横列に貼り付けさせる内容です。 Sub 特価() ' ' 特価 Macro ' ' Range("A11:A12").Select ActiveCell.FormulaR1C1 = "=R[8]C[1]" Range("B11:B12").Select ActiveCell.FormulaR1C1 = "=R[9]C" Range("C11:C12").Select ActiveCell.FormulaR1C1 = "=R[10]C[-1]" Range("F11:F12").Select ActiveCell.FormulaR1C1 = "=R[11]C[-4]" Range("H11:I12").Select ActiveCell.FormulaR1C1 = "=R[12]C[-6]" Range("T11:U12").Select ActiveCell.FormulaR1C1 = "=R[13]C[-18]" Range("X11:Y12").Select ActiveCell.FormulaR1C1 = "=R[14]C[-22]" Range("AD11:AE12").Select ActiveCell.FormulaR1C1 = "=R[15]C[-28]" Range("AN11:AO12").Select ActiveCell.FormulaR1C1 = "=R[16]C[-38]" Range("AW11").Select ActiveCell.FormulaR1C1 = "=R[17]C[-47]" Range("B23").Select End Sub これに下記内容を追加したいのですが教えて下さい。 ・B19からB28のデータは入力後消す。 ・貼り付けたら次に入力する時は下の行(A13:14)に貼り付ける。 ・同様にデータを消してA15:16に貼り付ける。以下、下の行に貼り付けていくようにする。 ・貼り付けたらカーソルはB19を選択した状態にする。 言葉足らずでしたら補足します。 何卒宜しくお願い致します。

  • エクセル マクロ VBA について

    以下はセルB2.C2.D2.E2.F2をアクティブセルから右方向へ入力しています。ここでの入力とは"=" + "セルB2" というものです。一つずつ入力している為マクロが長くなります。短くシンプルなものにしたいです。ご教示お願いします。 ActiveCell.FormulaR1C1 = "=R2C2" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C3" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C4" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C5" ActiveCell.Offset(0, 1).Select ActiveCell.FormulaR1C1 = "=R2C6"

  • 文字列を連続で置き換え・・・・?

    マクロを記録したんですが手直しして繰り返しと空白のセル内が見つかった場合 繰り返しを終わらせワードパッドにコピーして保存終了させたいんですがわかりません? 誰か教えてください。 ' ' Macro2 Macro ' マクロ記録日 : 2012/4/21 ユーザー名 : cocoro ' ' Range("E:E").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""#"",RC[-4])" Range("F1").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""$"",RC[-4])" Range("G1").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""&"",RC[-4])" Range("E2").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""#"",RC[-4])" Range("F2").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""$"",RC[-4])" Range("G2").Select ActiveCell.FormulaR1C1 = "=SUBSTITUTE(RC[-1],""&"",RC[-4])" Columns("G:G").Select Selection.Copy Columns("H:H").Select Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _ xlNone, SkipBlanks:=False, Transpose:=False Columns("H:H").Select ActiveWindow.SmallScroll Down:=-6 Application.CutCopyMode = False Selection.Copy End Sub

  • Excel VBA 計算範囲の変更について教えてください。

    こんばんは。とても困っています。 下記のような表で=A1&B1&C1の計算式を入れ、A1とB1を絶対参照にして$A$1&$B$1&C1としてD3までオートフィルをかけます。 そしてD4は =$A$4&$B$4&C4のように絶対参照しているセルを変更したいのです。たくさんありすぎて参照する範囲を変更するのにとても大変な思いをしています。VBAでどのようにすればよいのか教えてください。   |A    B   C     D ------------------------------------- 1| 1T  11L   A    1T11LA (=$A$1&$B$1&C1) 2|          B    1T11LB (=$A$1&$B$1&C2) 3|          C    1T11LC (=$A$1&$B$1&C3) 4| 2T  20L   A    2T20LA (=$A$4&$B$4&C4) 5|          B     2T20LB (=$A$4&$B$4&C5) 6|          C    2T20LC (=$A$4&$B$4&C6) 7| 3T  31M   A    3T31MA (=$A$7&$B$7&C7) 8|          B     3T31MB (=$A$7&$B$7&C8) マクロで記録させたらところ下記のようになりました。 Sub 4行置きに参照範囲を変更する() Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "=RC[-3]&RC[-2]&RC[-1]" Range("D1").Select ActiveCell.FormulaR1C1 = "=R1C1&R1C2&RC[-1]" Range("D1").Select Selection.AutoFill Destination:=Range("D1:D3"), Type:=xlFillDefault Range("D1:D3").Select Range("D4").Select ActiveCell.FormulaR1C1 = "=R4C1&R4C2&RC[-1]" Range("D4").Select Selection.AutoFill Destination:=Range("D4:D6"), Type:=xlFillDefault Range("D4:D6").Select Range("D7").Select ActiveCell.FormulaR1C1 = "=R7C1&R7C2&RC[-1]" Range("D7").Select Selection.AutoFill Destination:=Range("D7:D9"), Type:=xlFillDefault Range("D7:D9").Select End Sub ◎初心者なのでVBAにたくさんコメントを入れていただくと助かります。 宜しくお願い致します。

  • エクセルVBAの保存

    毎月異なった新しいエクセルファイルに同じような加工を施すため、VBAを書きました。対象はActivesheetとしています。 で、質問は、この新しいエクセルファイルの標準モジュールにいちいちこのVBAをコピーペーストせずに実行する方法です。 きっと何かあるとは思うのですが・・・・。 VBAは次のような簡単なものです。 Sub 加工1() Dim e As Integer, s As String, n As String e = Range("A4").End(xlDown).Row s = Replace(Mid(Range("A2"), 8, 5), "年", "") & "-" n = Replace(Mid(Range("A2"), 19, 5), "年", "") & "-" Range("A1:C2").MergeCells = False Columns("B:B").Select Selection.Insert Shift:=xlToRight Columns("A:A").Select Selection.Insert Shift:=xlToRight Columns("C:C").Select Selection.NumberFormatLocal = "G/標準" Range("B3").Select Selection.AutoFill Destination:=Range("B3:C3"), Type:=xlFillDefault Range("B3").Select ActiveCell.FormulaR1C1 = "商品番号1" Range("C4").Select ActiveCell.FormulaR1C1 = "=LEFT(RC[-1],10)" Range("C4").Select Selection.AutoFill Destination:=Range("C4:C" & e), Type:=xlFillDefault Range("A3").Select ActiveCell.FormulaR1C1 = "抽出年月日" Range("A4").Select ActiveCell.FormulaR1C1 = s & n & 1 Range("A4").Select Selection.AutoFill Destination:=Range("A4:A" & e), Type:=xlFillDefault Rows("3:3").Select Selection.Insert Shift:=xlDown Range("B1:E1").MergeCells = True Range("B2:E2").MergeCells = True ActiveSheet.Name = "提出用" End Sub