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

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

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

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


以下の10個の必須基本例文を読めて書ければ概ねVBAの基本は出来ますといえるレベルと言って良いでしょう。

基本例文を何度も読んで、何度も書いてみると、いつの間にかVBAが身近な言語となっていきます。

以下では、VBAの解説はごく簡単な説明にとどめています。
細部について、あれこれこだわるより、何度も書いて動かしてみて下さい。
動かすときは、ステップイン(F8)で実行してください。
デバッグの基礎
・デバッグとは ・論理エラーと文法エラー ・イミディエイトウィンドウ ・ブレークポイント ・ステップ実行 【ここでのポイント】 あまりにも範囲が広いためどこまでが出題範囲なのか悩ましいてころです。デバッグそのものを問う問題だとしても例文にVBAコードが存在する場合はそもそもVBAの基礎そのものが問われることになります。
コーディングとデバッグ
効率的なコーディングと、プログラム作成では避けて通れないデバッグについて説明します。また、陥りやすい間違い、よくやってしまう間違い等も説明しておきます。効率的なコーディング モジュールの移動 コール先のSubプロシージャーやFunctionプロシージャーに移りたい場合があります。
シートの状態と変数の状態を良く確認しながら進めて下さい。

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


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は繰り返し処理をするためのステートメントで同じ処理を複数回繰り返したい場合に使います

第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 条件式3が真…

第22回.条件分岐(Select Case)
前回のElseIf以外の、多肢条件分岐の別の書き方があります。それがSelectCaseになります。むしろElseIfより、このSelectCaseの方が、より多肢条件分岐に適していると言えます。SelectCaseは、多肢条件分岐に特化したステートメントになります。
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セルにコピー貼り付けする場合 Range(_A1_)…

第41回.セルのコピー&値の貼り付け(PasteSpecial)
値の貼り付けと題しましたが、値だけではなく、「形式を選択して貼り付け」のいろいろな指定方法です。セルをコピーして、他のセルに「形式を選択して貼り付け」する場合のマクロVBAコードになります。セルの値や書式を別のセルコピーすることはマクロVBAでは定番かつ必須の技術になります。

第42回.セルをコピーするとは
セルをコピーするとは、どういう事でしょうか… セルをコピーするというマクロVBAを少し掘り下げて考えることで、より実践的なマクロVBAコードを書くことが出来るようになります。コピーと一言で言っているものは、何のコピーを指しているのでしょうか。
6.ワークシート関数
Sub example6()
  Dim i As Long
  On Error Resume Next
  For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
    Cells(i, 2) = WorksheetFunction.VLookup( _
          Cells(i, 1), Range("E:F"), 2, False)
  Next
  On Error GoTo 0
End Sub

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

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

第87回.WorksheetFunction(ワークシート関数を使う)
VBA関数以外に、Excelワークシート関数をマクロVBAで使うことが出来ます、ワークシート関数は、VBA関数よりはるかに多くの関数があるので、ぜひ活用したいところです。。ワークシート関数を使う事で、VBAコードを非常に簡潔に記述することが出来る場合が多いものです。
7.オブジェクト変数
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ステートメント ファイルを開いてファイルへ入出力できるようにします。

第117回.ファイル操作Ⅱ(Line Input #)
VBAでファイル(CSV等)を扱う時は最初にファイルを開き次に読込書込みを行い最後にファイルを閉じます。ファイルを読み込む時にLineInput#ステートメントを使います。LineInput#ステートメント シーケンシャル入力モード(Input)で開いたファイルから行全体を読み込み文字列型(String)の変数に代入するファイル入出力ステートメントです。

第118回.ファイル操作Ⅱ(Print #)
VBAでファイル(CSV等)を扱う時は最初にファイルを開き次に読込書込みを行い最後にファイルを閉じます。ファイルを書き込む時にPrint#ステートメントを使います。Print#ステートメント シーケンシャル出力モード(OutputまたはAppend)で開いたファイルにデータを書き込むファイル入出力ステートメントです。

第119回.ファイルシステムオブジェクト(FileSystemObject)
FileSystemObjectオブジェクトでは、コンピュータのファイルシステムへのアクセスが提供されています。VBAに用意されているファイル操作関連のステートメントや関数より、より強力で、より多くの機能が搭載されています。ただし、機能が大変多いため、これらを全て覚えるという事は困難です。

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


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

第111回.静的配列
配列は、値を格納するために多くの区画を持つ1つの変数です、集合住宅やアパートにたとえられますが、要は、変数の箱を複数つなげたものと理解すれば良いでしょう。1つの箱には、1つの値しか入れられませんが、その箱が複数つながっていますので、結果として、複数の値をいれられるのが配列という事になります。

第112回.動的配列(ReDim)
静的配列では配列の要素数は宣言時点で決められていましたしかしプログラミングをする上で実行時点で要素数を決めたい場合や実行途中で増やしたい場合が多くあります。実行時点で要素数を増減できるのが動的配列になります。ReDimステートメント 動的配列変数に対するメモリ領域の再割り当てを行います。

第113回.配列に関連する関数
配列を使う上で必要となるVBA関数がいくつかありますより便利に配列を活用するために必須となるVBA関数について解説します。LBound関数 配列の指定された次元で使用できる最小の添字を長整数型(Long)の値で返します。LBound(arrayname[,dimension]) arrayname 必ず指定します。

第114回.セル範囲⇔配列
セル範囲をVariant型変数に入れる事で、配列を作成することができます。また、配列をセル範囲にまとめて出力する事も出来ます。これは、マクロVBAを高速処理したい時の必須テクニックになります、マクロの処理が遅い場合は、このテクニックが使えないか検討してください。

配列の使い方について
今回は、配列についての基礎知識をまとめました。配列とは シートのセルを考えて下さい。縦1列だけを取り出した場合は、1次元の配列です。縦横の複数行列を取り出した場合は、2次元の配列です。このようなデータを変数で扱うのが、配列になります。

VBAの配列まとめ(静的配列、動的配列)
VBAで配列を必要とするのは処理速度を上げる為だと言えますそもそもエクセルにはセルの2次元配列であるシートがあります。にもかかわらずVBAの学習を進めると必ず配列が出てきますではなぜVBAで配列必須になるかと言うとセルを使うと処理速度が非常に遅くこれを高速に処理するために配列が必要となるからです。



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

シートに数式を設定する時のセル参照の指定方法
標準モジュールとシートモジュールの違い
オートフィルタ(AutoFilter)の使い方まとめ
複雑な条件(複数除外等)のオートフィルター(AutoFilter)
クリップボードを使わないセルのCopy
Rangeの使い方:最終行まで選択を例に
フルパスをディレクトリ、ファイル名、拡張子に分ける
Colorプロパティの設定値一覧
VBAを定型文で覚えよう
VBAこれだけは覚えておきたい必須基本例文10
エクセルVBAでのシート指定方法


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

CSVの読み込み方法(ジャグ配列)|VBAサンプル集(7月15日)
その他のExcel機能(グループ化、重複の削除、オートフィル等)|VBA入門(7月14日)
オートフィルタ退避回復クラスを複数シート対応させるVBAクラス|VBA技術解説(7月6日)
オートフィルタを退避回復するVBAクラス|VBA技術解説(7月6日)
IfステートメントとIIF関数とMax関数の速度比較|VBA技術解説(6月23日)
Withステートメントの実行速度と注意点|VBA技術解説(6月6日)
VBA+SeleniumBasicで検索順位チェッカー(改)|VBA技術解説(6月2日)
マクロでShift_JIS文字コードか判定する|VBA技術解説(6月1日)
Shift_JISのテキストファイルをUTF-8に一括変換|VBAサンプル集(5月31日)
「VBAによる解析シリーズその2 カッコ」をやってみた|エクセル(5月21日)


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

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



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

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


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




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