VBA技術解説
VBAこれだけは覚えておきたい必須基本例文10

ExcelマクロVBAの問題点と解決策、VBAの技術的解説
最終更新日:2021-07-24

VBAこれだけは覚えておきたい必須基本例文10


VBAを覚える順序としては、
・文法から始める方法
・実践例文から始める方法
どちらが良いとは言い切れませんが、もし文法習得に限界を感じているなら、
実践的な基本例文を暗記することから始めてみると良いでしょう。
また、
VBA習得において、
・何を目標にやっていけばよいのか
・どの程度出来たらVBAができると言えるのか
こんな疑問もでてくるでしょう。


以下の10個のVBA必須基本例文を読めて書ければ概ねVBAの基本は出来ますといえるレベルと言って良いでしょう。
基本例文を何度も読んで、何度も書いてみると、いつの間にかVBAが身近な言語となっているはずです。

以下では、VBAの解説はごく簡単な説明にとどめています。
細部について、あれこれこだわるより、何度も書いて動かしてみて下さい。
動かすときは、ステップイン(F8)で実行してください。
VBEの使い方:デバッグ|ExcelマクロVBA入門
・実行、中断、リセット(停止) ・ステップ実行 ・呼び出し履歴 ・VBA実行途中で変数の状態を確認 ・Debug.Print ・Debug.Assert ・デバッグの最後に
シートの状態と変数の状態を良く確認しながら進めて下さい。

例文を書けるようになったら、
それぞれに記載してある参考ページを読んで、細部の文法を学んでください。

1.最終行まで処理

Sub example1()
  Dim i As Long
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 3) = Cells(i, 1) + Cells(i, 2)
  Next
End Sub

2行目からA列とB列にデータが入っています。
A列とB列を足して、C列に入れています。

Cells(Rows.Count, 1).End(xlUp).Row
これが、A列にデータが入っている最終行になります。
, 1)
この1がA列の指定なので、他の列の最終行の場合はこの数値を変更します。

第18回.最終行の取得(End,Rows.Count)
・エクセルVBAにおける最終行取得の必要性 ・.End(xlDown):Ctrl+↓ ・.End(xlUp):Ctrl+↑ ・Endプロパティの方向(↑↓←→)について ・セルの行数を取得するRowプロパティ ・Cells(Rows.Count, 1).End(xlUp).Rowを日本語に訳す ・EndプロパティがRangeオブジェクトを返す ・Endプロパティの問題点 ・最終行に関するサイト内のページ
第6回.表の先頭から最終行まで繰り返す(ForとEnd(xlUp).Row)
・表の最終行を取得する ・表の最終行まで繰り返す ・VBAの文法を覚える必要があるか ・ExcelマクロVBA入門等の対応ページ
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
・最終行取得の基本:手動ではCtrl + ↑、VBAではCells(1, 1).End(xlDown) ・最終列の取得 ・特殊な表の場合 ・CurrentRegion ・SpecialCells(xlCellTypeLastCell) ・UsedRange ・Findメソッド ・サイト内関連ページ


2.後ろから逆順ループ

Sub example2()
  Dim i As Long
  Application.DisplayAlerts = False
  For i = Worksheets.Count To 1 Step -1
    If Worksheets(i).Name Like "削除*" Then
      Worksheets(i).Delete
    End If
  Next
  Application.DisplayAlerts = True
End Sub

「削除○○」のように削除で始まるシート名を削除します。
1番目のシートから削除していくと、削除した時点でシート数が変わってしまうので上手くいきません。

For i = Worksheets.Count To 1 Step -1
変数iがシートの数(Worksheets.Count )から1になるまで、1ずつ減らしていきます。

シート削除時には、警告メッセージが表示されるので、
Application.DisplayAlertsをFalseにすることで、警告が出ないようにしています。

第16回.繰り返し処理(For Next)
・For Next ステートメント ・For Next 例文 ・For Next をステップ イン実行で目で見て確認しましょう。 ・1行置きに処理する場合 ・Exit For ・For~Nextのネスト(入れ子) ・最後に一言
第17回.繰り返し処理(Do Loop)
・Do~Loopの構文 ・条件式 ・Do Loop 例文 ・Exit Do ・Do~Loopのネスト(入れ子) ・最後に一言
第66回.シートのコピー・移動・削除(Copy,Move,Delete)
・シートのコピー・移動 ・シートの削除


3.コレクション処理

Sub example3()
  Dim ws As Worksheet
  Application.DisplayAlerts = False
  For Each ws In Worksheets
    If ws.Name Like "削除*" Then
      ws.Delete
    End If
  Next
  Application.DisplayAlerts = True
End Sub

「削除○○」のように削除で始まるシート名を削除します。

For Each ws In Worksheets
全てのワークシートから、一つずつ変数wsに取り出します。

シート削除時には、警告メッセージが表示されるので、
Application.DisplayAlertsをFalseにすることで、警告が出ないようにしています。

第58回.コレクションとは
・コレクションの中から単一オブジェクトを指定する場合 ・セルであるRangeオブジェクトのコレクションは? ・コレクションの要素数 ・Collectionオブジェクト
第59回.コレクション処理(For Each)
・For Each の構文 ・Exit For ・For Each の使用例 ・RangeオブジェクトのFor Each ・For Each サイト内の参考ページ


4.分岐処理

Sub example4()
  Dim i As Long
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    'ElseIfで
    If Cells(i, 1) >= 90 Then
      Cells(i, 2) = "A"
    ElseIf Cells(i, 1) >= 70 Then
      Cells(i, 2) = "B"
    ElseIf Cells(i, 1) >= 50 Then
      Cells(i, 2) = "C"
    Else
      Cells(i, 2) = "D"
    End If
    'Select Caseで
    Select Case Cells(i, 1)
      Case Is >= 90
        Cells(i, 2) = "A"
      Case Is >= 70
        Cells(i, 2) = "B"
      Case Is >= 50
        Cells(i, 2) = "C"
      Case Else
        Cells(i, 2) = "D"
    End Select
  Next
End Sub

2行目からA列にデータが入っています。
A列の数値によって、B列にABCDの判定を入れています。

ElseIfでの記述と、Select Caseでの記述の両方でやっています。
ElseIfとSelect Caseで全く同じ処理となっています。

第20回.条件分岐(If)
・Ifステートメントの構文 ・IFステートメントの条件式 ・Ifステートメントの使用例文 ・Ifステートメントのネスト(入れ子) ・サイト内のIfステートメント参考ページ ・最後に
第21回.条件分岐(ElseIf)
前回のIFステートメントでは、真か偽の二択でした。今回は、もっと多くの分岐が必要な、Ifステートメントで多肢条件分岐の場合の書き方です。ステートメントとしては、Ifステートメントです。IfステートメントのElseIfの構文 If条件式1Then 条件式1が真の処理 [ElseIf条件式2Then 条件式2が真の処理…
第22回.条件分岐(Select Case)
・Select Caseステートメントの構文 ・Select Case の例文 ・Select Case の応用

ワイルドカードを使った部分一致での条件判定もぜひ覚えてください。
第49回.Like演算子とワイルドカード
・Like演算子 ・パターン文字列式(ワイルドカード、文字リスト、文字範囲) ・Like演算子の使用例 ・正規表現について


5.セルのコピー

Sub example5()
  'セル全体をコピー
  Range("A1").Copy Destination:=Range("B1")
  '値だけのコピー
  Range("B2:B10").Value = Range("A2:A10").Value
End Sub

A1セルを、B1セルにコピーします。
値だけでなく、書式等を含めたセルの情報の全てをコピーします。

A2:A10セルの値だけを、B2:B10にコピーします。
この場合は、Valueを省略できません。

第40回.セルのコピー・カット&ペースト(Copy,Cut,Paste)
・セルをコピー(複写)する場合 ・セルを切り取る(移動する)場合 ・セル範囲のコピーについて ・別のシートにコピーする場合 ・アクティブシート以外へのコピー ・セルのコピーについてのサイト内参考ページ
第41回.セルのコピー&値の貼り付け(PasteSpecial)
・PasteSpecialメソッド ・値の貼り付け ・いろいろなコピーのVBAの書き方 ・PasteSpecialの使用例 ・最後に
第42回.セルをコピーするとは
・セルをコピーするとは ・上記方法ではコピーできないプロパティ ・.Valueのセル範囲間のコピー ・.Value以外の場合は、セル範囲をセル範囲にコピーは出来ません ・コピー方法の使い分け ・セルのコピー(Copyメソッド)実行時の注意点 ・最後に


6.VBA関数とワークシート関数

Sub example6()
  Dim i As Long
  On Error Resume Next
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 2) = Left(Cells(i, 1), 2)
    Cells(i, 3) = WorksheetFunction.VLookup( _
          Cells(i, 1), _
          Worksheets("Sheet2").Range("A:B"), _
          2, _
          False)
  Next
  On Error GoTo 0
End Sub

2行目からA列にデータが入っています。
A列の値の1文字目を、B列に入れています。
A列の値でSheet2のA:B列のデータをVLOOKUPして、C列に入れています。

VBAをやる上では、ワークシート関数の習得は必須になります。
ワークシート関数で出来ることをVBAでゴリゴリ書いたりしないようにして下さい。
もちろん、同時にVBA関数を使える事は必須になります。

第44回.VBA関数について
・VBA関数の書き方 ・関数の戻り値を使わない場合 ・名前付き引数 ・○○○B関数 ・○○○$関数 ・ワークシート関数との関係 ・自動メンバ表示 ・習得すべき関数 ・最後に
第45回.VBA関数(Format)
・Format関数 ・日付/時刻表示書式指定文字 ・数値表示書式指定文字 ・文字列表示書式指定文字 ・Format関数の使用例 ・※セルに出力する場合 ・最後に
第46回.VBA関数(日付,DateAdd)
・日付時刻に関するVBA関数の一覧 ・DateAdd関数の構文 ・DateAdd関数の使用例
第47回.VBA関数(文字列操作,Replace,InStr,StrConv)
・文字列操作に関するVBA関数の一覧 ・Replace関数 ・InStr関数 ・StrConv関数 ・最後に
第48回.VBA関数(その他,Fix,Int,Rnd,Round,IsEmpty)
・数学VBA関数の一覧 ・データ型確認のVBA関数一覧 ・データ型変換のVBA関数一覧
第87回.WorksheetFunction(ワークシート関数を使う)
・ワークシート関数の使い方 ・WorksheetFunctionで使用できる関数 ・個別の関数の使い方 ・関数の結果(戻り値) ・WorksheetFunctionの使用例. ・検索系の関数での日付の扱い ・WorksheetFunctionのエラー対処 ・最後に


7.オブジェクト変数とWith

Sub example7()
  Dim i As Long
  Dim ws As Worksheet
  Set ws = ActiveSheet
  With ws
    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
      .Cells(i, 3) = .Cells(i, 1) + .Cells(i, 2)
    Next
  End With
End Sub

シートを指定しないRangeやCellsはアクティブシートとなってしまうので、
アクティブシート以外を操作する場合はシートを指定します。
しかし、シート指定は記述が長くなりがちなので、
オブジェクト変数を使って、シート指定を短い記述にすることが出来ます。
さらに、
Withを使う事で、まとめて一括でシートを指定してより簡単にシートを指定できるようになります。

第51回.Withステートメント
・Withの構文 ・Withを使った時と使わない時の比較 ・Withの使用例 ・Withのネスト ・Withを使ったときに気を付けるべき書き方 ・Withの使いどころ ・サイト内の参考ページ
第52回.オブジェクト変数とSetステートメント
・オブジェクト変数 ・個有のオブジェクト型とは ・Setステートメント ・Setステートメントの使用例 ・WithとSetの使い分け方 ・Setステートメントの実践的な使い方 ・Is演算子によるオブジェクトの比較 ・最後に


8.ブックを開く・閉じる

Sub example8()
  Dim wb As Workbook
  Dim ws As Worksheet
  Set wb = Workbooks.Open("C:\user\sample.xlsx")
  Set ws = wb.Worksheets(1)
  ThisWorkbook.Worksheets(1).Range("A1") = ws.Range("A1")
  wb.Close SaveChanges:=False
End Sub

ブックを開いて、先頭シートのA1セルの値を取得しています。
ブックのOpenと同時にオブジェクト変数に入れる事で、その後が記述しやすくなります。

第63回.ブックを開く(Open)
・Workbooks.Openメソッド ・Openメソッドの使用例 ・Openメソッドの戻り値の使い方 ・Workbooks.Addメソッド ・Openメソッドの関連記事
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
・ブックを閉じる ・ブックを上書き保存 ・ブックに名前を付けて保存 ・ブックのコピーを保存 ・ブックを閉じる・保存の実践例


9.ファイル一覧

Sub example9()
  Dim i As Long
  Dim sFile As String
  i = 1
  sFile = Dir("C:\sample\*.xls*")
  Do While sFile <> ""
    Cells(i, 1) = sFile
    i = i + 1
    sFile = Dir()
  Loop
End Sub

Cドライブ下にある、sampleオォルダ内のexcelファイルの一覧を取得しています。

Dir関数は、ファイルだけでなくフォルダも取得することができます。

第17回.繰り返し処理(Do Loop)
・Do~Loopの構文 ・条件式 ・Do Loop 例文 ・Exit Do ・Do~Loopのネスト(入れ子) ・最後に一言
第79回.ファイル操作Ⅰ(Dir)
・Dir関数 ・Dir関数の使用例 ・Dir関数の実践例 ・Dir関数の制限について ・Dir関数の関連記事
エクセルでファイル一覧を作成
VBAでサブフォルダ以下も含めて全てのファイル一覧を取得します。最初はサブフォルダは無視して、VBAにある関数とステートメントだけで作成します、その後に、FileSystemObjectで再帰処理をすることで、全てのサブフォルダも取得するようにしていきます。


10.テキスト読み書き

Sub example10()
  Dim InData As String
  Open "C:\sample\sample1.txt" For Input As #1
  Open "C:\sample\sample2.txt" For Output As #2
  Do While Not EOF(1)
    Line Input #1, InData
    Print #2, InData
  Loop
  Close #1
  Close #2
End Sub

"C:\sample\sample1.txt"を1行ずつ読み込んで、
同じ内容を、
"C:\sample\sample2.txt"に出力しています。

For InputとLine Input
For OutputとPrint
これらをセットで使います。
Closeを忘れないようにしてください。

第116回.ファイル操作Ⅱ(OpenとClose)
・Openステートメント ・Closeステートメント ・OpenステートメントとCloseステートメントの使用例
第117回.ファイル操作Ⅱ(Line Input #)
・Line Input # ステートメント ・EOF関数 ・Line Input # ステートメント と EOF関数の使用例.
第118回.ファイル操作Ⅱ(Print #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、その後に、読込み書込みを行い、最後に、ファイルを閉じます。ファイルを書き込む時には、Print#ステートメントを使います。Print#ステートメント シーケンシャル出力モード(OutputまたはAppend)で開いたファイルにデータを書き込むファイル入…
第119回.ファイルシステムオブジェクト(FileSystemObject)
・FileSystemObjectオブジェクトの使用方法 ・FileSystemObjectオブジェクトのプロパティとメソッド ・FileSystemObjectオブジェクトのメソッドの戻り値 ・FileSystemObjectオブジェクトの使用例 ・FileSystemObjectオブジェクトの関連記事と実践例


VBA必須基本例文10を覚えた後は

本記事と合わせて、以下の記事も是非お読みください。
VBAを定型文で覚えよう
・サンプルVBA ・サンプルVBAの解説 ・VBAを定型文で覚えるための課題 ・VBAを定型文で覚えることの目標

ここまでがしっかり覚えられれば、
その後は、使えるメソッドやプロパティを順に増やしていってください。

そして、ある程度VBAが書けるようになったら、次は配列に進んでください。
VBAの処理速度対策として、配列は必須技術になります。

第111回.静的配列
・配列とは ・静的配列と動的配列 ・配列の宣言 ・多次元配列 ・要素の下限の変更 ・配列について
第112回.動的配列(ReDim)
・ReDimステートメント ・要素数の変更について ・配列について
第113回.配列に関連する関数
・LBound関数とUBound 関数 ・Array関数 ・IsArray 関数 ・Join関数 ・Filter関数 ・Eraseステートメント
第114回.セル範囲⇔配列
・セル範囲⇔配列の基本VBA ・使用例 ・配列およびマクロVBAの高速化に関するページ
配列の使い方について
・配列とは ・1次元の配列 ・2次元の配列 ・3次元以上の配列 ・動的配列 ・動的配列 ・動的配列の要素数の取得 ・配列使用時の注意
VBAの配列まとめ(静的配列、動的配列)
・配列の概念 ・静的配列 ・動的配列 ・セル範囲⇔配列の基本 ・配列で必要となるVBA関数とステートメント ・配列に関する記事の一覧




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

フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧(カラー定数、XlRgbColor列挙)
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは
オブジェクト変数とは何か
VBAの小数以下の演算誤差について
スピルでVBAの何が変わったか


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

構成比を合計しても100%にならないと言われた…|ツイッター出題回答 (2022-09-01)
一覧から複数条件(部分一致、範囲)に合致するデータを抽出する|ツイッター出題回答 (2022-08-30)
縦横スピルしないXLOOKUP代替(MATCH+INDEX,FILTER,CHOOSEROWS)|エクセル入門(2022-08-27)
IF関数の論理式で比較演算子を省略したCOUNT系関数を書くのは|ツイッター出題回答 (2022-08-23)
LAMBDA以降の新関数の使用例|エクセル入門(2022-08-22)
数珠順列(配置に条件付き)を全て出力する|ツイッター出題回答 (2022-08-20)
日付時刻のマイナス表示に対応する方法|ツイッター出題回答 (2022-08-17)
LAMBDA以降の新関数について|エクセル入門(2022-08-16)
条件付きの最大値と中央値("A"が2文字の条件)|ツイッター出題回答 (2022-08-14)
VBAマクロと操作対象データの分離について|ツイッター出題回答 (2022-08-11)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.RangeとCellsの使い方|VBA入門
3.変数宣言のDimとデータ型|VBA入門
4.繰り返し処理(For Next)|VBA入門
5.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
6.Excelショートカットキー一覧|Excelリファレンス
7.並べ替え(Sort)|VBA入門
8.マクロって何?VBAって何?|VBA入門
9.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
10.エクセルVBAでのシート指定方法|VBA技術解説




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


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



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