[VBA解説]セルのもう一つの指定方法[#4]

記事
IT・テクノロジー
前回の記事はこちら

前回の問題の解説

さて、前回の問題は解けましたでしょうか。
ちなみに修正前は以下のようなコードでした。

Sub あいさつを入力する謎マクロ()
    Dim あいさつ As String
    あいさつ = おはよう
    Range("C1").Value = あいさつ
End Sub

これを修正すると、こうなります。

Sub あいさつを入力する謎マクロ()
    Dim あいさつ As String
    あいさつ = "おはよう"
    Range("C1").Value = あいさつ
End Sub

「あいさつ」という変数に、「おはよう」という文字列を代入したいので、「おはよう」が文字であることを示すために、""で囲う必要がある、というものでした。

最初は""で囲うのに慣れないかもしれませんが、忘れないようにしましょうね。

というわけで、今回のメインの内容に移ります!

Rangeは「セル」という意味ではない

さて、皆さんに謝らなければいけないことがあります。
「Rangeはセルという意味だよ」と言ってきましたが、嘘です。
厳密には、「Rangeは範囲」です。(ただ日本語訳しただけですが)

どういうことかと言うと、Rangeはセル一つを指定するために使われるのではなく、「複数のセルの集まり(つまり範囲)を指定出来るもの」なんです。

例えば、A1セルからA3セルを指定したければ、
Range("A1:A3")
と書くことで、複数のセル範囲を指定出来ます。

では、VBAで「セル」を意味する単語は何かと言えば、
Cells
なんですね。
そして、Cellsを使ってA2セルを表す場合、
Cells(2,1)
と表現します。
A3セルの値を利用したい場合は、
Cells(3,1).Value
と表現します。

違いとしては、
Rangeは()の中が""で囲われた文字列(アルファベットと数字の組み合わせ)だったのに対し、
Cellsは()の中が2つの数字で、1つ目の数字が行を、2つ目の数字が列を表すものだということです。

A2セルなら、2行目の1列目なので(2,1)
B5セルなら、5行目の2列目なので(5,2)
と書きます。

「"A2"とか"B5"みたいに書くほうが分かりやすい!」
と思われそうですが、実はRangeのこの書き方だけだと面倒なこともよくあります。

ひとまず、
「セルを指定する方法にはRangeとCellsがあるんだな」
「RangeとCellsではセルの指定方法が異なるんだな」

と覚えておき、どちらも使えるようにしておきましょう。

ちなみにCellsを使えば、変数を使ったセルの指定も簡単に出来ます。

Sub Cellsを使ったセル指定
    Dim rowLong As Long
    Dim colLong As Long
    rowLong = 5
    colLong = 10
    Cells(rowLong, colLong).Value = "VBA楽しんでますか?"
End Sub

これで、5行目、10列目のセルに”VBA楽しんでますか?”という文字が入力されます。つまり、J5セルですね。

ちなみに変数名の付け方ですが、僕はよく「メインの意味」と「型」を組み合わせて付けたりします。
行は英語でrowで、Long型変数なのでrowLongとすることが多いです。
列は英語でcolumn(カラム)で、Long型変数なのでcolLong、としています。

さらに省略してrやcと表記する人もいますが、あまり短すぎる変数名は分かりにくくなるので個人的にはオススメしません。

日本語で表記するのもありですが、入力方式を変数名を入力するたびに英数やかな入力に変更するのも面倒なんですよね。

というわけで、今回は「セルのもう一つの指定方法」として、Cellsの使い方を紹介してみました。

少しボリューム的に物足りない気がするので、おまけに「Debug.Print」というものを紹介して、今回は終わりたいと思います。

Debug.Printを使ってミスを見つける!

以前、ステップインという機能を紹介しました。F8キーを押すことで、コードを1処理ずつ実行していくものでしたね。

他にもコードのミスを発見する方法があり、便利なのがDebug.Printです。
こんな風に使います。

Sub Debugを試す()
    Dim cost As Long
    cost = Cells(1,1).Value
    Debug.Print cost
End sub

このように、
Debug.Print 変数
Debug.Print Cells(1,1).Value
と書くことで、「その変数やセルにどんな値が入っているのか」を確認出来ます。
で、その際に変数の値が表示される場所が、これまで見向きもしなかった、「イミディエイトウィンドウ」という場所になります。
イミディエイトウィンドウ.png
おそらくデフォルトだと、VBEの画面右下、コードを書いている部分の下に、「イミディエイト」という名前が付いたウインドウがあるはずです。

この部分を「イミディエイトウィンドウ」と言い、Debug.Printで変数の中身を表示したり、この部分にコードを直接書いて、計算したりも出来ます。

ひとまず、「イミディエイトウィンドウと言うんだな」「Debug.Print以外にも、色々出来ることがあるんだな」程度で大丈夫です。
気になる方は他にどんなことが出来るのか、調べてみて下さい。

コードが長くなってきたり、変数の数が多くなってきたりすると、どの変数にどんな値が入っているのか、把握しきれなくなってきたりするんですよね。
そのような時に、コードの要所要所にDebug.Printを書いておき、どこでどのような値が入っているかを確認するようにすると、ミスに気付きやすくなります。

例えば
Debug.Print "costの値:" & cost
こんな風に、文字列と変数を「&」を使って繋げて表示することも出来ます。
するとイミディエイトウィンドウの表示は以下のようになります。
文字列結合.png
変数の値のみを表示するのと比べて、「何の値が表示されているか」が見やすくなりますよね!
この
"文字列" & 変数
のような書き方は、文字列同士や変数同士、文字と変数をくっつける時に使います。

これもよく使うものですが、忘れてしまっても調べればすぐに分かると思うので、「そういうことも出来るんだな~」程度で流して大丈夫です。

「VBA 文字 くっつける」
とかで検索すれば出てくるはずです。

次回予告

さて、ここまででも色々な言葉が出てきましたね。
VBA、マクロ、VBE、コード、変数、型、演算子、ステップイン、Debug.Printなどなど…

実はこれまでに紹介した内容だけでも、簡単なマクロは作れてしまいます。
ただ、ここから紹介する内容を利用することで、対応出来る幅がぐんと広がります。

そのうちの一つが、「IF文」、もう一つが「For文」です。
この2つを理解し、これまでに紹介してきた内容に組み込むことで、手作業でやってきたかなりのことを自動化出来ます。

VBAを学習する上で、ここが一つの山場になると思いますので、ぜひ頑張って下さい!
では、今回もお疲れさまでした!

今回の内容で、理解しにくかった部分、質問したい部分がある方は、有料サポートをご活用下さい。出来るだけ迅速に、丁寧に対応致します。
次の記事はこちら

サービス数40万件のスキルマーケット、あなたにぴったりのサービスを探す