★独学者が1年後にExcelVBAを爆発的に伸ばすための最低限の基礎知識メモ(ダイジェスト):Vol0028:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-11。(エラー回避の基礎12)★ ウォッチウィンドウで「+」マークが付く「配列変数」の「型の列の Variant/Variant(1 to 4, 1 to 2) の意味」について。意訳、何を読み取れるか、について。
バックナンバー目次ページは→こちらです。
まぐまぐのページは以下です。
https://www.mag2.com/m/0001691660.html
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
Vol.0028
タイトル:ついでに、ウォッチウィンドウの「一般的に、普通に使う使い方」も少し-11。(エラー回避の基礎12)
★ ウォッチウィンドウで「+」マークが付く「配列変数」の「型の列の Variant/Variant(1 to 4, 1 to 2) の意味」について。意訳、何を読み取れるか、について。
バックナンバー目次とサンプル号
https://euc-access-excel-db.com/tips/ct07_se/ct075012_xls2k_vba_tips/mag2-01
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
==============================
今回も前回の続きです。
(今回はもちろん、前回も前々回も「変数」がらみのお話なので、ウォッチウィンドウだけではなく、「ローカルウィンドウ」でも同じことが言えます。)
前回は『 ウォッチウィンドウにて、オブジェクトのほかにも「+」マークが付く「配列変数」』の中身の値の様子を少し詳しくやりました。
で、ここで少しもとに戻ります。
2つ前の号になるのですが、
配列変数の「+」マークを展開する前は、こんな状態でした。
「型」の列を見ると、オブジェクトの時と違って、
「Variant/Variant(1 to 4, 1 to 2)」
と書かれています。
これの意味を今回少しご説明します。
ただ、これについては僕も自信がないので、できましたら詳しい方にも聞いてみて下さい。
まず、
「Variant/Variant(1 to 4, 1 to 2)」
の
最初の「Variant」ですが、
これは普通に
「まず、これはVariant型ですよ~」
という意味です。
で、次に、「/(スラッシュ)」のあとですが、
ここにも
「Variant」
と書いてあります。
これについては、多分ですが、
『 Variant型の「配列」ですよ~ 』
という意味ではないかと思われます。
(ここが僕が自信が無いところです。)
「Variant/Variant」ということで、
「Variant型で、内部的にもVariantですよ~」
「Variant型は内部的にもVariantですよ~」
というのは言わば「あたりまえ」、といえばそうですので、
ここでは、
『「配列」ですよ~ 』
『「配列」に勝手に変化しましたよ~ 』
という意味合いが「濃い」・・・・という風に、あえて、お考えください。
理由は後述します。
で、「(1 to 4, 1 to 2)」についてですが、
これは
「縦に1~4」
「ヨコに1~2」
の「2次元の配列ですよ~」
「表のような構造をもった配列ですよ~」
「表のような構造を持った変数ですよ~」
ということを言っています。
前回の号で、以下の図のようなことをやったので、初心者の方でもここからも(細かい点は置いておいても)、なんとなくでも想像して頂けるんではないかと思います。
というわけで、まとめますと
「Variant/Variant(1 to 4, 1 to 2)」
は、
「Variant型の配列変数で」、
「縦に1~4行」、
「ヨコに1~2列」の、
「2次元の配列ですよ~」、
「表のような構造を持った変数ですよ~」、
という意味になる・・・
ということでよろしいかと思います。
ただこのとき注意が必要なのは、
普通、
配列というものは、
(0 to 4, 0 to 2)
という感じで
「ゼロから始まる」感じであり、
「1からは始まらない」・・・・
というのが一般的というか、原則、というか、そんな感じなのです。
これはどのプログラミング言語でも同じです。
でも、
今回の事例では、
「セルの集合=表」を、いきなり、ムリヤリ Variant型の変数にブッ込んで、「自動2次元配列化」をしました。
つまり、
その場合だけは、
「特殊」
なのです。
「ゼロからではなくて、1から始まる配列」
となります。
何もなくても、
自動的に。
逆にこれはうれしい誤算というか、うれしい偶然というか、うれしい仕様というか、
うれしい結果となります。
(この点はマイクロソフト社に感謝、です。いつもイヤミばっかり言っていてすみません。))
理由は、
ExcelVBAでセルを指定・操作する場合、
「Range」という命令語句で「A1」形式で指定・操作する場合のほかに
「Cells」という命令語句でも「R1C1」形式(つまり「行番号と列番号」での指定)でも指定・操作できるのですが、
その際は、その行番号と列番号が、配列のインデックス(添え字)の番号と一致するからです。
インデックス(添え字)とは、
たとえば
の図であれば、
その4つの図の中のうち、右下の表の中ですが、
「ggg(1,1)」・・・・などとなってますが、
それの「ggg」を「取り除いた」、「残りの部分」のことです。
で、そのとき、
(1,1) なら「1行目の1列目、ということを表し、
(1,2) なら「1行目の2列目、ということを表しています。
つまり、配列変数の中の、各値の「位置関係」を表しています。
で、これを
「ggg」を「Cells」に書き換えて、
「Cells(1,1)」とやると、
Excelの表側でも、「同じセル位置」の引数を意味することになります。
つまり、
配列変数の中身の各値の位置と、実際のセル位置の情報とが、
「リンクさせることができる」
というイメージになります。
初心者の方にはちょっとわかりづらいかもしれませんが、また、どこかで詳しくご説明します。
そのように、
「配列の中身」と
「実際のセルの位置」を
「リンクさせることができる」ので、
「少しプログラムを書きやすくなる」
「余計なプログラムを付加せずに、(1,1)とか(1,2)などの数字の指定だけで、配列も実際のセルも両方とも、同じ数字の指定で扱える」
ということがメリット、となります。
もちろん、これは他の「一般的な普通の配列」では、
「特に何も指定をしなければ」
「できないこと」
になります。
ただ、ちなみにですが、
一般的な配列変数でも、「ゼロからではなくて1から始まる配列変数」をつくることはできます。
たとえばInteger型の2次元配列の場合
「 Dim aaa(1 To 4, 1 To 2) As Integer 」
と宣言すれば、
「ゼロからではなくて1から始まる、Integer型の配列変数」を作ったことになります。
ただ、その配列の中に、セルの「表の各値」を代入するには、今回のVariant型の配列変数のように「1行コードで1発で!」というわけには到底いかず、しち面倒くさいループ処理のプログラムなどを使ってちまちま代入していかないといけません。
初心者の方にとってみればすごくめんどくさい作業です。
(といって、それもできなければ全然ダメなんですけど・・・・。
でも僕はAccessからVBAに入ったのでループが苦手なのです・・・。
特に縦のループはいいのですが、ヨコのループが・・・。)
ところで、
「aaa(1 To 4, 1 To 2)」・・・は、
今回の、ウォッチウィンドウでの、『 配列の「型」の列の内容 』と似ていますね。
なので実際に、配列の変数宣言をにしてみると、なお、今号のことがイメージしやすくなると思います。
また、ここでも、
「ウォッチウィンドウと変数宣言」
「ウォッチウィンドウと変数そのもの」
とは、
「なじみが深い」
ということもご理解いただけるんではないかと思います。
(※注・・・配列変数を「ゼロからではなくて1から始める」には、https://uxmilk.jp/49358 にあるように「Option Base 1」という命令文を使う方法もあるようですが、そういう「ある意味」「特殊」な方法は、初心者の方は使わないほうがいいです。
多くのVBA記事や書籍はなんでもかんでも「より文字数が少ない方がカッコイイ、スマート」とされることが多いですが、そのようなことが、「一番上達しない考え方のひとつ」となります。
最初は省略とか変な裏技を覚えずに、「しっかりと基礎を学ぶ」ほうが「ウォッチウィンドウ」との連携がしやすく、腕が速く上がる確率が高いです。
慣れてくれば「Option Base 1 ごときが特殊なわけない」と思えるようになるかもしれませんが、それはやはり「慣れてから」だと思います。
VBAを学習し始めのうちは、(1 To 4, 1 To 2)と宣言すれば、ウォッチウィンドウにもそう表示されるので、例えばエラー解決でウォッチウィンドウを見たときに、「自分は間違ってない」「ならなぜ?」と別の原因を探しに行くことができます。
エラーが自力で解決できるようになるまでは、いわゆる「スマートな書き方」「省略した書き方」はしないほうが無難です。
「スマートな書き方」「省略した書き方」なんかよりも、長くて冗長でもいいので、
「構造が誰にでもわかりやすい書き方」をあえてしたほうがいいと思います。
でないと、「無責任なVBA記事や書籍」に、「騙されたまま勘違いも治らず、結果、上達しない」というドツボにハメられることが多いです。
どうか、ご注意ください。)
何度もくどくど繰り返してすみませんが、
表の形になったセルの値を、配列変数に代入するときに
「限って」
は、
そこまで(ループで配列に値を代入すること)をしなくても、Variant型の変数が持っている「セルの値の自動配列化の性質」を使って、
「 Dim aaa As Variat」
とだけ宣言すれば、
「同じことができるのでラクちん」
「宣言後のセルの表の値の代入も、1行コードで済むのでもっとラクちん」
ということになります。
色々とくどくどと冗長に説明しすぎてしまい、特に初心者の方にはわかりづらかったと思いますが、ひとまずは「ふーん、そういう便利な方法があるのだな」くらいは、どうか、押さえておいてください。
◆◆◆ でも、「配列」のことを学んだあとは、必ず、今号のようなチェックを、するようにしてください。◆◆◆
なお、Variant型の変数が持っている「セルの値の自動配列化の性質」を使って、
Variant型の配列変数にセルの表の値を代入した時は、
そのセルが「1個だけ」「1行だけ」「1列だけ」でも、必ず「2次元配列」になります。
「1次元配列」には「なりません」ので、その点だけ、注意が必要です。
ところで冒頭で・・・、
「/(スラッシュ)」のあとの「Variant」が、
『 Variant型 』
の「配列」ですよ~
という意味です・・・・
と書きました。
その理由???をこれから述べさせていただきます。
ただ、ここが僕が自信が無いところです。
なので、これについては、もっとよくVBAを知る方に聞いてみてください。
僕は一応、初心者なので・・・。
すみません。
でも、多分、そうだと思います。
なぜそう思うかというと、
例えば2次元配列をVariant型ではなくて、「Integer型」にて・・・、
たとえば
「Dim aaa(2, 3) As Integer」
と変数宣言したときは、
例えば以下のようにウォッチウィンドウの「値」の列に表示されるからです。
「Integer(0 to 2,0 to 3)」
(※0、2、3、などの数字は、変数宣言で「 aaa(2, 3) 」と宣言したので出てきた数字です。)
で、このとき、
「Variant/Variant(0 to 2,0 to 3)」でもないですし、
「Variant/Integer(0 to 2,0 to 3)」でもないですし、
「Variant(0 to 2,0 to 3)」でもないです。
「Integer(0 to 2,0 to 3)」です。
これはInteger型の2次元配列として宣言した時の場合ですが、
Integer型の1次元の配列として宣言した場合でも、
「Integer(0 to ×××)」となって、
「Integer ~~」と表示されるのは同じです。
このような感じなので、それらを総合的に考えあわせますと、
「Variant型の2次元配列」は、
「必ず 、Variant/Variant(××××)と表示される」
ということなのです。
これはVariant型の1次元配列の場合でも、
「Variant/Variant(××××)と表示される」
ので、そうだと思います。
また・・・・・、
Variant型の配列の中の「各要素」は、その中身の値の「型」を、
「String」
「Integer」
「Long」
「Double」
「Date」
「Boolean」
などの「一般データ(文字ベースのデータ)」の型はもちろん、
「オブジェクト型(総称型、固有型、両方)も」をも・・・
など、異なった型を持てるようになっています。
ここで、逆に考えてみますと、
「Variant/Integer(××××)と表示される」ようになるためには、
「Variant型の配列には、Ineger型の値しか代入できない」という風になれなければいけませせん。
多分。
でも、実際にはそうはなっていません。
Varant型の配列変数には、「各要素」に色んな型を代入できるから「Variant型」なのです。
なので、あえて
Variant/Variant
と表示される理由としては、
「配列ですよ~」
「Variant型の配列は、内部的に、各要素の値としては異なる”型”を持てるので、1つの型には決められませんよ~、だから、”Variant/Integer”といった感じで・全部の要素が一つの型になってしまうなんてことにはなりえませんよ~」
という理由が大きいのではないかと思います。
もう少し言うと、
「逆に」
「Variant型という枠の中で」、
「さらに」
「複数のバラバラの型が内部的に持てる変数は」
「配列」(※しかもVariant型のみ)
「しかありませんよ~」
「オブジェクトがらみの場合もそういうケースがあるかも??」(※未確認です)
「これは普通の単一の変数ではできませんよ~」
(また、配列であってもVariant型じゃない配列にはできませんよ~)
という意味でもあります。
なので、今号の冒頭で、
『「配列」ですよ~ 』
『「配列」に勝手に変化しましたよ~ 』
という意味合いが「濃い」・・・・という風に、あえて、お考えください。
と書きました。
まあ、「Variant型で宣言したんだから、そのままVariant型の配列になっただけ」という理由のほうが「本当」なのかもしれませんが・・・・
なんか、ゴチャゴチャ書いてたら、そっちのほうが大きい気がします・・・・
でも何にしましても、まあ、ウォッチウィンドウの「型」の列で、
『Variant/Variant(×××)』
となっていましたら、
『「配列」に勝手に変化しましたよ~ 』
『 「(1 to 4, 1 to 2) みたいな記述があれば確実! 』
『 「(1 to 4, 1 to 2) みたいな記述が無くてもほぼ確実! 』
『 「+」マークがあるだけでも確実! 』
『 Variant/Variant だけでも、「ほぼ配列」と判断していい。多分、多くの場合、「配列」しかそうならないことが多い。(オブジェクトの場合は、もし「Variant・・・」から始まるとすれば「Variant/Object・・・」となるので) 』
『 オブジェクトがらみの場合もそういうケースがあるかも??(※未確認です)』
『 オブジェクトがらみで返ってくる「Variant/Variant」の場合はハズレかもしれませんが、もしハズレでも、「あえて」前述のように考えて、「まず最初に”配列 ”を疑う」ということにしておくと、エラー解決が短時間に・早く解決できることが多い。単一の型だと思い込んでいると永遠に解決できないエラーが少なくないから。特に「オブジェクト」がからんでいるエラーの場合は。』
と
「読み取る」
「意訳する」
ということくらいは許されると思います。
なお、
「オブジェクトがらみの場合もそういうケースがあるかも??」
ということについては・・・・
「未確認」なのですみませんが、Variant型の変数の内部には、オブジェクトも含めることができるので、なのでそう書きました。(Variant型じゃない配列の場合は、文字系の一般データとオブジェクトの共存はできません。)
以下の図は、bbbという名前の「Variant型の配列変数」の「各要素」に、
「数値型」
「文字列型」
「オブジェクト型」
という異なる性質の値を代入した例です。
(僕らVBA初心者からすれば、「代入できてしまっている・・・そんなことできるの?」という感じの例です。)
そのコードとウォッチウィンドウの様子を表した図です。
ご参考にしてみてください。
なので、プログラムの書き方、あるいは、各種命令単語の「もともとの仕様・動き」、等々によっては、このようにオブジェクトがからんだ、「Variant/Variant」があるかもしれません。
なので、「Variant/Variant」は「オブジェクトがらみの配列」ということも起こりえるかもしれません。
そのこともあらかじめ知っておくと、オブジェクトがらみのエラーが短時間に解決できるかもしれません。
これは「かもしれません」という話ですが、ウォッチウィンドウで色々と実際に値や型が確認できると、このような「予測」も「できる」ということになります。
これも、
「程度の低いバカな著者や編集者が作る・くだらないExcelVBAの市販書籍・Webページ・Kindle本」の、
「数100倍は」、
「役に立つ」
「ウォッチウィンドウ」のメリットの一つ、
だと思います。
かなりいい加減ですみません。
間違っているかとも思いますので、詳しい方にぜひ、この点は聞いてみてください。
今回は以上です。
==========================================================================
バックナンバー目次とサンプル号
----------------------------------------------------------------------
■独学者が1年後にExcelVBAを爆発的に上達させるための最低限の基礎知識メモ(ダイジェスト)
発行システム:『まぐまぐ!』 http://www.mag2.com/
配信中止はこちら https://www.mag2.com/m/0001691660.html
----------------------------------------------------------------------
- 投稿タグ
- ExcelVBA, Excel連携VBA, マクロ, 独学, 自動化