ExcelマクロVBA技術解説 | VBAを定型文で覚えよう | ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説



最終更新日:2018-03-26

VBAを定型文で覚えよう


VBAの書籍を読んでも、ネットの解説記事を読んでも、
なかなかVBAをマスター出来ないという場合は、学習方法が間違っているかもしれません。
その人に合った学習方法、人それぞれ違うのは当然です。


本サイトでも、入門者用として多くのページが存在します。

ExcelマクロVBA入門
ExcelマクロVBA再入門
Excelマクロの記録で覚えるVBA

これらを見ても、読んだときは分かったつもりになんだけど、
いざ、実際にVBAを書こうとすると、
どうやって書いたら良いか…
どこから書いたら良いか…
手が止まってしまうというのなら、学習方法を少し変えてみて下さい。
もちろん、
以下で書いていることが、あなたに合っていない事もあります。
そのように感じたら、別の方法を探してください。

ここで推奨しているのは、一言で言えば、
「定型文を丸暗記しましょう」という事です。

ただし、
最低限としてVBEを開いてマクロを書いて実行できるところまでは覚えておいてください。

ExcelマクロVBA入門
第1回.マクロって何?VBAって何?
第2回.まずはマクロVBAを使う準備
第3回.マクロの記録
第4回.マクロはどこに書くの(VBEの起動)
第5回.VBEのオプション設定(Option Explicit)
第6回.とにかく書いて見よう(Sub,End Sub)
第7回.マクロを実行するには(F5)
または、
Excelマクロ再入門
第1回.マクロを書く準備をする
第2回.マクロを書いて動かす


まずは、以下の2つのサンプルコードを読んでみて下さい。

Sub sample1()
  Dim i As Long
  Dim lastRow As Long
  Dim cnt As Long
  Dim wb As Workbook
  Dim ws As Worksheet
  Dim shtName As String
  Set wb = ThisWorkbook
  shtName = "データ"
  For Each ws In wb.Worksheets
    With ws
      If InStr(.Name, shtName) > 0 Then
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = lastRow To 2 Step -1
          cnt = WorksheetFunction.CountA(.Rows(i))
          If cnt = 0 Then
            .Rows(i).Delete
          End If
        Next
      End If
    End With
  Next
End Sub

Sub sample2()
  Dim i As Long
  Dim j As Long
  Dim ws As Worksheet
  ThisWorkbook.Activate
  For j = 1 To Worksheets.Count
    With Worksheets(j)
      If .Name Like "*データ*" Then
        i = 2
        Do Until .Cells(i, 1) = ""
          Select Case .Cells(i, 1)
            Case Is >= 70
              .Cells(i, 2) = "A"
            Case Is >= 50
              .Cells(i, 2) = "B"
            Case Else
              .Cells(i, 2) = "C"
          End Select
          i = i + 1
        Loop
      End If
    End With
  Next
End Sub


何をしているかが判読できて、
これくらいならスラスラ書けるよって人は、この下は読む必要がありません。

何とか読めるには読めるけど書く自信がない
そもそも全然わからない
というのなら、以下をじっくり読んでみて下さい。




上図のように、シートが複数あり、
「データ1」「データ2」というよな名前のシートにはデータが入っています。
その他の名前のシート(Sheet1やSheet2)は、説明文等の別の用途に使っています。
そして、「データ○」のシートにはA列に点数が入っています
・途中の空行を削除したい
・点数に応じた評価をB列に出したい
 (70以上はA、50以上はB、その他はC)

上記のVBAコードは、
sample1は、途中の空行を削除しています。
sample2は、点数に応じた評価を出力しています。


sample1について、以下の課題1〜課題6をやってみましょう。

課題1

やっている処理内容が理解出来たら、
分からない構文や単語があっても構いませんので、
もう一度VBAコードをじっくり読んでみましょう。


課題2

では次に、分からない構文・単語を調べてみましょう。

完全に理解しようとしなくて良いです。
軽くさっと読む程度でも構いません。
もちろん、じっくり理解してはいけないという事ではありません、
理解できない・覚えられないと思っても先に進んでくださいという事です。

構文・単語の手引き

構文や単語の理解が少し進んだところで、
もう一度VBAコードをじっくり読んでみましょう。


課題3

次はVBAを書いてみましょう。
上記のVBAコードを見ながら、そのまんま書き写せば良いです。
ただし、
インデント(字下げ)はちゃんとするようにして下さい。
つまり、全く同じように書かなければダメです。

書き方の手順について
Sub 〜 End Sub
If 〜 End If
Select Case 〜 End Select
For 〜 Next
For Each 〜 Next
Do 〜 Loop
With 〜 End With

これらは、ブロック構文と呼びます。
ブロック構文は、
最初の行を書いたら、次にはブロック構文の終了文を書いてから中身を書きます。

  For Each ws In wb.Worksheets
    
  Next

  For Each ws In wb.Worksheets
    With ws
      
    End With
  Next

  For Each ws In wb.Worksheets
    With ws
      If InStr(.Name, shtName) > 0 Then
        
      End If
    End With
  Next

  For Each ws In wb.Worksheets
    With ws
      If InStr(.Name, shtName) > 0 Then
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = lastRow To 2 Step -1
          
        Next
      End If
    End With
  Next

  For Each ws In wb.Worksheets
    With ws
      If InStr(.Name, shtName) > 0 Then
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        For i = lastRow To 2 Step -1
          cnt = WorksheetFunction.CountA(.Rows(i))
          If cnt = 0 Then
            
          End If
        Next
      End If
    End With
  Next

インデント(字下げ)には、必ずTabキーを使ってください。


課題4

今度は、単に書き写すのではなく、
何を(どんな処理)を書いているかを考えながら書いてください。


課題5

ステップイン(F8)実行しながら、シートがどのように変化していくかを見つめて下さい。



このように、VBAとバックのシートが同時に確認できるようにして、
VBAコードの実行によって、シートがどう変化していくか、
VBAコードとシートの動きを対比しながら見つめて下さい。

ステップインについては → マクロの実行


課題6

いよいよ、サンプルコードを見ずに書いてみましょう。

途中で分からないところがあっても、分かる所だけでけでも書き進めましょう。

一通り分かる所だけでも書いたら、
サンプルコードと見比べて、分からなかった所、間違ったところを書き直しましょう。

書き終えたら、ステップイン(F8)実行しながら、1行づつ確認しながら進めてみましょう。


課題7

サンプルコードを見ずに書いて、そのままステップイン実行してみましょう。

文法エラーや実行エラーは、自力で解決しましょう。

・文法エラーや実行エラーを解決できない
・実行結果が正しくない
このような場合は、課題6に戻ってください。

エラーなく正しい結果になれば、無事終了です。


sample1が終わったら、次はsample2です。

sample2について、上記の課題1〜課題7をやってみましょう。


課題7が完了したら、VBAコード全体を見渡してみて下さい。
なんとなく全体を見渡す感じが良いです。
sample1の課題1で最初に見たときとは、全く違った見え方になっているはずです。

ふと目に止まった1行を見ただけでも、
VBAコードの意味、シートの動き、変数の変化、
これらが頭の中にイメージできるようになってきます。

つまり目標は、
VBAコードを見て、シートの動き・変数の変化が頭の中にイメージできるようになる事です。
頭の中に、ブック、シート、変数これらを用意します。
VBAコードにあわせて、頭の中でこれらを変化させていきます。
これが無理なくできるようになることを目指してください。

この状態は、
VBAを日本語に訳さずに読んでいる状態です。
初心者(VBAを始めたばかりの頃)は、
VBAの命令 ⇔ 日本語に訳す ⇔ 物体・事象を思い浮かべる
この状態から、
VBAの命令 ⇔ 物体・事象を思い浮かべる
この状態になっているという事です。
身近な例で言うなら、
apple ⇔
多くの人は「りんご」という日本語を介さずにイメージしているはずです。
appleという単語に繰り返し何度も触れたことでこのような状態になったという事です。
VBAも繰り返し何度も触れることでこの状態になります。


この段階を過ぎれば、
後は、VBAで使えるステートメント・メソッド・プロパティ・関数を増やしていけば良いだけです。
逆に言えば、
この段階を経ずに、VBAのステートメント・メソッド・プロパティ・関数をいくら覚えても、
実際のVBAコードをスラスラ書けるようにはならないという事です。

ここでの課題で一定の成果があったと感じたら、
いろいろなパターンの良いサンプルコードを見つけて、この課題をやってみて下さい。
そして、使えるVBAの幅を広げていってください。
ただし、
メソッドや関数の引数については無理に暗記する必要はありません。
これらは、必要な時に資料を見るかコピペすれば済むことです。
暗記すべきことは、
基本ステートメントの使い方、ロジックの組み立て方になります。




同じテーマ「マクロVBA技術解説」の記事

Rangeオブジェクト.Valueの省略について
ユーザー操作を制限する(Locked,Protect,ScrollArea)
シートに数式を設定する時のセル参照の指定方法
標準モジュールとシートモジュールの違い
オートフィルタ(AutoFilter)の使い方まとめ
複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧

新着記事 ・・・新着記事一覧を見る

VBAを定型文で覚えよう|ExcelマクロVBA技術解説(3月26日)
VBAスタンダード試験対策まとめ|MOS VBAエキスパート対策(3月16日)
ユーザーフォームとメニューの操作|MOS VBAエキスパート対策(3月14日)
ファイルの操作|MOS VBAエキスパート対策(3月14日)
ユーザーフォームの各種イベント|Excelユーザーフォーム(3月13日)
レジストリの操作|MOS VBAエキスパート対策(3月12日)
変数と配列|MOS VBAエキスパート対策(3月12日)
Colorプロパティの設定値一覧|VBA技術解説(3月12日)
APIとOLEオートメーション|MOS VBAエキスパート対策(3月11日)
エラーへの対処|MOS VBAエキスパート対策(3月10日)

アクセスランキング ・・・ ランキング一覧を見る

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数とデータ型(Dim)|ExcelマクロVBA入門
6.ひらがな⇔カタカナの変換|エクセル基本操作
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.定数と型宣言文字(Const)|ExcelマクロVBA入門
9.とにかく書いて見よう(Sub,End Sub)|VBA入門
10.繰り返し処理(For Next)|ExcelマクロVBA入門



  • >
  • >
  • >
  • VBAを定型文で覚えよう

  • このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。


    記述には細心の注意をしたつもりですが、
    間違いやご指摘がありましたら、「お問い合わせ」からお知らせいただけると幸いです。
    なお、掲載のVBAコードは自己責任で使ってください。万一データ破損等の損害が発生しても責任は負いません。





    このサイトがお役に立ちましたら「シェア」「Bookmark」をお願いいたします。

    本文下部へ

    ↑ PAGE TOP