エクセルマクロ&VBA初心者超入門講座(2)【セルの操作をマスターしよう】

エクセルマクロにおけるコレクションの例

はじめに

前回は、エクセルでマクロ(VBA)を書くための下準備を行いました。

まだ、マクロを書くためのエクセルの設定が済んでいない方はお手数ですが、エクセルマクロ&VBA初心者超入門講座(1)【開発環境の準備】をご覧下さいませ。

今回はセルの操作を徹底的に学びます。

エクセルはセルに始まりセルに終わるといっても過言ではありません(本当かよ!)。

まあ(↑)の言葉が本当かどうかは別にしても、セルの操作を自由自在にできないようでは、実用的なマクロを組むことはできません。

で、セルの操作を勉強する前にエクセルマクロ&VBAの基礎知識をみっちり学びます。

具体的には「コレクション」・「オブジェクト」・「プロパティ」という用語を完璧に理解するところから始めます。

それが終わったら、セルを自由自在に操るための各種技術をあますところなく解説します。

まだ、「エクセルマクロ&VBA初心者超入門講座」の2回目ですが、この記事に書いてあることをマスターすれば、一気に高みに登ることができると言えましょう!

ちょっと長めになりますが、一緒にエクセルVBAを学んでいきましょう!

懇切丁寧に超わかりやすく解説するので安心して下さいね!

エクセルのマクロ編集画面を立ち上げる(前回の復習)

開発タブ]を選択し[Visual Basic]をクリックします。

※まだ開発タブをまだ表示されていない場合は「エクセルマクロ&VBA初心者超入門講座(1)【開発環境の準備】」をご参照下さいませ。

エクセルでマクロを書くために開発タブからVisual Basicをクリックする。

 

VBEの画面に移動したら、[Sheet1(Sheet1)]を右クリックします。

 

ee3

 

次に[コードを表示]をクリックします。

マクロ(VBA)を書くための準備。

 

すると下記のような画面になります。これでマクロ(VBA)を書く準備は完了です。

 

ee2

 

「オブジェクト」・「プロパティ」・「コレクション」を理解しよう

このセクションでは「オブジェクト」・「プロパティ」・「コレクション」といったちょっと抽象的でややこしいお話をします。

確かに「なんとなく動くマクロを作る」ならば、「オブジェクト」・「プロパティ」・「コレクション」といった概念を理解していなくてもエクセルVBAは使いこなせます。

しかし、少し遠回りにはなりますが「オブジェクト」・「プロパティ」・「コレクション」といった概念を理解した上でマクロを勉強すると、「なんとなく」ではなく確実に動作する力強いプログラムを書くことができるようになります。

なた「オブジェクト」・「プロパティ」・「コレクション」を理解していないと、応用的なマクロを組む際に必ずつまづきます。

そういった意味でも、基礎的な概念をしっかりおさえておく方が、返って実力をつける近道になるはずです。

このような理由から、「オブジェクト」・「プロパティ」・「コレクション」について、しっかりと解説するところから始めたいと思います。

「急がば回れ」と言いますからね!

さて、

オブジェクトという概念はとても抽象的なのでわかりにくいかもしれません。

例を挙げて説明しましょう。

例えばエクセルの1つ1つのセルはオブジェクトです。

またエクセルのワークシートもオブジェクトです。

あるいはブックもオブジェクトですし、エクセルそのものもオブジェクトです。

要はオブジェクトとはエクセルを構成する各「部品」のようなものです。

前回の講座では、A1セルに数値や文字列を代入する方法を学びました。

例えば以下のようなマクロを学びましたね。

Range(“A1”)は【A1セル】という「オブジェクト」を表しています

また全てのオブジェクトは「プロパティ」を持っています

Valueはセルオブジェクトが持つ代表的なプロパティです。

プロパティを日本語で表すと「属性」といった意味になります。

もう少しオブジェクトとプロパティ(属性)の関係をよく理解するために身近なモノを例に説明してみます。

例えば、今仮に、「スマートフォンオブジェクト」があるとしましょう。

スマートフォンオブジェクトには色・容量・メーカーといったプロパティ(属性)があるといった具合です。

以下のようなマクロはエクセルには存在しませんが、もしスマートフォンオブジェクトがあるとするとこんな感じにコードを書きます。

SmartPhone.Maker = “Apple”

SmartPhone.ProductName = “iPhone”

SmartPhone.Color = “Black”

SmartPhone.Price = 39000

SmartPhone.Storage = “128GB”

黄色のマーカーで表した部分が、SmartPhoneオブジェクトのプロパティです。

同様に、Range(“A1”).Value = 100と書いた場合、Range(“A1”)がA1セルを表すオブジェクトで、ValueがA1セルのを表すプロパティです。

セルオブジェクトにはValueだけではなく様々なプロパティが用意されています。

図示するとこんな感じです。

エクセルにおけるオブジェクトとプロパティの関係

では、ここで問題です。

と書いた場合、Range(“A1”)はどのワークシートの「A1セル」でしょうか?

 

答えは、アクティブなシート(今選択しているシート)のA1セルです

もし今選択しているワークシートかどうかに関わらず、特定のワークシートを指定して、そのシートのA1セルに100という値(Value)を代入したい場合は以下のように書きます。

このマクロを実行すると確かにSheet2のA1セルに「100」という値が代入されていることがわかります。

ワークシート2のA1セルに100と代入されている様子

上述のサンプルコードは、

Worksheets(“Sheet2”)のRange(“A1”)のValueに100を代入する」という意味のマクロです。

完全に日本語訳すると、

Sheet2という名前のワークシートのA1セルの値に100を代入する」という意味になります。

ちなみにこうしたマクロのことを正式名称ではVBAステートメントと呼びます。

VBAステートメント」とは、「VBAというプログラミング言語で書かれた文」という意味ですね。

このVBAステートメントにはどのような「オブジェクト(=部品)」と「プロパティ」が含まれているでしょうか。

  1. ワークシートオブジェクト「Worksheets(“Sheet2”)
  2. セルオブジェクト「Range(“A1”)
  3. 値プロパティ「Value

オブジェクトはこのように親子関係を持っているのです。図解してみましょう。

エクセルVBAにおけるオブジェクトの親子関係

これでなんとなくエクセルのマクロ(VBA)におけるオブジェクトとプロパティの関係はイメージできたのではないでしょうか。

ここで、おおまかなエクセル・オブジェクト(部品)について親子関係の全体像を図示してみたいと思います。

エクセルのオブジェクトにおける親子関係図

さて先ほどの、「指定したワークシートのA1セルに100という値をセットする」マクロをもう少し詳細に分析してみましょう。実は、先のVBAステートメントの中にコレクションという概念を理解するのに、うってつけの部分があるんです。

Worksheets(“Sheet2”)という部分に着目して下さい。

よく見ると、Worksheetではなく、Worksheetsと複数形になっていますよね?

実はWorksheetsというのはコレクションなんです。

コレクションとはオブジェクトの集合体のことです

Worksheetsは全てのワークシートオブジェクトが入っている箱のようなものです。

エクセルマクロにおけるコレクションの例

コレクションは上記のようなイメージになります。

(1)、(2)、(3)と番号がふってありますよね?

Worksheetsコレクションに限らず、コレクションの中に入っているオブジェクトを表すには2通りの方法があるのです。

  • コレクションの中身にアクセスする方法1:ワークシート名で指定する。(例)Worksheets(“Sheet1”)
  • コレクションの中身にアクセスする方法2:何番目かを番号で指定する。(例)Worksheets(1)

例えば、Worksheets(2)と書くと、右から数えて2番目のワークシートを意味します。特にワークシートの名前を、最初の状態から変更していない場合は、Worksheets(2)Worksheets(“Sheet2”)は同じワークシートオブジェクトを意味します。

サンプルコードを見てみましょう。

【2番目のワークシート(Sheet2)のB1セルに値100をセット】

 

余裕のある方はこのサンプルコードを下記の画面のように写して、[再生ボタン]か[F5キー]を押して下さい。

 

VBEにExcelマクロのサンプルコードを入力し実行する様子。

 

【実行結果】

Worksheetコレクションの2番目のB1セルに値をセットした結果画面。

 

尚、マクロを含むExcelファイルを保存する際は、[Excelマクロ有効ブック(xlsm)]として保存するのを忘れないようにして下さいね。

<参考画像>

マクロを含むExcelファイルの保存方法

 

また他にも代表的なコレクションとして、Workbooksコレクションがあります。

これは読んで字の如く、エクセルのブックオブジェクトの集合体です。

例えば以下のようなVBAステートメントを書くと、たった1行で全てのブックを閉じることができます。

ここでCloseに注目して下さい。

Closeはもちろんコレクションではありません。オブジェクトでもありません。またプロパティでもありません。

Closeメソッドなんです。

メソッドとは「何を、どうする」の「どうする」に該当する部分です。

上記のサンプルコードを和訳すると、「全てのワークブックを閉じる」となります。

大雑把な言い方ではありますが、基本的にエクセルのマクロ(VBAステートメント)は以下の2通りの書き方に大別できます。

  • どんなオブジェクトの、どんなプロパティに、どんな値を設定するか?
  • 「何をどうするか?」

ここでもう一つ、「何をどうする?」系のサンプルコードを見てみましょう

ちなみにマクロ中にプログラムの実行には一切影響しないコメントを書くことができます。

これをコメントアウトと呼びます。

コメントアウトの文法は以下の通りです。

‘任意のコメント

ちょっと見ずらいですが半角のシングルクォーテーション「」に続いて、VBAステートメントの説明などを書き加えることができます。

話は脇道にそれますが、プログラミングの流儀としてコメントはなるべく書くようにして下さい。

コメントを書くべき3つの理由

  • 半年後とかに自分が書いたマクロを読むときにおおいに助けになる。
  • ExcelのプログラミングではRange(“A1”)等と、セルをA1、B10等と呼ぶので、そのセルがどういう意味を持ったセルなのか非常に分かりにくい。だからセルの持つ「意味」をコメントで明記した方が便利。
  • 自分以外の人がコードを読むときに、理解の助けになる。

では話を元に戻してサンプルコードの説明をしますね。

Worksheets(1).Range(“A1”).Value = “Excelマクロ最高!”はおなじみのVBAステートメントですね。

どんなオブジェクトの、どんなプロパティに、どんな値を設定するか?」系のマクロです。

具体的には、

右から数えて1番目のワークブックオブジェクトのA1セルの値に”Excelマクロ最高!”という文字列をセットする」

という意味です。

ちなみに、単にWorksheetsとだけ書いた場合はコレクションです。

で、WorkSheets(1)とかWorkSheets(“Sheet1”)等と書いた場合は具体的なオブジェクトです。

同様に単にWorkbooksと書いた場合はコレクションです。

一方、Workbooks(1)とかWorkbooks(“売上伝票.xlsx”)等と書いた場合は具体的なオブジェクトです。

次のWorksheets(1).Range(“A1”).ClearContentsこそ「何をどうする?」系のVBAステートメントです。

和訳すると、

右から数えて1番目のワークシートのA1セルの中身を削除する」という意味です。

従って、上記のサンプルコードを実行すると、A1セルに値が代入された直後に、A1セルの内容を削除するので、結局、A1セルは空っぽのままになります。

 

ところで、

 

ここでこんな疑問を感じる方もいらっしゃるかもしれません。

 

「え?セルオブジェクトの値を削除するんでしょ?だったらさ。Range(“A1”).ClearContentsじゃなくてさ、Range(“A1”).Value.ClearContentsって書くべきじゃね?」

 

結論から申し上げますと、ClearContentsメソッドは、Rangeオブジェクトに対してしか使うことができない決まりになっているのです。Valueプロパティに対してCrearContentsメソッドを使うことは文法上できないのです。

で、Rangeオブジェクトとは何かというと、今まで「セルオブジェクト」と表現してきたもののことです。

 

正式にはExcelのセルは全てRangeオブジェクトという名前のオブジェクトなのです。

 

今までセルオブジェクトという表現を用いてきたのは、説明の便宜上、なるべくわかりやすくするために、あえて不正確な用語を用いてきたわけです(「紛らわしいな」と感じた方、ごめんなさい!!)。

これからは、

セル=Rangeオブジェクト

と覚えていただければと思います。

これは非常に重要な用語ですので、忘れないようにしていただければと思います。

ここまでのまとめ

●Excelの各「部品」のことをオブジェクトと言う。

●オブジェクトには親子関係がある。(例)Worksheets(1).Range(“A1”)

●オブジェクトはプロパティという名前の属性を持っている。例えばセルを表すRangeオブジェクトであれば、「」・「」・「背景色」等様々な属性を持っている。

●オブジェクトの集合体をコレクションと呼ぶ。例えばWorkbooksはブックオブジェクトのコレクションであり、Worksheetsはワークシートオブジェクトのコレクションである。そして、コレクションに格納されているオブジェクトを表すには、Workbooks(1)のように数値を指定するか、Worksheets(“Sheet1”)のように具体的な名称を指定する。

●エクセルのマクロの一文、一文のことを正式にはVBAステートメントと呼ぶ。

●VBAステートメントには大別して「どんなオブジェクトのどんなプロパティにどんな値を設定するか」という形式のものと、「何をどうする」という形式のものがある(但し、これらに該当しない形式のVBAステートメントも存在する)。

●「何をどうする」の「どうする」にあたる部分をメソッドと呼ぶ。(例)Range(“A1”).CrearContents「A1セルの中身を削除する」

●エクセルでマクロを書く際は、なるべくコメントを付けるようにする。コメントは「‘(シングルクォーテーション)」に続けて書く。コメントアウトの内容はプログラムの動作に一切影響を与えない。

全てのセルはRangeオブジェクトである

●エクセルのマクロはSub 好きな名前()で始まり、End Subで終わる。但し、Sub~End Sub以外の開始と終了を意味する記号も存在する。それらについては追って解説する。

●マクロを含むExcelファイルを保存する際は、Excelマクロ有効ブック(xlsm)形式で保存する。

ちょっと休憩「プログラミング上達のポイント」

早速、セル=Rangeオブジェクトの使い方をドシドシ説明していきたいところですが、その前にプログラミング上達の基本的なポイントをご紹介します。

なぜなら、本稿はプログラミング未経験者を主な対象にしているからです。

要は、Excelマクロに限らず、プログラミング全般に共通する勉強法のコツですね。

プログラミング勉強法のポイント1:写経する

サンプルコードをただ目で追って理解するだけでは、プログラミングの学習効率はガクンと下がってしまいます。

「習うより慣れろ」ではありませんが、まずはサンプルコードを実際に手を動かして写し取り、動かしてみることが大切です。

写経することで、頭だけではなく「手」でもプログラミングを学習することができます。

プログラミングの勉強法のポイント2:改造する

サンプルコードを写経するだけでは面白みがありませんね。写経が済んだら、自分の今の知識できる範囲で、サンプルコードを改造すると実力がつきやすいです。

Rangeオブジェクトを自由自在に操作しよう

単一のセルを操作する

CellsとSelectメソッド

単一のセルの操作は今までさんざんやってきましたね。でもまだ紹介していないものもあるので、まずは単一のセルを操作する様々な方法をマスターしましょう。

セル=Rangeオブジェクト」を表す代表的な方法は2種類あります。

  1. Range(“セル名”)
  2. Cells(行番号, 列番号)

それではサンプルプログラムを見ていきましょう。

Range(“A1”).Value = “VBA”はもうおなじみすぎて説明する必要はありませんね。

Cells(2,2)Range(“セル名”)と同様に、「セル=Rangeオブジェクト」を表します。

文法はCells(行番号, 列番号)なので、Cells(2, 2)は2行目のB列を表します。

Cells(2,2)が指し示すセル

 

そして、Selectメソッドは「セルをアクティブにする」という意味です。従ってこのマクロの実行結果は下記のようになります。

 

cells2

Cells(行番号, 列番号)もRange(“セル名”)と同じくらい頻繁に使うことになります。

セルに名前をつけてRangeで指定する

セルには名前をつけることができます。手順は以下の通りです。尚、画像内の表は適当に作成したものです。

エクセルのセルに名前をつける

任意のセルを右クリックして[名前の定義(A)…]を選択します。そして…

 

セルに名前をつける

 

名前():]欄に「売上合計」と入力し[OK]をクリックします。

 

range2

するとC6セルに「売上合計」という名前がつきます。このセルの名前の定義を利用してセルを指定することもできます。

上の表を再現する必要はありません。どのセルでも構わないので、適当なセルに「売上合計」という名前をつけた上で下記のサンプルコードを実行してみて下さい。

例えばC6セルに”売上合計”という名前を定義した場合以下のような実行結果になります。

名前を定義したセルにRangeを用いて値をセットする

このようにセルの名前を定義することのメリットはプログラムが読みやすくなる点にあります。

Range(“C6”).Value = 7350というマクロを見ても、いったいC6セルが何を意味するのか分かりません。

しかし、Range(“売上合計”).Value = 7350というVBAステートメントならば、何をしているか一目瞭然ですね。

このようにセルに名前を定義して、Rangeで指定する方法は、状況によっては非常に便利です。

セルをコピーする2つの方法

セルをコピーするには2通りの方法があります。

先ずは書式も含めてセルをコピーする方法をご紹介します。

書式を含めたセルのコピー

サンプルコードの解説をしますね。

今回のポイントはズバリ「引数(ひきすう)」です。

引数(ひきすう)とは簡単に言えば、メソッドに渡す値のことです。

と言ってもピンとこないかもしれませんね。

Range(“B2”).Copyは「何をどうする」系のVBAステートメントですよね?

でも「B2セルをコピーする」という情報だけでは、「どこに?」コピーするのか分かりません。

そこで引数(ひきすう)の登場です。

Destination:=コピー先のセル

と引数を指定してあげることで「どこに?」コピーするのかがわかります。

ちなみにDestinationを和訳すると「宛先」という意味です。

エクセルのマクロで引数を指定するときは、引数名:=値という書式を用います。

尚、引数名はDestinationだけではなく、メソッドごとに様々な種類があります。

Copyメソッドの場合、引数名Destinationで、Rangeオブジェクト、つまりコピー先のセルになります。

理解を助けるために、ここでもう一度、Copyメソッドの使い方をまとめておきましょう。

エクセルマクロにおけるCopyメソッドの書式

しかし実は、「引数名」を指定せずに、「引数」を指定するようなメソッドも存在したりします。

ちょっとややこしいですよね。でもすぐ慣れるのでだいじょうぶですよ!

Destinationのような引数名を指定しないで、引数をとるマクロの例を見てみましょう。

このサンプルコードの実行結果は以下のようになります。

エクセルマクロでMsgBoxメソッドを利用する例

このサンプルでは、MsgBoxメソッド“こんにちは”という引数を渡しています。

実は引数名も存在するのですが、この例では引数名を省略しているのです。

もし引数名を省略せずにMsgBoxメソッドを使うと以下のようになります。

この例では2つの引数をMsgBoxメソッドに渡しています。

Prompt:=はメッセージボックスに表示する文字を意味する引数名です。

Title:=はメッセージボックスのタイトルに表示する文字を意味する引数名です。

1つのメソッドに複数の引数を渡す場合は(,)で区切ります。

実行結果は以下の通りです。

エクセルマクロにおけるMsgBoxに2つの引数を指定した例

なんとなく「メソッドに引数を渡す」という概念の意味が理解できたのではないでしょうか。

さて冒頭でセルのコピーには2通りの方法があると申し上げました。

もう1つのセルのコピー方法を解説しますね。

今度は書式などは無視して、値だけをコピーする方法です。

これは説明する必要がないほど簡単ですね。

Range(“D2”).ValueつまりD2セルの値にB2セルの値を「=」を使って代入しただけです。

この場合、書式は無視され、「値」だけがコピーされます。

実行結果は以下の通りです。

エクセルマクロで値だけをコピーする例

おわりに

だいぶ長くなってしまったので「エクセルマクロ&VBA初心者超入門講座(2)【セルの操作をマスターしよう】」はこの辺りで終わりにしたいと思います。

今回はExcelマクロの基礎の基礎を中心に解説しました。

  • オブジェクト
  • コレクション
  • プロパティ
  • メソッド
  • 引数

といった概念を理解すれば、この先、Excel VBAの理解がぐっと楽になります。

次回、エクセルマクロ&VBA初心者超入門講座(3)もよろしくお願い申し上げます。

【関連記事】

エクセルマクロ&VBA初心者超入門講座一覧に戻る

[AD]ExcelVBAのプログラミングのツボとコツがゼッタイにわかる本

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA