タイトル通りなのですが、配列の数を取得する方法は何かありますでしょうか?
現在私の方法では何と言いますかかなり無理やりな気がします。
Dim Data1(I)
Data1 = Split(Me.Text1,VbCrLf)
On Error Resume Next
Do
If Data1(I) = 0 Then '式は何でもいいのですが配列の中身を確認
End If
If Err <> 0 Then
Exit Do
End If
I = I + 1
Loop
On Error Goto 0
Debug.Print I '配列数を表示
ご存知の方はご教示よろしくお願い致します。
訂正。
Dim Data1(I)
ではなく
Dim Data1
でした。
失礼しました。
んんー…
・明示的な型宣言
・式値の結果の型
に気をつけましょうw;
さておき、
> 配列の数を取得する方法は何かありますでしょうか?
配列の要素数ですね?
UBound(Data1)-LBound(Data1)+1
で得ることが出来ます。
※余談ですが、UBound、LBoundは空の配列に対して例外を投げてきます。
例外処理もしておいた方がいいでしょう。
ガッ様即レスありがとうございます。
> UBound(Data1)-LBound(Data1)+1
とあるのですが、この最後の+1は何でしょうか?
私の環境で試したところ+1を行なうと1余分に多くなってしまいます。
それから
> 空の配列に対して例外を投げてきます。
ここで言う空の配列とはどのようなものの事でしょうか?
ちなみに書き忘れましたが環境はVB6.0です。
度々すみません。
>・明示的な型宣言
これをStringで宣言してしまった場合Split関数がつかえません。
本を参考にしたものなのですが、本でも型の宣言をしていませんでした。
適切な型はなんなのでしょうか?
ちなみに型はVariantなら動くのですが適切でしょうか・・・?
短文ですみません。。
Split を使う時には
Dim Data1() As String
...と添え字を書かないで宣言して下さい。
> > UBound(Data1)-LBound(Data1)+1
> とあるのですが、この最後の+1は何でしょうか?
個数を数えるときは、
・上限-下限+1
となりますよね?(0〜10までは、10-0+1で11個、など)
UBound(Data1)、LBound(Data1)はそれぞれData1(内部形式がString())の上限と下限を指します。
よって、要素数は UBound(Data1)-LBound(Data1)+1 となるのです。
> 私の環境で試したところ+1を行なうと1余分に多くなってしまいます。
うーん…なんか不思議ですねぇ。
もう一度ためして、不安だったら再現できる小さいコードを載せてみてください。
> ここで言う空の配列とはどのようなものの事でしょうか?
空の配列とは、要素数が0の配列のことです。
これは動的配列の宣言で宣言可能です。
例えば、
Dim somearray() As Byte
と宣言しますと、somearrayはByte()型で要素数が空の配列を指すようになります。
※不思議なもので、Split("")は上限-1下限0の配列を返すので、
UBound、LBoundでも例外を投げません。
夏様、即レスありがとうございます。
おっしゃるとおりの宣言で完璧でした。
ありがとうございます。
> 空の配列に対して例外を投げてきます。
これはData1に一つも配列が存在しないときに、
エラーで方が一致しません、っとでるという解釈で正しいでしょうか?
私の11:15:18の書き込みはガッ様の11:14:01の書き込みを見る以前の内容です。
ガッ様の11:14:01の書き込みで理解できました。
重複失礼しました。
ガッ様の11:14:01の書き込みで理解できました。
配列(0)〜配列(4)までで配列の要素が5つなのに、
0〜4までで要素数が4つだと勘違いしていました。
私の脳内のバグです。
ガッ様、夏様、ありがとうございました。
これはほんの気持ちですがどうぞ(*'_')っ⑩
用語も書いておきませう。
・配列
→基本型やクラスの配列
・配列の中身
→配列の要素、配列の元
・配列の次元
→詳しくはDimステートメント参照。
・配列の(ある次元の)範囲
→上限、下限
詳しくはUBoundとかLBoundを参照。
で、
> これはData1に一つも配列が存在しないときに、
> エラーで方が一致しません、っとでるという解釈で正しいでしょうか?
「型が一致しません」は型が一致しないということなので、要素が一つも存在しないこととは関係ありません。
これは、
Dim somearray()
としたときに、somearrayが要素が空の配列であり、
このときに限り、UBoundとLBoundが失敗する、ということを言いたかったのでした。
大変参考になります。
用語が通じないと話が困難になりますね。
用語も勉強させて頂きます。
エラーに関してなのですが、
「型が一致しません」は誤りで「インデックスが有効範囲にありません」でした。
失礼致しました。
ツイート | ![]() |