2019年6月22日土曜日

配列の挙動について、分かった振りして教えを垂れる痴れ者共が、なんと多いことよ - VBA配列関数群(そのほか)

画像はイメージです
   
またまた、以前の投稿に続けてVBA絡みのプログラミングで、考えて見ますね。
配列関数は、Array関数が代表的なのですが、次の通りコードを書いてみました。

Sub ArryFnctn()
Dim Fctr As Variant

Fctr = Array("", "", "", "")

MsgBox IsArray(Fctr)

End Sub

それで、IsArray関数と言うのは、変数値が配列なのかブール型の解を返します。
つまり、配列なら”True”で、そうでなければ”False”ですが、上の式はどうかな。

””と書くと、値が何も無いことを意味しますが、関数の記述には則っています。
実際、変数はString型に型強制されてしまい、長さ0の文字列("")になるんだ。

それで、答えを言うと、”True"と返して、全く値がなくても配列になりました。
これは、要素に実データがあろうと無かろうと、配列の構造にしたということ。

だから、一つの配列を表示するのに、”MsgBox Fctr(2)”で動かすとどうなるか。
答えは、空データだから、メッセージボックスだけしかない表示になるのです。

つまり、配列関数は、実行すると配列する要素を問わず、実行されるだけなの。
前回の投稿では、空の配列と言いましたが、関数の挙動はお構い無しでした。

もっと、すごいのはFctr = Array(, "", "", "")と書いても、”True”を返します。
この関数は、要素をカンマで区切る書式ですが、一つ目は要素も記述しないよ。

それでも、”True"と出るのだから、関数は配列構造のでっち上げ感が半端無い。
代りに、Fctr = Split(",a,b,c", ",")と書き、”MsgBox Fctr(0)”の表示はどうか。

同様に空データだから、メッセージボックスだけしか出ない表示になるのです。
これを、LBound(変数)で指定して表示しても、ゼロが出るのはなんじゃらほい。

配列は、分解された要素が0番目から始まると見たけど、何か違うような気が。
それにLBound(変数)はいつもゼロだから、変数(0)で指定して構わないなんて。

要するにさ、本来の配列概念を話さずに、実用上の動作だけ話しているのかな。
そういう風にも思えて考えてみましたが、結論としてはこんな自己流概念です。

先ず区切文字で区切れなくても、0番目の要素は必ず吐き出されて配列になる。
このため、区切文字が使われなかったら、LBoundとUBoundの値は両方0です。

つまり、区切文字で最初に区切られると変数(1)で、その直後の値が要素になる。
それ以降、区切られた文字の次の値が要素になり繰り返すけれど、注意が一つ。

Fctr = Split("a,b,c", ",")と、Fctr = Split("a,b,c,", ",")では結果が違うからな。
区切文字の数を数えた結果が2と3で、要素自体は空だろうが関係ありません。

というわけで、配列の構造が成立さえすれば、結果オーライの関数なのでした。
この配列の流れを見ていると、通信規格のプロトコル手順にも似ていて、区切り文字(デリミッター)の後に何バイト続くとか英訳していましたので、規格によっては、区切り文字の後に0バイトの空データになり、その後すぐに区切り文字が来るようなケースもあるのではないかと、思ったのでした。

おまけ:Split関数の実行結果をJoin関数で結合した際に面白い現象が発生
Dim Fctr As Variant, Fctr2 As Varinat
Fctr = Split("a,b,c", ",")
Fctr2 = Join(Fctr, ",")
MsgBox Fctr2  'a,b,c と表示(区切文字なし)

Fctr = Split("a,b,c,", ",")
Fctr2 = Join(Fctr, ",")
MsgBox Fctr2 'a,b,c, と表示(区切文字付き)

注:最後尾に区切文字があるかないかで、関数の用い方に注意



いいねと思ったら、三つポチっとね!
にほんブログ村 スキースノボーブログへにほんブログ村 スキースノボーブログ スキーへにほんブログ村 旅行ブログ 旅日記・旅の思い出へ
にほんブログ村    にほんブログ村      にほんブログ村 



1 件のコメント:

  1. ぐりぐりももんがのうんちくゲレンデ行脚&地方応援ブログ管理人様お忙しいところ恐れ入ります。

    「オリンピックの面白さを熱く語る!4年に1度の感動を最大限に!」というサイトを運営しております富樫と申します。
    この度、相互リンクをお願いしたくご連絡させていただきました。
    誠に勝手ながら、ぐりぐりももんがのうんちくゲレンデ行脚&地方応援ブログという名前で、
    すでに下記ページに貴サイトへのリンクを掲載させて頂きました。
    https://olympic-omoshiro.com/link/link1/
    80番目に掲載しております。
    (リンク集ページを整理した場合、掲載番号に変更がある場合もございます。)


    相互リンクの許可を頂けるようでしたら下記の当サイト情報にて掲載頂けると嬉しく思います。
    加筆修正などありましたらお手数おかけしますが、
    よろしくお願い致します。

    ■当サイト情報~~~~~
    サイト名 一体何故?冬季と夏季のオリンピックは同年開催でなくなったのか
    URL https://olympic-omoshiro.com/simultaneous-holding/
    紹介文 オリンピックのこれまでの歴史・メダリストなど、様々な情報が満載のサイトです。
    ~~~~~~~~~~~~


    相互リンクをお受け頂ける際は、
    お手数ですがご一報頂けると助かります。

    以上です。
    ご多忙中恐れ入りますが、ご対応の程よろしくお願いします。
    ※サイトデザインも未熟なサイトですが記事はちゃんとしておりますので、
      是非、ご覧いただければと思います。

    ━━━━━━━━━━━━━━━━━━━━
    サイト管理人:富樫
    サイト:https://olympic-omoshiro.com/
    メール:akitainu124@gmail.com

    返信削除