Excelマクロ「セルの入力」

前回、「セルの選択」をやりましたので、今回は選択したセルへ何かを入力してみます。

この「入力」という処理ですが、厳密に言うと「セルへの代入」という考え方をします。
VBAではこの「代入(だいにゅう)」という考え方が重要で、常に使います。
そして「代入」のルールはただ一つ、「右辺を左辺に代入する」ということだけです。

今回の場合、セルA1に「この文字列を代入」と入力します。

このサンプルコードをコピペし、実行してみましょう。
こうなりましたか?

「Cells(1,1)」ですが、「セルの選択」でも書いた通り、書き方は色々です。
Range(“A1”)でもOKです。

さて、これも代入なので、右辺を左辺に代入しています。
右辺 =「”この文字列を代入”」
左辺 =セルA1

「”~”」のことを、ダブルコーテーションと言います。
VBAでは、ダブルコーテーションで囲まれた文字列には意味があります。

試しに、これを実行してみましょうか。(「この文字列を代入」がダブルコーテーションで囲まれていません)

なにも起きないですね・・。

しかし、実はこれ、何も起きていないのではなく、ちゃんと処理されています。

答えを先に言うと・・
「この文字列を代入」を”~”で囲むと、文字列として扱われる
「この文字列を代入」を”~”で囲まないと、「変数」として扱われる
のです。

「変数」??
「変数」は、代入される対象の「ハコ」とご理解ください。

(本来、教科書的には、変数は「Dim~」で宣言しなくてはならない!とかなる、あれです。宣言しなくても、変数になるのです。)

試しに、こうすると解ります。

どうですか?解りましたか??
わからない場合は、こうしてみましょう。

つまり、下記で「何も起きない」ように思えたのは、実は変数が空っぽだったから、です。

何も起きなかったのではなく、実際にはブランクがセルA1に入力されていました。

まとめますと・・

  1. 文字列を代入する場合は、右辺を”~”(ダブルコーテーション)で囲む
  2. ダブルコーテーションで囲まないと、変数になる(なってしまう)

さて、面倒な話をします・・。
これを実行してみましょう。

こうなりますよね。

文字列の場合、ダブルコーテーションで囲む/囲まないで結果が異なったのに、数字の場合は結果が同じになりました。

これは「1」は変数として扱われないことを意味します。
VBAでの変数名にはルールがあり、Helpを見たのですが正直何言ってるのかわからん・・ので、ここでは「数字で始まる変数名は禁止」と覚えましょう。

 

Excelマクロの目次へ戻る

 

Excelマクロ「セルの選択」

Excelマクロで「セルを選択」してみます。
ご存知の通りエクセルは、ブック、シート、セルから成っており、セルを選択(=指定)して、値を入力したり、値を読み取ったり、セルに色を付けたりと、セル選択はVBAで欠かすことのできない基本的な処理です。

ただ、ひとくちに「セル選択」と言っても、実は方法が色々あります・・。
サンプルコード↓では、3種類の方法を例として挙げています。

はい、念のためですが、実行の仕方は以下の通りです。くわしくはこちら

  1. 新規Excelファイルを作る(.xlsmで保存する)
  2. エディタを起動する([Alt]+[F11]が簡単)
  3. 「標準モジュール」を挿入する
  4. その上で、上記のサンプルコードをコピペし、
  5. マクロの実行!([Alt]+[F8]→[Enter]が便利)

こんな画面になりましたか??

3つの例を挙げていますが、ひとつずつ説明しましょう。

まず 「Range(“A1”).select」 から。
日本語に翻訳すると「A1の範囲を選択しなさい」です。

「Range(“A1”)」が「A1の範囲」
「.(ピリオド)」が(言うなれば)「を(かな?)」
「Select」が「選択しなさい」
(あるいは、「~.Select」が「~を選択しなさい」かな?)

これは比較的、直感的にわかりやすいかもしれませんね。ただし、慣れてくるとあまり使いません(私はね。)。
なぜなら、行・列を番号化して扱った方が、色々都合が良いからです。

次、「Cells(2,1).Select」です。
これが上記で述べた、「行・列を番号化して都合良く記述する」例です。私はほとんどこれを使います。
同じく翻訳すると、「行=2、列=1のセルを選択しなさい」です。「Cells(?,?)」の場合、お約束として「Cells(行番号,列番号)」となります。

少しわき道に逸れますが、エクセルでの「行と列」、正しく理解していますか?決まり事なので、これを機に覚えましょう。
「行」=下方向に行くもの(常に、数字で行番号が表されているやつです)
「列」=右方向に行くもの(デフォルトでは、A、B、Cで列番号が表されているやつです)

ついでに覚えると便利なのが英語です。
「行」=Row(ロウ)
「列」=Column(コラム?カラムかな?)

最後、「Selection(2,2).Select」です。
これは少しトリッキーなのですが、慣れると便利で、非常によく使います。
翻訳すると、「いま選択しているセルを基準として、行=2、列=2のセルを選択しなさい」です。「Selection(?,?)」の場合も「Cells(?,?)」と同様、「Selection(行番号,列番号)」となります。

もう少し丁寧に説明すると、こうなります。
「Selection(2, 2).Select」が処理される時点(正確には、処理される直前)の「いま選択しているセル」は、セルA2です。
なぜなら、その直前に「Cells(2, 1).Select(行=2、列=1、つまりセルA2を選択しなさい)」を処理しているからです。
そして、「セルA2を基準として行=2、列=2に該当するのはセルB3」であるためです。
ここ、非常に重要です!

「Cells(?,?)」と「Selection(?,?)」の違いは、なにを基準とするかです。
「Cells(?,?)」は、常に「セルA1」を基準とします。
「Selection(?,?)」は、「いま選択しているセル(「ActiveCell」と言います)」を基準とします。

私はセル選択については、ほぼこの2つ(「Cells(?,?)」と「Selection(?,?)」)しか使いません。これでほぼ充分です。

ほか、たまに使うのは「範囲選択」です。
Excelの通常作業では、「範囲選択」は普通によく使うと思いますが、VBAでは実はあまり使いません。
なぜなら、「範囲選択してどんっ(と処理)!」というマクロはあまり使わず、「この範囲のそれぞれのセルについて(ループを使って)処理」というマクロが多くなるためです。

とは言え、範囲選択も使わないわけではないので、説明します。
書き方は、概ね2通りです。

Range(Cells(1,1),Cells(9,9)).Select
Range(Selection(1,1),Selection(9,9)).Select

基本構文は、「Range(セル指定① , セル指定②)」です。
そして、セル指定①と②に囲まれた範囲が選択されます。
そして、セル指定の仕方は、「Cells(?,?)」と「Selection(?,?)」です。

当然、以下のような書き方もアリですが、前述の通りあまり使いません。

Range(“A1″,”I9”).Select

以上、「セル選択」でした。

 

Excelマクロの目次へ戻る

 

Excelマクロの基本構造

エクセルマクロを、ごくシンプルに説明すると、以下の構造になります。

  1. 処理の部分
  2. 条件分岐
  3. ループ

「処理」とは、命令のことです。Excelに「あれしなさい」「これしなさい」を伝えます。

余談ですが、Excelマクロを作っていると自分の意図しない動作をしてくれちゃうことがあります。「あー、そうじゃないんだよー・・。なんでそうするかなぁ」みたいなことを独り言でいいますw
しかし自分が書いたプログラムをよく見返すと、Excelが間違えていることは、まずありません(ごく稀にありますが。それをいわゆる「バグ」と言います)。自分の意図しない結果を返した場合は、疑うのはマシンではなく、人間です。

「条件分岐」は、「もし○○だったら」で分岐させます。分岐させた上で、「処理」を命令します。

「ループ」は、繰り返しです。
この繰り返しこそ、エクセルマクロをはじめとするプログラミングが最も得意とする部分です。Excelマクロでも、人間では絶対に不可能な速さでループさせることができます。

以下に例を3つ挙げます。

例①は、処理だけしかない例です。
こんなケースはめったに無いですが、まったく無いわけではないです。

例②は、いわゆる「if文」を使った分岐の例です。
条件分岐には「if」のほかに「Select Case」がありますが、この2つだけ覚えて使い分けができれば良いだけです。

例③は、典型的なマクロの構造です。ほとんどのマクロがこの構造になると思います。
ループには「For~Next」文や「Do」系などいくつかあります。しかし私は「For~Next」が好きなので、ほぼそれしか使いませんw

・・と言うわけで、ここまでをまとめます。

  1. Excelマクロは、「処理」「条件分岐」「ループ」から構成されている
  2. 条件分岐は「if」文と「Select Case」を、ループは「For~Next」を覚えれば良い。それで(良し悪しは別として)少なくても私のレベルには到達できます。つまり、一般的なビジネス利用において困ることは無いレベル、お仕事を極めて効率化できるレベルです。

では、肝心な「処理」は?
これは非常にたくさんあるので、書ききれません。

しかし、これは「良い方法」があるので大丈夫です。
むしろ、その「良い方法」を活かすためには、条件分岐とループが使えることがキモなのです。
その方法とは「マクロの記録」なのですが、また今度。

なお最後に非常に重要なことですが、Excelマクロは必ず「上から下」に流れます。
必ず「Sub」から始まり、上から下に進んでいき、「End Sub」で終わります。
ただしループの場合だけは、その区間だけループします。これをお忘れなく。

 

Excelマクロの目次へ戻る

Excelマクロ準備編

なにはともあれ、Excelマクロを使うための準備です。
既にExcelマクロを使える人は、スキップOKす。特にコツとかはありません。

ちなみに、私はExcel2016なので、バージョンが異なる場合は多少読み替えが必要かもしれません。あしからず。

準備の手順は以下の通りです。

  1. Excelファイルを作る(「Excelマクロ有効ブック」)
  2. VBEの起動
  3. 「標準モジュール」の挿入
  4. Sub~End Sub

まずファイルを作ります。
昔は通常のブックで保存できましたが、いつからかマクロ付のExcelファイルは「Excelマクロ有効ブック=*.xlsm」という拡張子になりました。
それを忘れて普通に「xlsx」で保存すると、せっかく作ったマクロが使えませんので、私は最初に「xlsm」で保存するようにしています。

次にマクロ=プログラミング文を記述する先である、VBE(Visual Basic Editor)を起動します。
・・と思ったら、VBEって名前じゃないんですね。
正確には「Microsoft Visual Basic for Applications」とのこと・・。

まあ面倒なので、VBEでいいや・・。
これは、[ALT]+[F11]で覚えると便利です。
その場合、以下の手順で「標準モジュール」というのを挿入します。

さらに、右側の画面にマクロ名称(この場合は「マクロテスト」)を入力すると、準備完了。

[ALT]+[F11]を使わない場合は、メニュー「表示」―リボン「マクロ」―[マクロの表示]で、マクロ名称を入力し「作成」をクリック。
今回は「マクロテスト」という名前のマクロを作ります(後で変更可能)。

すると、「標準モジュール」が追加され、「マクロテスト」という名前で、本文の準備が完了します。

Excelマクロ、「Sub」で始まり「End Sub」で終わります。
そして、プログラミング文は、「Sub」と「End Sub」の間に記述します。

これで準備完了です。

試しに、ひとつマクロを実行してみましょう。

上記のサンプルコードを、下記のようにコピペしてみましょう。

そして、Excel画面へ戻り、

[Alt]+[F8]あるいは、[表示]―[マクロ]―[マクロの表示]で、

[実行]をクリック!(あるいは、[Alt]+[F8]で、[Enter]が便利です)
すると、一瞬で以下のような画面になります。

たった5行のコードですが、ご覧の通り「9×9」の表ができあがりました。わぉっ!

 

Excelマクロの目次へ戻る

Excelマクロを使おう!

Excelマクロ。
私が持つスキル・知識・経験の中で、最も市場価値が高いものの1つ。(?)
この項のテーマは、以下の通りです。

  1. かんたんに、ずぼらに・・(これ、最重要!)
  2. あくまで私の自己流ですが・・(でも大丈夫!ちゃんと動きます!)
  3. 誰でも使えるようになる!

ただし、対象者は「ある程度、Excelの知識がある人」です。
モノサシとしてよく使われる「VLOOKUP関数を使える人」がイメージです。

その理由は以下の通りです。(あくまで一般論です)

  • Excel関数やExcel標準機能でできることは、関数/標準機能でやった方が良い
  • Excelマクロは「上記でできないこと」、あるいは「上記でできるけど、繰り返しが発生する(ことが見込まれる)」場合にその効果を発揮します

なお、「ちゃんとした」Excelマクロには、いろいろ「お作法」があります。
例えば、「変数は必ず「宣言」しなくてはならない!(Dim~みたいなやつですな)」とか。
そういうのは、コードを見やすくする効果は否定しないのですが、私は無駄だと思うので省きます。それが自己流かつ、ズボラたる所以です・・。

あと、「メソッド」とか「プロパティ」とかを覚えなくては!とか。
実は20年近くExcelマクロを使っていますが、この2つはいまだによくわかりません・・。「なんとなく。」で行けるので、大丈夫です!w

最後に。
いまどき、Excelマクロが使えても、実はあんまり誰も褒めてくれません・・。便利なのですが・・。
でも、Excelに埋もれて困っている人は、この世にたくさんいると思います。
そんなあなたに、Excelマクロを使って欲しいと思います。

大丈夫。かんたんですから。

 

Excelマクロの目次へ戻る