学習パート
本記事のパートでは『Chapter 3 -基本/応用』を説明します。
これまでの学習パート
本学習パートまでに以下のパートを完了させましょう。
Chapter 3 -変数
変数とは
変数はVBAを使いこなすうえで切っても切れないものです。
変数を使いこなせることが出来れば、良いことが増えます。
<変数を使いこなせると良いこと>
①長いコードを省略できる
└効果:コーディングが早くなる=楽できる
②For~Nextが使用できる
└効果:とてつもないループ処理が出来る=楽できる
③IEブラウザを制御できる
└効果:Webスクレイピングができる=楽できる
すべては「楽できる 」につながります。
それでは変数とは何だ? につながりますが、
変数とは データを取り置く箱(保管BOX ) です。
その箱の形状を 型(かた) と言います。
変数が"箱"の意味
変数には情報を 取り置いておけます。
EXCEL上では「文字列 」や「数字 」を扱うと思いますが、
その情報を 箱に取り置いておくことができます。
またオブジェクトと呼ばれる「物体(※1 )」も取り置いておけます。
※1 :物体と表現したのは分かりやすくするため。
格納する情報によって、
変数 (保存BOX)の 型 (容器)は変わります 。
これはVBA側のルールとなり
型(容器)を用意することで自然に情報が整理が出来る、
といった配慮らしいです。
(JavaScriptだと 型(容器)の制限はなく、この辺は一長一短です。)
オブジェクトって何?
オブジェクトとは「様々なパーツ(情報)をまとめた集合体 」と考えましょう。
例として「車」を挙げると、
車は『エンジン』『座席』『ハンドル』などの様々なパーツで構成されています。
これをEXCELに当てはめると、
EXCELは『EXCEL本体(ワークブック)』『ワークシート』『セル』で構成されています。
オブジェクトとは、単一のパーツではなく、
パーツの複合体のことを指しているため、
専用の変数(保存BOX)を用意してあげなければならない理由 に繋がります。
変数(保存BOX)の型(かた)が変わる理由
例として「車」で説明しますと、
『車 』全体を格納するには車庫が必要 ですが、
『ハンドル 』などのパーツを保管するのには小さな倉庫 で十分です。
一方、当然ですが、小さな倉庫 には『車 』を 格納できません 。
EXCELで説明しますと、
『EXCEL 』本体を格納するには車庫が必要 となり、
『セル 』の情報を保管するのには小さな倉庫 で十分です。
同じように、小さな倉庫 には『 EXCEL 』 は 格納できません 。
パーツに応じて 型(かた)が変わるのは このような理由です。
車庫 に『セル 』は保管できないの?といった疑問がでるかもしれませんが、
結論 できません。
しかし、誤解しないで欲しいのが、
『EXCEL 』本体には『セル 』も内包しているため、
格納した車庫 には 『セル 』情報も一緒に格納されています。
要は、車庫にいれても セル情報は取り出せます。
ここで覚えておくポイントは、
パーツ集合体(※1) は 車庫 (型:Object)へ格納する 。
パーツ単品 は 倉庫(型:String 等)へ格納する 。
これを覚えておけば、万事問題ありません。
※1:EXCELにおける集合体
<集合体にあたるもの:構成要素>
EXCEL本体:EXCELブック+ワークシート+セル
ワークシート:ワークシート+セル
最初に覚えておく変数の種類は4つ
VBAでは、格納する情報に応じて、
変数(保存BOX)の型(かた)を変更してあげる必要があります。
前段で記載した
パーツ集合体(※1)は 車庫 (型:Object)へ格納する 。
パーツ単品は 倉庫(型:String 等)へ格納する 。
を元に説明すると以下の通り。
◎パーツ集合体 型
<型> <格納できるデータ>
Object EXCELブック,EXCELシート,Internet Exploreブラウザ
◎パーツ集合体 型
<型> <格納できるデータ>
Object EXCELブック,EXCELシート,Internet Exploreブラウザ
◎パーツ単品 型
<型> <格納できるデータ>
String 文字列
Long 数字
Variant 全てのデータ
たったこれだけで 十分です。
変数の種類一覧
暗記する必要 は全くありません 。
誰かが記載したVBAコードを読み解くときに、事前に知っていれば 面を食らわない・・・という程度です。
頻繁にしている可能性が高いものを紹介します。
型の名称
型の指定文字
入れることができるデータ範囲
バリアント型
Variant
すべてのデータ(型指定を省略するとこの型が自動で指定される)
文字列型
String
任意の長さの文字列
長整数型
Long
-2,147,483,648~2,147,483,647の整数
ブール型
Boolean
TrueまたはFalse
日付型
Date
日付:西暦100年1月1日~西暦9999年12月31日時刻:0:00:00 ~ 23:59:59
整数型
Integer
-32,768~32,767の整数
単精度浮動小数点数型
Single
負の値:約-3.4×10(38乗)~-1.4×10(-45乗)正の値:約1.4×10(-45乗)~1.8×10(38乗)
倍精度浮動小数点数型
Double
負の値:約-1.8×10(308乗)~-4.0×10(-324乗)正の値:約4.9×10(-324乗)~1.8×10(308乗)
オブジェクト型
Object
オブジェクト(EXCEL本体やIEブラウザなど)
尚、上記変数一覧は MicroSoft社が提供するMicrosoft Docsより説明されている
『データ型の概要』を元に サマライズしたものとなります。
変数の使用ルール
変数の型は事前に宣言する
変数は事前に宣言することで、『変数の名称』と『型(かた)』を指定できます。
<変数の宣言 方法>
Dim 変数の名称 As データ型
実際のVBEの画面を確認してしてみましょう。
Dim a as String に着目して説明します。
Dim はDimentionの略となり「次元」という意味らしいです。
本記事を書くまでは「~を宣言する」と ずっと勘違いしてました。
尚、変数は 宣言しなくても利用できますが全てVariant型になるため、
本記事ではお勧めしません。
変数への格納方法
変数への格納方法は、プロパティ構文 で行います。
※プロパティ構文を忘れた方は、
Chapter2内の「プロパティ構文とメソッド構文で覚えておくこと」を
読んでおくと良いでしょう。
要は「右のものを 左に代入する」という方向性を理解していればOK。
<変数の格納方法>
◎Object型の 場合
Set 変数の名称 = 格納したいオブジェクト
◎Object型で無い 場合
変数の名称 = 格納したい値
オブジェクトを格納するときは 頭文字に Set を付ける、と覚えれば良いです。
全体図に当てはめるとこのような形。
◎変数から取り出す方法
変数の格納は プロパティ構文のため、
カンの良い人なら 変数の取出方法も プロパティ構文と同じと考えると思います。
結論、正解です 。
オブジェクト変数(Object変数)については 、
主に EXCELファイルを複数扱う場合 やワークシート間の連携 で使用 しますので
いまは「こんな感じで使うんだー」とイメージだけ掴んでおけばOK。
※「Chapter 3 -EXCELワークシートの操作」
「Chapter 3 -EXCELワークブックの操作」で
詳細は説明します。
余談:なぜVariantを多用しないの?
Variantは便利な分、PCのメモリリソースを余計に使い、
動作が遅くなったりフリーズするリスクが高まるからです。
近年はパソコンのスペックが向上したことにより、
Variantを多用しても良いという記事を見受けられますが、
VBAでは大量のデータを扱う機会が多いため、
EXCELがフリーズしてダウンするリスクを減らすためにも、
可能な限りVariantでない変数の型を利用した方が無難と言えます。
同様のことをMicroSoft社が提供するMicrosoft Docsより説明されています。
◎引用:MicroSoft社が提供するMicrosoft Docsより
Visual Basic では、変数は、代入ステートメントで使用するだけで、暗黙的に宣言できます。 暗黙的に宣言されたすべての変数は Variant 型になります。 Variant 型の変数には、他のほとんどの変数よりも多いメモリ リソースが必要です。 変数を明示的に宣言して特定のデータ型を割り当てると、アプリケーションの効率が上がります。 すべての変数を明示的に宣言すると、名前の競合エラーやスペル ミスの発生を減らすことができます。
Chapter 3 -最終行の取得と活用
最終行の取得方法
最終行は、以下のコードで取得できます。 最終行を「変数:lastgyou」に格納しようと思います。
<最終行を取得できるコード>
Dim lastgyou as long
'A列での最終行が分かる。
lastgyou = Cells(Rows.Count, 1).End(xlUp).Row
仮に最終行が 5行目だった場合、 変数:lastgyou の中身は「5」が格納されています。
Cells(Rows.Count, 1).End(xlUp).Row でなんでA列の最終行が分かるの?
Cellsの理解が怪しいかたは、
事前に「Chapter 2 -絶対におさえておく基本知識 」で
復習することをお勧めします。
Cells(Rows.Count, 1).End(xlUp).Row を分解して解説します。
<分解して解説>
Cells(Rows.Count,1) :A列の最終行から
End(xlUP) :上へカーソルを飛ばした
Row :セルの行数を取得
まとめると、A列の最終行から 上へカーソルを飛ばした セルの行数を取得 となります。
もちろん、Cells(Rows.Count,2 )にすれば、B列の最終行も分かります。
活用例
一例ですが、
「毎日、同一EXCELシートに 継ぎ足しでデータを足していく作業」
などで活用可能です。
仮に最終行が 5行目だった場合 、
「lastgyou = Cells(Rows.Count, 1).End(xlUp).Row 」により、
変数:lastgyou の中身は「5」が格納されているため、
Cells(lastgyou+1,1)とすれば 、Cells(6,1) となることから、
最終行(5行目)の次にあたる6行目の制御が可能 です。
Sub Macro1()
Dim lastgyou As Long
'A列での最終行が分かり 変数lastgyouに格納される。
lastgyou = Cells(Rows.Count, 1).End(xlUp).Row
'A列の最後尾にC1セルの値を追加する
Cells(lastgyou + 1, 1).Value = Cells(1, 3).Value
End Sub
Chapter 3 -EXCELワークシートの操作
ワークシート操作を簡単なコードから学ぶ
さっそくですが、ワークシート操作について、
「Range("A1").value = "おはよう"」で説明します。
実は、
「Range("A1").value = "おはよう"」は
VBAの自動判別機能により、
「ActiveSheet .Range("A1").Value = "おはよう"」
と解釈され、コードが実行されています。
ActiveSheet って何?となりますが、
現在アクティブなEXCELシート という意味になります。
このActiveSheet の箇所を
「Worksheets("シート名") 」で置き換えてあげれば、
自在にEXCELシートを行き来したデータのやり取りが可能となります。
例えば、このような感じです。
Worksheets("Sheet1").Range("A1").Value = "おはよう"
当然 シート名がSheet2 だった場合は、以下の通りです。
Worksheets("Sheet2").Range("A1").Value = "おはよう"
ワークシート自体の制御方法(追加・削除など)
EXCELのワークシートの操作も可能です。
例えば、シートの追加・シートの削除です。
操作内容
コード
属性
例
例の意味
選択
Select
メソッド(SV型)
-
-
選択
Activate
メソッド(SV型)
-
-
名前変更
Name
プロパティ
Worksheets("Sheet1").Name = "新シート名"
Sheet1を"新シート名"にする
削除
Delete
メソッド(SV型)
Worksheets("Sheet1").Delete
Sheet1を削除
追加
Add
メソッド(SV型)
Worksheets.Add
先頭にシートを追加
メソッド(SVO型)
Worksheets.Add Before:=Sheets("シート名")
"シート名"の前に追加
メソッド(SVO型)
Worksheets.Add After:=Sheets("シート名")
"シート名"の後ろに追加
移動
Move
メソッド(SVO型)
Worksheets.Move Before:=Sheets("シート名")
"シート名"の前に移動
メソッド(SVO型)
Worksheets.Move After:=Sheets("シート名")
"シート名"の後ろに移動
コピー
Copy
メソッド(SVO型)
Worksheets.Copy Before:=Sheets("シート名")
"シート名"の前にコピー
メソッド(SVO型)
Worksheets.Copy After:=Sheets("シート名")
"シート名"の後ろにコピー
シートを削除(Delete)する場合の警告を出さない方法
手作業でシート削除する際、エラーアラートが出ると思います。
VBA でシートを削除する際も 同様で、エラーアラートが発生 します。
エラーアラートの発生都度、
自動化した作業が止まってしまうのは本意ではないため、
エラーアラートが発生しない設定をコード内に埋め込みます。
<対象コード>
<対象コード>
Sub macro1()
'最初、削除の警告を出さないようにする
Application.DisplayAlerts = False
~実行VBAコード~
'最後、削除時のエラーアラートが出るように戻しておく
Application.DisplayAlerts = True
End Sub
Application.DisplayAlerts は、
EXCELというアプリケーションの画面警告 という意味で、
Falseは「無効化」、Trueは「有効化」となります。
プロパティ構文(※1 )の考え方で十分理解できますね。
※1 :左辺を右辺の状態にする。
実際の使用例を紹介します。
この方法はそのままマネることをお勧め します。
(偉大なる先日たちの置き土産です)
<実例>
Sub Macro1()
'削除時のエラーアラートを出さないようにする
Application.DisplayAlerts = False
'Sheet1を削除
Worksheets("Sheet1").Delete
'削除時のエラーアラートが出るように戻しておく
Application.DisplayAlerts = True
End Sub
なぜ最後に「エラーアラートが出るように戻しておく」のかというと、
手作業のEXCEL操作時も設定は有効になっているからになります。
エラーアラートが無効なままにしておく と、
手作業 で誤クリック した際、直接 削除されてしまい危険 です。
Chapter 3 -フルパス
フルパスとは?
フルパスとは、ファイルやフォルダの置き場所のことです。
フルパスが分かると何ができるか
フルパスが分かると、以下のことができます。
<フルパスが分かると出来ること>
・ファイルを開く
・ファイルを保存する
等
フルパスは右クリックでも分かる
対象フォルダ・ファイルの上で、
右クリック → プロパティでも 出てきます。
フルパスはVBAコードでも知ることが出来る
フルパスを取得できるコードの一例として、
以下をご紹介します。
<フルパス取得コード>
Sub Macro1()
'変数を宣言
Dim fullpass1 As String
'実行中のマクロが記録されているフォルダまでのパス
fullpass1 = ThisWorkbook.Path
'A2に記載
Range("A2").Value = fullpass1
End Sub
Chapter 3 -EXCELワークブックの操作
ワークブック操作を簡単なコードから学ぶ
さっそくですが、ワークブック操作について、
「Range("A1").value = "おはよう"」で説明します。
実は、
「Range("A1").value = "おはよう"」は
VBAの自動判別機能により、
「ActiveWorkbook .ActiveSheet .Range("A1").Value = "おはよう"」
と解釈され、コードが実行されています。
ActiveWorkbook って何?となりますが、
現在アクティブなEXCELブック(本体) という意味になります。
このActiveWorkbook の箇所を
「Workbook("ブック名.拡張子") 」で置き換えてあげれば、
既に開いているEXCELファイル であれば、
自在にEXCELとEXCEL間を 行き来したデータのやり取りが可能となります。
例えば、「えくせる1号.xlsm」と「エクセル2号.xlsx」という
2つのEXCELファイルが開いている状態で、
それぞれ「おはよう」と「ありがとう」を入力すると以下の通りになります。
◎「えくせる1号」のシート「てすと1」のA1セルに「おはよう」を入力したい場合
Workbooks("えくせる1号.xlsm").Worksheets(“てすと1").Range("A1").Value = "おはよう"
◎「エクセル2号」のシート「テスト2」のA1セルに「ありがとう」を入力したい場合
Workbooks(“エクセル2号.xlsx”).Worksheets(“テスト2”).Range(“A1”).Value = “ありがとう"
EXCEL が開かれていない場合はどうやって制御するの?
前段で学んだ「フルパス」の知識がここで役に立ちます。
結論 、EXCELが開いてなければ 開けば良い のです。
<EXCELファイルを開く方法>
Workbooks.Open "フルパス\ファイル名.拡張子"
Chapter 3 -オブジェクト変数
Chapter 3 -変数で 既にオブジェクト変数については説明していますが、 このタイミングで改めて説明します。
オブジェクト変数とは?
EXCELブック、EXCELシートを格納できる変数です。
※IEブラウザも格納できますが、ここでは説明しないため割愛
オブジェクト変数への格納方法
オブジェクトを変数に格納する場合、プロパティ構文 で行います。
※プロパティ構文を忘れた方は、
Chapter2内の「プロパティ構文とメソッド構文で覚えておくこと」を
読んでおくと良いでしょう。
要は「右のものを 左に代入する」という方向性を理解していればOK。
<オブジェクト変数の格納方法>
◎Object型の 場合
Set 変数 = 格納したいオブジェクト
※事前にDim 変数 As Object で宣言することを忘れずに。
EXCELファイルはオブジェクト変数に格納できる
いちいち 長文のコード書いてられないよ・・・という方は、
オブジェクト変数を用いればスピードアップができます。
◎省略してみるコード
Workbooks("通常EXCEL.xlsx").Worksheets("Sheet1").Range("A1").Value = "おはよう"
◆省略方法ーその1
Sub 省略方法①()
'変数を宣言
Dim wb1 As Object
'変数を事前にセット(事前に扱うEXCELファイルが決まっている場合有効)
Set wb1 = Workbooks("通常EXCEL.xlsx")
'「ワークブック」の箇所を省略できる
wb1.Worksheets("Sheet1").Range("A1").Value = "おはよう"
End Sub
◆省略方法ーその2
Sub 省略方法②()
'変数を宣言
Dim wb1 As Object
'変数を事前にセット(事前に扱うEXCELファイル+シートが決まっている場合有効)
Set wb1 = Workbooks("通常EXCEL.xlsx").Worksheets("Sheet1")
'「ワークブック」と「ワークシート」の箇所を省略できる
wb1.Range("A1").Value = "おはよう"
End Sub
Chapter 3 -EXCELを開く閉じる
EXCELを開く
Chapter3 フルパスで説明してますが、
「Workbooks.Open」と「フルパス¥ファイル名.拡張子」 を用いれば
EXCEL本体を開くことができます。
<EXCELファイルを開く方法>
Workbooks.Open "フルパス\ファイル名.拡張子"
EXCELを上書き保存
「Save」メソッドを使用すれば、上書き保存ができます。
<EXCELファイルを上書き保存する方法>
Workbooks("ブック名").Save
EXCELを閉じる
「Close」メソッドを使用すれば、閉じることができます。
<EXCELファイルを閉じる方法>
Workbooks("ブック名").Close
注意点:保存しないで閉じるとシステムダイアログが邪魔する
手動で確認してみると、
EXCELの内容を更新し 保存せずに ファイルを閉じようとすると
以下のようなダイアログが出現すると思います。
簡単に解決する手法は、
Workbooks("ブック名").Save
Workbooks("ブック名").Close
の順にVBAを実行すれば良いです。
他の解決方法も、せっかくなので紹介します。
知らなく良い知識ですがスマートな書き方です。
参考程度に見ればOKです。
<他の解決方法>
◎1つのコードで上書き保存+閉じるをしたい場合
'変更を上書き保存し閉じる ※ダイアログは出ません
Workbooks("対象ブック名").Close SaveChanges:=True
◎変更を保存せずに閉じたい場合
'変更を保存せずに閉じる ※ダイアログは出ません
Workbooks("対象ブック名").Close SaveChanges:=False
Chapter 3 -マクロ実行ボタンを作成
作成したマクロが、ボタン1つで作動できるよう、
マクロ実行ボタンを作成しましょう。
<作成手順>
①「開発」タブをクリック
②「挿入」ボタンをクリック
③「ボタン」をクリック
④ マウスをドラッグしボタンを作成
⑤ 実行させたいマクロを選択
⑥ OK をクリック
⑦ ボタンが出来ているのを確認
⑧ ボタン上で右クリック→テキスト編集で 名前は変えられます
Chapter 3-ここまでの知識を実践
ここまで学習した方は、以下のことが出来ます。
<今できること>
・EXCELを開く ー workbooks.Open "フルパス\ブック名"
・EXCELを保存する ー Workbooks("ブック名").Save
・EXCELを閉じる ー Workbooks("ブック名").close
・EXCELにデータを入力 ー 対象ブック.対象シート.対象セル = 値
・EXCEL内のデータを削除 ー 対象ブック.対象シート.対象セル = ""(空欄)
・マクロ実行ボタン作成
<今できること>
・EXCELを開く ー workbooks.Open "フルパス\ブック名"
・EXCELを保存する ー Workbooks("ブック名").Save
・EXCELを閉じる ー Workbooks("ブック名").close
・EXCELにデータを入力 ー 対象ブック.対象シート.対象セル = 値
・EXCEL内のデータを削除 ー 対象ブック.対象シート.対象セル = ""(空欄)
・マクロ実行ボタン作成
個人的な感想ですが、
上記の内容が出来れば 会社内で十分に活躍できると思います。
(Chapter 4 -深堀は、活躍できる幅を広げるパート。ifとかは知っておくと作業効率化の幅が広がります。)
EXCEL間データ連携を実践してみる
EXCEL「Book1.xlsx 」と「Book2.xlsx」を
マクロ「マクロ.xlsm」を用いてデータ連携していきます。
作成する手順は、以下の通りでおこないます。
<マクロ作成手順>
①操作対象EXCELを開く
↓
②実行したい内容を記述・作成する
└今回は、
Book1.xlsxのA1セル情報を
Book2.xlsxのB1セルに転記します。
↓
③保存・閉じる
└情報を更新したBook2.xlsx は保存+閉じる。
情報は未更新のBook1.xlsx はそのまま閉じる。
実際にコードを記載します。
コード内コメント=「' (アポストロフィ)」の横に記載された文章は
VBA上非参照として扱われますので、思い出しておきましょう。
◎変数を利用しないコードの書き方
Sub 実践してみる()
'①操作対象EXCELを開く
Workbooks.Open "W:\Desktop\Book1.xlsx"
Workbooks.Open "W:\Desktop\Book2.xlsx"
'②実行したい内容を記述・作成する
'└Book1.xlsxのA1セル情報をBook2.xlsxのB1セルに転記します。
Workbooks("Book2.xlsx").Worksheets("sheet1").Range("B1").Value = Workbooks("Book1.xlsx").Worksheets("sheet1").Range("A1").Value
'③保存・閉じる
'└情報を更新したBook2.xlsx は保存 + 閉じる。
'情報は未更新のBook1.xlsx はそのまま閉じる。
Workbooks("Book2.xlsx").Save
Workbooks("Book2.xlsx").Close
Workbooks("Book1.xlsx").Close
End Sub
◎変数を使用するコードの書き方
Sub スマートに実践してみる()
'変数を宣言
Dim wb1 As Object 'Book1格納用
Dim wb2 As Object 'Book2格納用
'①操作対象EXCELを開く
Workbooks.Open "W:\Desktop\Book1.xlsx"
Set wb1 = ActiveWorkbook 'Open後はBook1がアクティブになっている
Workbooks.Open "W:\Desktop\Book2.xlsx"
Set wb2 = ActiveWorkbook 'Open後はBook2がアクティブになっている
'②実行したい内容を記述・作成する
'└Book1.xlsxのA1セル情報をBook2.xlsxのB1セルに転記します。
wb2.Worksheets("sheet1").Range("B1").Value = wb1.Worksheets("sheet1").Range("A1").Value
'③保存・閉じる
'└情報を更新したBook2.xlsx は保存 + 閉じる。
'情報は未更新のBook1.xlsx はそのまま閉じる。
wb2.Close SaveChanges:=True '上書き保存で閉じる
wb1.Close
End Sub
Chapter 3-終わりに
以上でChapter3が終了です。
かなりのボリュームで疲れた方もいるかもしれません。
それでも マクロについて かなり理解できたのではないかと思います。
また、ここまでの学習でも、
人によっては かなりの作業を圧縮できるアイデアが
生まれているのではないでしょうか。
Chapter4 以降は VBAコードの深堀をしていくパートとなります。
特に IF文(条件式)や置換 は有用度が高いものとなるので、
引き続き頑張っていきましょう。
次学習パートへ