ALL EXCEL Program VBA VBA-1週間で分かる

【Chapter 3-基本/応用】超初心者から始めるEXCEL VBA【1週間で分かる】

非表示にできる< 目次 >

学習パート

本記事のパートでは『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」に格納しようと思います。

<最終行を取得できるコード>

仮に最終行が 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行目の制御が可能です。

Chapter 3 -EXCELワークシートの操作

ワークシート操作を簡単なコードから学ぶ

さっそくですが、ワークシート操作について、
「Range("A1").value = "おはよう"」で説明します。
 
実は、
「Range("A1").value = "おはよう"」は
VBAの自動判別機能により、
ActiveSheet.Range("A1").Value = "おはよう"」
と解釈され、コードが実行されています。
 
ActiveSheet って何?となりますが、
現在アクティブなEXCELシート という意味になります。
 
 
このActiveSheetの箇所を
Worksheets("シート名") 」で置き換えてあげれば、
自在にEXCELシートを行き来したデータのやり取りが可能となります。
 
例えば、このような感じです。 

当然 シート名がSheet2 だった場合は、以下の通りです。

ワークシート自体の制御方法(追加・削除など)

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シートを削除する際も同様で、エラーアラートが発生します。
 
エラーアラートの発生都度、
自動化した作業が止まってしまうのは本意ではないため、
エラーアラートが発生しない設定をコード内に埋め込みます。
 
<対象コード>
Application.DisplayAlerts は、
EXCELというアプリケーションの画面警告 という意味で、
Falseは「無効化」、Trueは「有効化」となります。
プロパティ構文(※1)の考え方で十分理解できますね。
 ※1:左辺を右辺の状態にする。
 
実際の使用例を紹介します。
この方法はそのままマネることをお勧めします。
(偉大なる先日たちの置き土産です)
 
<実例>
なぜ最後に「エラーアラートが出るように戻しておく」のかというと、
手作業のEXCEL操作時も設定は有効になっているからになります。
 
エラーアラートが無効なままにしておくと、
手作業誤クリックした際、直接 削除されてしまい危険です。

Chapter 3 -フルパス

フルパスとは?

フルパスとは、ファイルやフォルダの置き場所のことです。

フルパスが分かると何ができるか

フルパスが分かると、以下のことができます。

<フルパスが分かると出来ること>
 ・ファイルを開く
 ・ファイルを保存する
  等

フルパスは右クリックでも分かる

対象フォルダ・ファイルの上で、
右クリック → プロパティでも 出てきます

フルパスはVBAコードでも知ることが出来る  

フルパスを取得できるコードの一例として、
以下をご紹介します
 
<フルパス取得コード>

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セルに「おはよう」を入力したい場合

◎「エクセル2号」のシート「テスト2」のA1セルに「ありがとう」を入力したい場合

EXCEL が開かれていない場合はどうやって制御するの?

前段で学んだ「フルパス」の知識がここで役に立ちます。
 
結論EXCELが開いてなければ 開けば良いのです。
 
 <EXCELファイルを開く方法>

Chapter 3 -オブジェクト変数

Chapter 3 -変数で 既にオブジェクト変数については説明していますが、
このタイミングで改めて説明します。

オブジェクト変数とは?

EXCELブック、EXCELシートを格納できる変数です
 ※IEブラウザも格納できますが、ここでは説明しないため割愛

オブジェクト変数への格納方法

オブジェクトを変数に格納する場合、プロパティ構文で行います。
 ※プロパティ構文を忘れた方は、
  Chapter2内の「プロパティ構文とメソッド構文で覚えておくこと」を
  読んでおくと良いでしょう。
 
要は「右のものを 左に代入する」という方向性を理解していればOK。
 
<オブジェクト変数の格納方法>
Object型の場合
 Set  変数 = 格納したいオブジェクト
 ※事前にDim 変数 As Object で宣言することを忘れずに。

EXCELファイルはオブジェクト変数に格納できる

いちいち 長文のコード書いてられないよ・・・という方は、
オブジェクト変数を用いればスピードアップができます
 
◎省略してみるコード

◆省略方法ーその1

◆省略方法ーその2

Chapter 3 -EXCELを開く閉じる

EXCELを開く

Chapter3 フルパスで説明してますが、
「Workbooks.Open」と「フルパス¥ファイル名.拡張子」 を用いれば
EXCEL本体を開くことができます
 
 <EXCELファイルを開く方法>

EXCELを上書き保存

「Save」メソッドを使用すれば、上書き保存ができます
 
 <EXCELファイルを上書き保存する方法>

EXCELを閉じる

「Close」メソッドを使用すれば、閉じることができます
 
 <EXCELファイルを閉じる方法>  

注意点:保存しないで閉じるとシステムダイアログが邪魔する

手動で確認してみると、
EXCELの内容を更新し 保存せずに ファイルを閉じようとすると
以下のようなダイアログが出現すると思います

簡単に解決する手法は、
  Workbooks("ブック名").Save  
  Workbooks("ブック名").Close  
の順にVBAを実行すれば良いです。
 
他の解決方法も、せっかくなので紹介します。
知らなく良い知識ですがスマートな書き方です。
参考程度に見ればOKです。

<他の解決方法>

◎1つのコードで上書き保存+閉じるをしたい場合

◎変更を保存せずに閉じたい場合

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上非参照として扱われますので、思い出しておきましょう。

◎変数を利用しないコードの書き方

◎変数を使用するコードの書き方

Chapter 3-終わりに

以上でChapter3が終了です。
 
かなりのボリュームで疲れた方もいるかもしれません。
それでも マクロについて かなり理解できたのではないかと思います。
 
また、ここまでの学習でも、
人によっては かなりの作業を圧縮できるアイデアが
生まれているのではないでしょうか
 
Chapter4 以降は VBAコードの深堀をしていくパートとなります。
特に IF文(条件式)や置換 は有用度が高いものとなるので、
引き続き頑張っていきましょう。

次学習パートへ




  • この記事を書いた人

Nakamura(nkmr)

NakamuraBlog(ナカログ)運営 [ 2.5万PV/月 ] │ブロガー│ 【経歴】IT会社に新卒入社 ▶︎ 通用しない ▶︎ プログラミングに出会う ▶︎ 年間1億円以上のコスト削減プログラムを開発 ▶︎ 会社賞受賞 ▶︎ 少しでも世の中の苦しんでる私と似た人に役に立てればと思いブログを開設。 ● 文系がプログラムと出会って会社員人生が変わった人。 ● 2020年より「嫁を置いて1人旅」の旅動画を投稿開始。

-ALL, EXCEL, Program, VBA, VBA-1週間で分かる
-, , , ,