VBA-7事例をもとに変数がコードの中でどうやって機能するのか紹介

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

変数は色々なプログラミング言語で使われている機能です

本記事では取得した最終行と最終列をどうやってコードに展開するのかを説明させていただきます。

その中で前回記事との関連から変数という要素を織り交ぜながらコードを書いていきます。

EnjoyExcel
EnjoyExcel

変数はとても便利な機能です。

どのプログラミング言語でも使う機能ですので非常に重要です。ここで覚えてしまいましょう。

変数はコードの中で値を変えられる要素です。うまく使うと出来る事が各段に増えます。

この記事を読むと変数を使ってデータの最終行と最終列をコードに落とし込む方法が分かる様になります。

参考情報になりますがここで1つモチベーションが上がる話をしておきます。

変数という要素はほとんどのプログラミング言語で出てきます。

つまり変数を覚えると他の言語についても勉強している事になります。

各言語ごとに文法は少し違いますが理屈は同じです。使える様に勉強していきましょう。

前回の記事

前回は最終行と最終列を取得する方法を紹介しました。終盤Cells(行,列)のような不思議なコードを使いました。

上記コードについては今回の記事内で説明していきます。

本記事での課題

今回の課題です。

EnjoyExcel
EnjoyExcel
課題

変数を使ってみよう

初心者向けエクセルマクロ学習シリーズ

最終行、列をコードへ展開する

本記事はシリーズで展開しています。前回記事で変数について少し触れました。

今回はその続きで話を展開していきます。(スキル次第ですが前回記事を読まずに本記事を読む事は可能です)

取得した最終行と最終列をコードに展開する具体的な方法

前の記事ではCells(行,列)というコードが出てきました。

Cellsプロパティで行列を指示するはずが何故か漢字がセットされていました。

これで最終行と最終列が表現出来ているのでしょうか?

以降で取得した最終行と最終列ってどうやってコードに展開するの?というところを説明していきます。

以下のようなデータを用意しました。Range(“A1:F7”)に情報が居ます。

「あ」という文字が書いてあります。

この値を全て「おはようございます」に変えたいと思います。

その為にはリストの最終行と最終列を取得し交点であるF7を取得する必要があります。

ではコードを書いてみましょう。最終行と列を取得するコードでは行には7、列には6がセットされます。

最終行と最終列の取得方法が分からない方は前回記事をご覧ください

このコードは間違いがあります
Option Explicit

Sub 最終行と最終列()
'最初に書いておきますがこれはエラーになるコードです
'ここはVBA-8 で説明しますのでそのまま書いてください

Dim 行 As Long
Dim 列 As Long

'最終行と最終列を取得するコードです 行は7、列は6になるはずです
行 = Cells(Rows.Count, 1).End(xlUp).Row
列 = Cells(1, Columns.Count).End(xlToLeft).Column

'行は7、列は6が返ってくるので範囲の終点に行と列の値を入力してみましょう
Range("A1:67") = ”おはようございます”

End Sub

続いて最後のコードです。

Range(“A1:F7”) = “おはようございます” の様に範囲をダブルクォーテーションで囲むという書き方です。

範囲をもったセルに対して指示を出す時のコードはこうでしたね。(シリーズ5番目の記事に記載があります

ではこれを Range(“A1:67”) = ”おはようございます” にしたらどうなるか・・・

結論としてはNGです。このコードは間違っているのでエラーメッセージが出ます

こうなります。Range・・・のコードがエラーになります。ちなみに「実行時エラー1004」は何でしょうか?

実行時エラー1004はいろんな要因があります。今回は「コードが成立してなくて値が取得できない」と言ってます。

コードの書き方が間違っているのではないかと推測する事になります。

エラーメッセージは不親切です

「推測する事になります」と書いたのは理由があります。

エラーメッセージはピンポイントに「〇〇が間違ってますと伝えてくれません。

よってエラーの内容から間違いを推測するしかない為です。

コードの色が変わり「この辺のどこかが間違っているよ」とは教えてくれます。

しかしピンポイントで何が悪いのかまでは教えてくれません。

この辺はネットで調べたり経験でカバーするところです。ではコードの話に戻ります。

今まで習ったことを思い出してみる

Range(“A1”) = “おはようございます” というコードは既に使用実績があるのでエラーは出ないはずです。

Rangeオブジェクトの引数は「A1」という書き方で単数セルを表現するのみであれば問題なさそうです。

そうなると怪しいのはセルを範囲指定する際の終点の要素である「F7」の表現が間違っているかもしれません。

今まで習った事でできる事はないか考えてみましょう。VBA-5の記事にヒントがあります。

Rangeオブジェクトは始点と終点を別々に決められる

VBA-5の記事の中でRange(“A1″,”F7”)という書き方をしています。

Rangeオブジェクトで範囲を指定できています。始点と終点の各セルをダブルクォーテーションで挟んでいますね。

この書き方はA1とF7を別々にダブルクォーテーションで挟んでいます

セル範囲の始点であるA1と終点のF7を分けて書いてもコードとして成立しているという事になります。

一方Cellsプロパティでは列を表現する際英語を使いません。よって最終的に行、列の表現は数値しか使いません。

という事は前回勉強した Cells(行,列)の形なら番号だけでセルを表現できそうです。

まとめるとこうなります。

  • セルの始点と終点は別々に指示できる
  • Cellsプロパティを使えばセルを数値だけで指示できる

2つのポイントをふまえて作業してみましょう。A1はそのままでF7だけCellsプロパティを使って書き換えてみます。

Range(“A1”,cells(7,6)) = “おはようございます”

これなら終点だけCellsプロパティを使って数値だけでセルを表現できます。

加えてエラーにもならないコードを書く事が出来ます。

要するにRange(始点はRangeで表現,終点はCellsで表現)という建付けでセルを表現しました。

では実際にコードを書いて実行してみましょう。エラーが出ないと良いですね。

私はコード実行できました。エラー出ませんでしたがいかがでしょうか?これならコードとしては成立するはずです。

残問題

しかし問題点はクリアになっていません。上記コードではCells(7,6)と書いています。

自分で値を見て7と6を直書きしているので状態としては変わりません。

見たものを書いているので出来るのは当たり前です。

コードの中で取得した行、列を自動でCellsプロパティに展開する必要があります。

そうしないと毎回手動で数値をコードに書かないといけないです。

という事は依然として不十分なコードだと言えます。何か良い手を探す必要があります。

変数を使う

ここでやっと表題欄でお知らせした「変数」という優秀な機能の登場です。

色々な値を格納したり次の工程に送る等情報のつなぎ役をしてくれます。

見やすいようにコードから抜き出しました
  • 行 = Cells(Rows.Count, 1).End(xlUp).Row
  • 列 = Cells(5, Columns.Count).End(xlToLeft).Colum

「行」や「列」という文字は実は変数です。変数というのは色々な情報が入る箱です。

今回は「行」という箱と「列」という箱が用意されたのだと思ってください。

この箱に行番号や列番号をセットすると以降のコードで非常に便利な使い方が出来る様になります。

上記コードの意味は以下の通りです。

  • 変数「行」に最終行の行番号を代入する
  • 変数「列」に最終列の列番号を代入する

コードを実行して取得出来たのが7行目、6列目だったとしましょう。

以前説明した左辺に右辺を代入の原則からいくと 「行=7」、「列=6」 という数値が代入されます。

これをRange・・・のコードに置き換えるとRange(“A1”,cells(行,列))という書き方が出来ます。

これだったら取得された行、列がどんな数字であっても大丈夫です。

変数が一旦値を受けて次のコードに値を転用してくれるのでどんな値が来ても対応出来る様になります。

具体例を提示

まだイメージ湧かないと思いますので一通りコードを書いてみます。

Option Explicit

Sub 最終行と最終列()

'このコードはエラーになりません

'変数の定義
Dim 行 As Long '行という文字自体が変数の機能を持っています
Dim 列 As Long '列という文字自体が変数の機能を持っています

'表の最終行と最終列を取得する
行 = cells(rows.count,1).end(xlup).row '最終行の行番号が変数 行 に格納されます
列 = cells(1,columns.count).end(xltoleft).column '最終列の列番号が変数 列 に格納されます

'表全体に おはようございます を入力
Range("A1",Cells(行,列)) = "おはようございます"

End sub

コードが全て実行されると指定のセルに「おはようございます」が並びます。

これなら行と列を取得しているコードとおはようございますを代入しているコードに値の繋がりが出来ます。

という事は行と列において情報が増えたり減ったりしてもコード上は何の問題もありません。

変数を設定していれば値に関係なくコードを繋いでくれるのでエラーが出る事は無いです。

ローカルウインドウを使うと変数の値を確認できる

変数がいまいち分からないという方には見た目で確認する方法があります。

VBA-2の記事で紹介したローカルウインドウを使うと変数の値を見ることができます。

ここでは行という変数は7、列という変数は6という値を持っている事が分かります。(画像赤枠参照)

コードの中で Cells(行,列) は Cells(7,6) と読み替えられています。

Cells(7,6)の戻り値はRange(“F7”)です。これでまとまりがあるデータの最終地点を扱う事ができますね。

まとめ

前回の記事で勉強した行列の最終行を取得するコードと変数を混ぜて実際に使ってみました。

本日勉強したこと
  1. 変数の機能
  2. 変数はコード内に配置出来る
  3. 変数を使うと効率良いコードになる
変数はとても優秀です

Enjoy Excel

せっかく説明しておいて台無しになるかもしれませんが1つ報告です。

Rangeオブジェクトの中で”A1”のような書き方とCellsを併記するようなコードは通常は使いません

通常使う事が無いのに説明に使ったのには理由があります。

範囲指定する際にRangeの後のかっこにはどんな情報を取れば良いのか分解して理解する為に使いました。

Range(始点セル,終点セル) これで範囲指定ができます。

短いコードですので覚えてしまいましょう。

加えてCellsプロパティの使い方を復習するという意味も込めています。

もう少し後の記事では実際に使うコードを交えて書き方を提供していきます。

話をコードの内容に戻します。 また新しいコードをさらっと入れましたね。

Dim という新しいキーワードが出てきました。次回説明していきます。

参考:おすすめ書籍

初心者様向けの書籍です。多くの書籍とは一風変わった事を書いてますが共感が持てたので紹介します。

EnjoyExcel
EnjoyExcel

「マクロを勉強するのは少しでも仕事を効率化させる為」であり

「マクロを完璧にマスターするわけではない」という考えのもと書かれた本です。

タイトルとURLをコピーしました