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

ExcelマクロVBAの問題点と解決策、エクセルVBAの技術的解説
最終更新日:2019-10-23

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

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


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

以下では、VBAの解説はごく簡単な説明にとどめています。
細部について、あれこれこだわるより、何度も書いて動かしてみて下さい。
動かすときは、ステップイン(F8)で実行してください。
VBEの使い方:デバッグ|ExcelマクロVBA入門
VBE(VisualBasicEditor)は、VBAで使われるコードエディタ、コンパイラ、デバッガ、その他の開発支援ツールが統合された開発環境です。ここではVBA開発で、重要かつ避けて通れないデバッグについて説明します。。
シートの状態と変数の状態を良く確認しながら進めて下さい。

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

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)
Excelワークシートにおける表の最終行の取得は、VBAの必須技術になります、エクセルVBAにおける最終行取得の必要性 エクセルは表計算ソフトです、つまり縦横の表を扱います、データは横に項目があり、縦に項目に対するデータが入っている事が一般的です。しかし、そのデータ行数は決まった行数ではない事が普通です。
第6回.表の先頭から最終行まで繰り返す(ForとEnd(xlUp).Row)
エクセルの表は、横の項目はあまり変更はないものですが、縦のデータ数、つまり行数は常に変わるものです、前回のように、固定の回数しか繰り返せないのでは困ります、データ数に応じて、最終行まで繰り返す方法が必要です。データの最終行が分かれば良いのです。
最終行・最終列の取得方法(End,CurrentRegion,SpecialCells,UsedRange)
エクセルの表をVBAで扱う時は、データ部分の先頭から最終行までの、開始列から最終列まで処理する事が多いでしょう。開始行や開始列は、ほとんどの場合、見出し行や見出し列の次からになります。単純な話として、1行目に見出しがあれば、2行目から 1列目に見出しがあれば、2列目から では、ここで、最終行や最終列は、

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)
VBAのForNextは、同じ処理を繰り返し行うためのVBA構文です。VBAで繰り返し処理をする方法は何通りかありますが、最も頻繁に使われていて、最も簡単便利であり、まず最初に覚えるべき繰り返し処理のVBA構文がForNextになります。ForNextは、繰り返し処理をするためのステートメントで、同じ処理を複数回繰り返したい場合に使います、
第17回.繰り返し処理(Do Loop)
繰り返し処理として、前回はFor~Nextをやりました、今回はDo~Loopです。For~Nextに比べると使用頻度は落ちますが、必ず覚える必要があるものです。For~Nextは、繰り返す回数をあらかじめ指定するものでしたが、Do~Loopは、繰り返す回数ではなく、繰り返す条件を指定するものです。
第66回.シートのコピー・移動・削除(Copy,Move,Delete)
シートをコピーや移動をしたり、また削除する場合の説明です、VBAでは、雛形シートをコピーして使ったり、不要なシートを削除することは頻繁にあります。シートのコピー・移動には、Worksheet.Copyメソッド、Worksheet.Moveメソッド これら、WorkSheetオブジェクトのメソッドを使用します。

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回.コレクションとは
同種のオブジェクトを複数まとめたものを「コレクション」と呼びます、コレクションもオブジェクトの一種です。例えば、Workbookオブジェクトが複数まとまったものは「Workbooksコレクション」Worksheetオブジェクトが複数まとまったものは「Worksheetsコレクション」オブジェクト名が単数形であるのに対し、
第59回.コレクション処理(For Each)
ForEachは、コレクションの各要素に対して繰り返し処理を実行します。コレクションはオブジェクトの集まりですので、ForEachは、コレクションの中から、個別のオブジェクトを取り出して処理する場合に使用します。コレクションの全ての要素に対しての処理が終わるとループは終了します。

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 Select
    '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ステートメントです。VBAマクロで自動化する場合の多くは、条件により処理を変えつつ一定回数繰り返すという事です。
第21回.条件分岐(ElseIf)
前回のIFステートメントでは、真か偽の二択でした。今回は、もっと多くの分岐が必要な、Ifステートメントで多肢条件分岐の場合の書き方です。ステートメントとしては、Ifステートメントです。IfステートメントのElseIfの構文 If条件式1Then 条件式1が真の処理 [ElseIf条件式2Then 条件式2が真の処理] [ElseIf条件式3Then 条件…
第22回.条件分岐(Select Case)
前回のElseIf以外の、多肢条件分岐の別の書き方があります。それがSelectCaseになります。むしろElseIfより、このSelectCaseの方が、より多肢条件分岐に適していると言えます。SelectCaseは、多肢条件分岐に特化したステートメントになります。

ワイルドカードを使った部分一致での条件判定もぜひ覚えてください。
第49回.Like演算子とワイルドカード
文字列比較において部分一致やパターンマッチングでの文字列比較を行う時に使うのがLike演算子です。Like演算子は、2つの文字列のパターンマッチングを行い、規則に一致しているかどうかの結果をTrue(一致)またはFalse(不一致)で返します。

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)
VBAにおいて、あるセルをコピーまたはカットして、他のセルに貼り付ける場合のVBAの説明になります、手作業で、セルをコピー(Ctrl+C)またはカット(Ctrl+X)して、他のセルに貼り付け(Ctrl+V後にESCまたはEnter) これと同じ動作をするVBAになります。Copy(コピー)する場合 A1セルをB1セルにコピー貼り付けする場合 このように記…
第41回.セルのコピー&値の貼り付け(PasteSpecial)
値の貼り付けと題しましたが、値だけではなく、「形式を選択して貼り付け」のいろいろな指定方法です。セルをコピーして、他のセルに「形式を選択して貼り付け」する場合のマクロVBAコードになります。セルの値や書式を別のセルコピーすることはマクロVBAでは定番かつ必須の技術になります。
第42回.セルをコピーするとは
セルをコピーするとは、どういう事でしょうか… セルをコピーするというマクロVBAを少し掘り下げて考えることで、より実践的なマクロVBAコードを書くことが出来るようになります。コピーと一言で言っているものは、何のコピーを指しているのでしょうか。

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にも専用の関数が用意されています、このマクロVBA専用の関数をVBA関数と呼んだりします。関数とは、多くの人が共通して必要となる機能(命令)を一塊にしてプログラミング言語として用意されているものです。
第45回.VBA関数(Format)
VBAのFormat関数は、指定した書式に変換した文字列を返す関数で、ワークシート関数のTEXT関数とほぼ同様の機能になります。Format関数は、非常に使用頻度の高い関数でありマクロVBAにおいては重要かつ必須習得関数です。Format関数はしっかと使えるようにしておきましょう。
第46回.VBA関数(日付,DateAdd)
データ型の中でも日付時刻はかなり特殊であり、関数の使用は必要不可欠になります。ここでは、日付に関するVBA関数の一覧と、DateAdd関数について解説します。DateAdd関数以外の他の関数は、一覧のリンクより個別のページを参照して下さい。
第47回.VBA関数(文字列操作,Replace,InStr,StrConv)
文字列操作は、マクロVBAでプログラミングする上で必須です、データ整形、データクレンジング、データクリーニング、これらを行うVBAにおいて不可欠なものが、文字列操作関数です。ここでは、文字列操作に関するVBA関数の一覧と Replace関数、InStr関数、StrConv関数について解説します。
第48回.VBA関数(その他,Fix,Int,Rnd,Round,IsEmpty)
VBA関数の中で、日付関数、文字列操作関数以外でマクロVBAにおいてはぜひ押さえておいてほしい関数の一覧です。数学、データ型確認、データ型変換に関するVBA関数になります。一覧と、その中から注意点のある関数についてのみ一部説明します。
第87回.WorksheetFunction(ワークシート関数を使う)
VBA関数以外に、Excelワークシート関数をマクロVBAで使うことが出来ます、ワークシート関数は、VBA関数よりはるかに多くの関数があるので、ぜひ活用したいところです。。ワークシート関数を使う事で、VBAコードを非常に簡潔に記述することが出来る場合が多いものです。

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に指定したオブジェクトに対してオブジェクト名を再度記述することなく、プロパティやメソッドを記述することができます。文章で例えて言えば、主語を一度書いたら、その後は主語を省略するような書き方になります。
第52回.オブジェクト変数とSetステートメント
変数のデータ型の説明において、Object…オブジェクト型 というのがあった事を覚えているでしょうか。数値や文字ではなく、オブジェクトを入れる変数がオブジェクト変数です。オブジェクトと言っても、いろいろなものがあります。

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)
他のブックを開く方法です、しかし、これが結構いろいろあるのです。Excelで開くことが出来るファイルはCSV等のテキストファイルもありますが、ここではエクセルファイル限定で説明します。テキストファイルやCSVについては、別の記事を参考にして下さい。
第64回.ブックを閉じる・保存(Close,Save,SaveAs)
ワークブックを閉じる場合や保存する場合のVBAの説明です。閉じる時に保存するか保存しないかを指定できます、また、ブックを保存するにも、上書きなのか別ファイルにするのか等によってVBAの記述がそれぞれ違ってきます。ブックを閉じる ブックを閉じるには、WorkbookのCloseメソッドを使用します。

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)
繰り返し処理として、前回はFor~Nextをやりました、今回はDo~Loopです。For~Nextに比べると使用頻度は落ちますが、必ず覚える必要があるものです。For~Nextは、繰り返す回数をあらかじめ指定するものでしたが、Do~Loopは、繰り返す回数ではなく、繰り返す条件を指定するものです。
第79回.ファイル操作Ⅰ(Dir)
VBAでは、フォルダのファイル一覧を取得したりファイルの存在確認をする事が出来ます、指定したパターン(ワイルドカード)やファイル属性と一致するファイルまたはフォルダの名前を表す文字列の値を返します。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)
VBAで(CSV等のテキスト)ファイルを扱う時は、最初に、ファイルを開き、次に、読込書込みを行い、最後に、ファイルを閉じます。ファイルを開くには、Openステートメントを使います、ファイルを閉じるには、Closeステートメントを使います。今回はこのOpenステートメントとCloseステートメントを解説します。
第117回.ファイル操作Ⅱ(Line Input #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、次に、読込書込みを行い、最後に、ファイルを閉じます。ファイルを読み込む時には、LineInput#ステートメントを使います。LineInput#ステートメント シーケンシャル入力モード(Input)で開いたファイルから行全体を読み込み、
第118回.ファイル操作Ⅱ(Print #)
VBAでファイル(CSV等)を扱う時は、最初に、ファイルを開き、次に、読込書込みを行い、最後に、ファイルを閉じます。ファイルを書き込む時には、Print#ステートメントを使います。Print#ステートメント シーケンシャル出力モード(OutputまたはAppend)で開いたファイルにデータを書き込むファイル入出力ステートメントです。
第119回.ファイルシステムオブジェクト(FileSystemObject)
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし、機能が大変多いため、これらを全て覚えるという事は困難です。

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

本記事と合わせて、以下の記事も是非お読みください。
VBAを定型文で覚えよう
VBAの書籍を読んでも、ネットの解説記事を読んでも、なかなかVBAをマスター出来ないという場合は、学習方法が間違っているかもしれません。その人に合った学習方法、人それぞれ違うのは当然です。本サイトでも、入門者用として多くのページが存在します。

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

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

第111回.静的配列
VBAを学習していくと必ず配列が出てきます。VBA記述自体は簡単なものですが正しく理解せずに使っている場合も見受けられます。ここでは、配列の概要から入り、VBAでの記述方法を解説していきます。配列とは 配列は、値を格納するために多くの区画を持つ1つの変数です、集合住宅やアパートにたとえられますが、
第112回.動的配列(ReDim)
VBAにおける配列の説明として最初に静的配列を解説しました、静的配列では要素数は宣言時点で決められていました。しかし、プログラミングをする上で、実行時点で要素数を決めたい場合や、実行途中で要素数を増減させたい場合が多く出てきます。実行時点で(実行途中で)要素数を増減できるの配列を動的配列と呼びます。
第113回.配列に関連する関数
マクロVBAで配列を使う上で、必要となるVBA関数がいくつかあります。より便利に配列を活用するために必須となるVBA関数、・LBound関数 ・UBound関数 ・Array関数 I・sArray関数 ・Join関数 ・Filter関数 以上のVBA関数を解説します。
第114回.セル範囲⇔配列
セル範囲をVariant型変数に入れる事で、配列を作成することができます。また、配列をセル範囲にまとめて出力する事も出来ます。これは、マクロVBAを高速処理したい時の必須テクニックになります、マクロの処理が遅い場合は、このテクニックが使えないか検討してください。
配列の使い方について
今回は、配列についての基礎知識をまとめました。配列とは シートのセルを考えて下さい。縦1列だけを取り出した場合は、1次元の配列です。縦横の複数行列を取り出した場合は、2次元の配列です。このようなデータを変数で扱うのが、配列になります。
VBAの配列まとめ(静的配列、動的配列)
VBAで配列を必要とするのは、処理速度を上げる為だと言えます、そもそも、エクセルにはセルの2次元配列であるシートがあります。にもかかわらず、VBAの学習を進めると必ず配列が出てきます、ではなぜVBAで配列必須になるかと言うと、セルを使うと処理速度が非常に遅く、これを高速に処理するために配列が必要となるからです。



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

複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法
文字列結合&でコンパイルエラーになる理由
手動計算時の注意点と再計算方法
VBAの用語について:ステートメントとは


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

VBAにおける変数のメモリアドレスについて|VBA技術解説(11月8日)
空文字列の扱い方と処理速度について(""とvbNullString)|VBA技術解説(1月7日)
Errオブジェクトとユーザー定義エラー|VBA入門(11月5日)
シングルクォートの削除とコピー(PrefixCharacter)|VBA技術解説(11月4日)
ユーザー定義型の制限とクラスとの使い分け|VBA技術解説(11月3日)
クリップボードに2次元配列を作成してシートに貼り付ける|VBA技術解説(11月1日)
VBAクラスを使ったイベント作成(Event,RaiseEvent,WithEvents)|VBA技術解説(10月31日)
VBAクラスのAttributeについて(既定メンバーとFor Each)|VBA技術解説(10月19日)
VBAの用語について:ステートメントとは|VBA技術解説(10月16日)
VBAのマルチステートメント(複数のステートメントを同じ行に)|VBA技術解説(10月14日)


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

1.最終行の取得(End,Rows.Count)|VBA入門
2.セルのコピー&値の貼り付け(PasteSpecial)|VBA入門
3.RangeとCellsの使い方|ExcelマクロVBA入門
4.Range以外の指定方法(Cells,Rows,Columns)|VBA入門
5.変数宣言のDimとデータ型|ExcelマクロVBA入門
6.繰り返し処理(For Next)|ExcelマクロVBA入門
7.マクロって何?VBAって何?|ExcelマクロVBA入門
8.ひらがな⇔カタカナの変換|エクセル基本操作
9.空白セルを正しく判定する方法(IsEmpty,IsError,HasFormula)|VBA技術解説
10.セルに文字を入れるとは(Range,Value)|VBA入門



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

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


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




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