EXCEL VBAの書き方|VBA初心者のための基本解説

このQ&Aのポイント
  • EXCEL VBAの書き方について詳しく解説します。EXCEL2003を使用している初心者の方向けに、数式の中のパラメータの書き方やループ処理についてわかりやすくご説明します。具体的な例を示しながら、VBAの基本的な文法やエラーの対処法も紹介します。
  • 単純な計算をR1C1形式の数式を使ってFOR文でループさせる方法についてお困りの方がいらっしゃいます。この記事では、例題を用いながら詳細に解説しています。また、セルへの数式の入力方法や引用符の使い方も説明しています。
  • 具体的なVBAのコード例を示しながら、異なる書き方によるエラーの発生原因や対処法についても解説しています。ヘルプに載っている情報だけでは理解できない方でも、分かりやすく解説していますので、ぜひ参考にしてください。
回答を見る
  • ベストアンサー

EXCEL VBAの書き方

EXCEL VBAの初心者です。 EXCEL2003を使っています。 数式の中のパラメータの書き方が分からず困っています。 具体的には、単純な計算をR1C1形式の数式を使い、FOR文でループを回そうとしました。 この際、例えば以下のようなVBAを、試行錯誤の結果やっと動くようにはなりましたが、とくに「"」(ダブルクォーテーション)の使い方が理解できていません。 NGだった理由、OKとなった理由を、すみませんがお分かりの方教えていただけないでしょうか。 (ヘルプを読んでも残念ながら理解できる程のレベルを持っていません。) やりたいこと:例えば単純な引き算を複数のセルに、ループをまわして設定したい。 --------------- Sub 質問() Dim i As Integer ' "A1"との差を求めるVBA→ "B2"から"E2"に数式入力 For i = 2 To 5 Cells(2, i).Select ' (1)問題の行→これはOKの例 ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c[" & 1 - i & "]" Next i End Sub --------------- ' (2)問題の行→実行時エラー'1004' ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c[1 - i]" --------------- ' (3)問題の行→コンパイルエラー(構文エラー) ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c["1 - i"]" --------------- ' (4)問題の行→コンパイルエラー(構文エラー) ActiveCell.FormulaR1C1 = "=r[-1]c-r[-1]c["&1 - i&"]" ---------------

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

  • ベストアンサー
  • okormazd
  • ベストアンサー率50% (1224/2412)
回答No.3

(1) 入力されたセルの数式を見ればわかるが、"  "で囲まれた部分はそのまま文字列として入ります。「&」は文字列接続の演算子です。" "で囲まれていない部分は、計算されて接続されます。 したがって、 i=2で、     =r[-1]c-r[-1]c[  と、(1-i=1-2=) -1 と、 ] がつながって、 =r[-1]c-r[-1]c[-1]になります。これはワークシートの数式として有効なのでOKです。 i=3なら、=r[-1]c-r[-1]c[-2] になります。 (2) "   "で囲まれた文字列がそのまま入るのですが、=r[-1]c-r[-1]c[1 - i] という式では、i が文字列の中なので計算されません。ワークシートの数式では計算できない数式ですが、VBAで定義されていないエラーなので、実行時エラーになると思います。(3) 。" "で囲まれた部分は文字列としても、それで囲まれていない 1 - i は何のことかわかりません。仮に(1)のように計算されたとしても、それぞれがバラバラにあるだけで、数式としての構文にはなりません。コンパイラはどうしていいかわからないので す。 (4) 文字列接続の演算子 & は、ワークシートでは半角空白はなくてもエラーにならないが、VBAでは、半角空白を前後に入れないとエラーになります。

helpokwave
質問者

お礼

お礼が遅くなり申し訳ありませんでした。 ""で囲まれていない部分のご説明も有り、また全体的に詳細なご説明をしていただき、良く理解できました。 ご回答をして頂いた皆さんに感謝申し上げます。これですっきりしました。

その他の回答 (2)

  • watabe007
  • ベストアンサー率62% (476/760)
回答No.2

「"」(ダブルクォーテーション)の使い方はANo.1さんがされていますので R1C1の絶対参照について この場合A1セルを絶対参照することで Sub 質問()   Dim i As Integer   For i = 2 To 5     Cells(2, i).FormulaR1C1 = "=R[-1]C-R1C1"  'R1C1:R(行)が1 C(列)が1 つまりA1を指しています。   Next i End Sub A1形式で表すと Sub 質問()   Range("B2:E2").Formula = "=B1-$A$1" End Sub と、書くことができます。参考までに

helpokwave
質問者

お礼

お礼が遅くなり申し訳ありませんでした。 1.絶対座標を使って計算さるせるというのがまさに私がやりたかった方法で、方法がわからず苦肉の策としてiを使ってセルを相対参照していました。 2.A1形式ですが、 Sub 質問()  Range("B2:E2").Formula = "=B1-$A$1" End Sub は、B1がセルに応じてC1、D1・・・となっていくのですね。 Range指定の最初のセルの数式を書くということでしょうか。 自分の持っている解説書に見当たらず、勉強になりました。 本当にありがとうございました。

回答No.1

""で囲むのはのは文字列です。 (2)は変数iまでが""で囲まれていて i が 変数としてでなくて iという文字としてセルに入るからです。 (3)は"=r[-1]c-r[-1]c["1 - i"]" は ("=r[-1]c-r[-1]c[") の文字列と次の数値1とを&でつないでいないからです。その後のi と("]")も同じです。 (4)は内容的には(1)と同じですが、 & と 1、 i と & の間にスペースが入っていないのが原因です。VBAはスペースを勝手に入れてくれるときとそうでないときがあります。

helpokwave
質問者

お礼

早々にご回答をいただきながらお礼が遅くなり申し訳ありませんでした。 1.数式全体を"で囲むのは、FormulaR1C1(など)を使ってセルに数式を入力する場合の新たな取り決めかと、先入観で思っていましたが、あくまで「文字列を囲む」ということから来ていることを認識しました。そうすると式の見方が変わり、理解できるようになりました。 2.項番(4)は確かにスペースを入れないでそのまま実行してしまう時と、自動的にスペースを入れてうまくいくときとがありました。 有り難うございました。

関連するQ&A

  • 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を選択した状態にする。 言葉足らずでしたら補足します。 何卒宜しくお願い致します。

  • Excel VBA セルの指定の方法

    VBAの初心者です。処理1 のサブルーチンを使わずに直接記述すれば、エラーはでませんが、以下のように記述すればエラーが出てしまいます。宜しくお願いします。 Sub Macro10() i = 1 Do Until Cells(i, 1) = "" 処理1 i = i + 1 Loop End Sub Sub 処理1() Cells(i, 2).Select  ← ここでエラーになります。        ActiveCell.FormulaR1C1 = "◎" End Sub

  • 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にお詳しい方ご教示願います。 なお、マクロで作成したい図を添付いたします。 参考にしていただければ幸いです。

  • ワークシート関数にVBAでセルを指定するには?

    FormulaR1C1ではなく Range形式でVBAでワークシート関数をセルにいれるコードを書くにはどうすればいいでしょう? Sub Macro() ActiveCell.FormulaR1C1 = "=LEN(RC[-1])" End Sub これを Sub Macro() ActiveCell.FormulaR1C1 = "=LEN(a1)" End Sub こうすると、 数式バーには、=LEN('a1')と入っており、 セルの値は#NAME? になります。 アポストロフィーが余計なのですがどうすれば取れますか?

  • エクセル マクロ 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"

  • VBAでエラーになってしまう

    初心者です。 RangeクラスのSelectメゾットが失敗しました。となります。 このコードは、マクロの記録を行い、そのコードをコマンドボタンのコードにコピーしたものです。 初心者なので、マクロの記録からやりました。 どうか、わかる方がいらっしゃいましたら、教えてください。 Private Sub CommandButton4_Click() Sheets("印刷ページ").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("C6").Select ←ここが黄色くなり、エラーになります。 ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("D6").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("E6").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("B8").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("C8").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("D8").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("E8").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("F8").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("B10").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("C10").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("D10").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" Range("E10").Select ActiveCell.FormulaR1C1 = "='鈴木 一郎'!R[2]C" End Sub

  • VBA 2回実行してしまう?

    以下のVBAが なぜか 2回繰り返し実行してしまう時があります。 - 必ずではありません。 どのような場合に2回実行されるのかよくわかりません。 Sub ABC() ActiveCell.Offset(-1, 3).Activate ActiveCell.FormulaR1C1 = "A" ActiveCell.Offset(0, 1).Activate ActiveCell.FormulaR1C1 = "B" ActiveCell.Offset(0, 1).Activate ActiveCell.FormulaR1C1 = "C" ActiveCell.Offset(0, -4).Activate End Sub 宜しくお願いします。

  • Excel VBA 複数のSheet の合計

    Excel VBA  超超 初心者です。見よう見まねで、複数のSheet の L11:Q1000 ,T1:AW100 セル範囲にある文字 "~" を計算できたのですが、 更に各Sheet で計算された合計をしたいのですが、さっぱり判りません。Sheet 名は、バラバラです。合計は、最初か最後のsheet のどこかのセルに表示させたいです。どなたかヒントをてください。よろしくお願いします。 Sub すべてのシートでマクロ実行() Application.ScreenUpdating = False Dim シート As Worksheet For Each シート In Worksheets シート.Select Range("H3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[8]C[4]:R[997]C[9],""*~*"")" Range("I3").Select ActiveCell.FormulaR1C1 = "=COUNTIF(R[-2]C[11]:R[997]C[40],""*~*"")" Range("I4").Select Next Application.ScreenUpdating = True End Sub

  • 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 エラーも何もなく、ちゃんと動くことは動きます。 検索結果が、検索コードによって違うのです。 よろしくお願い致します

専門家に質問してみよう