2019年6月13日木曜日

配列が空かどうかを調べるのに、自作の関数を実装するなんて、わざと凝ったつ くりで自己満足するだけよ - VBA・Split関数(そのほか)

Split関数ならぬ、スプリット変化球の握り

前回の投稿では、セル内で改行されたデータを置換するのに工夫してみました。
コードの動きも繰り返しで実験して、Split関数の吐き出す配列で確認したのよ。

コード的には、置換の文言とループ関数で取得したセル値の文言を比較します。
ただ、何もデータのない空白セルだけは、If構文で特定することにしました。

Dim Cll As Range
For Each Cll in Selection
If Cll.Value = "" Then GoTo EndTsk
~そうでない時に、配列が合うか比較するコード~
End Tsk
Next Cll

そのロジック部分を抜き出すと上の通りですが、詳細は前の投稿を参考下さい。
GoToステートメントを使って、条件外になると次のステップを飛ばす算段です。

本当は、Split関数で条件の配列と比較する配列が、完全に比較できると思った。
ところが、ターゲットのセル値が空白だと配列が比較できずに置換してしまう。

実験用のシートが、一面で置き換わってしまって、これはいかんと思いました。
なのでセル値が空であれば、シンプルに無駄な作業をスキップさせてみました。

コードの動きを何度か実証してみましたけれど、実用範囲だからOKでしょう。
ただ、空白セルでSplit関数がどのような結果を吐き出すのか、よく分からない。

ネットで調べてみましたが、配列が空なのかどうかを調べる関数はないらしい。
変数が配列なのかを調べる関数(IsArray)はありますが、配列を作った結果だ。

だから、この関数による結果が、空の配列であっても結果的には"True”になる。
ならば、空の配列なら値が無いと思い、IsEmpty関数で確認しても結果が違う。

Split関数は、配列の要素順番が、LBbound(開始値)UBound(最終値)です。
でも、IsEmptyにぶち込んでも、”False”とでるので空とは認識していなさそう。

    Dim tmp As Variant
    tmp = Split(Cells(1, 1), Chr(10)) ’空白セル・区切り文字は改行コード
    If IsEmpty(LBound(tmp)) = "True" Then MsgBox "True"
    If IsEmpty(LBound(tmp)) = "False" Then MsgBox "False"

となれば、Split関数は区切文字が見つからなくても 配列はでっち上げるんだ。
これが分かっただけでも御の字で、ネットを当たると自作関数を紹介するほど。

Functionプロシージャを設定する説明だったけど、もっと簡単じゃないのか。
そう思って、どんな開始と最終の値を出力するか、しつこく調べてみたんだよ。

Dim tmp As Variant
tmp = Split(Cells(1, 1), ”※”) ’区切り文字は”※”
If UBound(tmp) = -1 And LBound(tmp) = 0 Then MsgBox "空のセル"
If UBound(tmp) = 0 And LBound(tmp) = 0 Then MsgBox "区切文字無し"
If Len(Cells(1, 1)) > 0 And InStr(Cells(1, 1), ”※”) = 1 Then MsgBox "先頭が区切文字"
If Len(Cells(1, 1)) > 1 And Len(Cells(1, 1)) = InStrRev(Cells(1, 1), ”※”) Then MsgBox "末尾が区切文字"

  
シートの先頭セルに、メッセージボックスにある条件で入力してみてください。
一番目のIf文は空白セルの場合、二つ目はデータに区切文字が見当たらない。

三番目は、末尾が区切文字で、四番目は、先頭が区切り文字になるという事例。
まあ、三番目と四番目は、区切文字が入っているセルなので配列には違いない。

このため、字数を調べて区切り文字が先頭か末尾かを条件式で判断しています。
まあ、四つの条件を満たすセルの内容は、作業をスキップしまえばいいんだ。

つまり、この関数は区切文字でデータを仕切ることしか想定していないような。
というわけで、区切る位置がイレギュラーな場合を想定しない関数なのでした。

実際、この関数を使うとしたら、区切り文字で要素に配分してから、必要な配列順番のデータを取得して、次の作業ステップに移行しますが、先頭に区切り文字が出るようなケースは、データの羅列として考えられそうもなく、ありえるのはデータ末尾に区切り文字が入ってしまうことぐらいでして、そういう事例はプログラミングの工夫で操作も出来そうだと思ったのでした。

おまけ:
とてもイレギュラーだけど、セルの値が複数の区切り文字だけだとしたら、、、
   
Dim i As Long
Dim tmp As Variant
   
i = 0
tmp = Split(Cells(1, 1), "※")
   
Do While i < UBound(tmp) + 1
If Not tmp(i) = "" Then GoTo WithData
i = i + 1
Loop
   
MsgBox "要素が空"
GoTo Finish
   
WithData: MsgBox "要素が存在"
Finish:
   
End Sub
   
   
コメント:結果は、”要素が空”と表示。一個でも文字が挟まっていると存在。



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



0 件のコメント:

コメントを投稿