配列の数を取得する方法

解決


ごまぷりん  2005-08-18 17:44:27  No: 91549

タイトル通りなのですが、配列の数を取得する方法は何かありますでしょうか?
現在私の方法では何と言いますかかなり無理やりな気がします。

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  '配列数を表示

ご存知の方はご教示よろしくお願い致します。


ごまぷりん  2005-08-18 17:45:07  No: 91550

訂正。
Dim Data1(I)
ではなく
Dim Data1
でした。
失礼しました。


ガッ  2005-08-18 17:55:19  No: 91551

んんー…
・明示的な型宣言
・式値の結果の型
に気をつけましょうw;

さておき、
> 配列の数を取得する方法は何かありますでしょうか?
配列の要素数ですね?
UBound(Data1)-LBound(Data1)+1
で得ることが出来ます。

※余談ですが、UBound、LBoundは空の配列に対して例外を投げてきます。
  例外処理もしておいた方がいいでしょう。


ごまぷりん  2005-08-18 20:01:56  No: 91552

ガッ様即レスありがとうございます。

> UBound(Data1)-LBound(Data1)+1
とあるのですが、この最後の+1は何でしょうか?
私の環境で試したところ+1を行なうと1余分に多くなってしまいます。

それから
> 空の配列に対して例外を投げてきます。
ここで言う空の配列とはどのようなものの事でしょうか?

ちなみに書き忘れましたが環境はVB6.0です。


ごまぷりん  2005-08-18 20:04:56  No: 91553

度々すみません。
>・明示的な型宣言
これをStringで宣言してしまった場合Split関数がつかえません。
本を参考にしたものなのですが、本でも型の宣言をしていませんでした。
適切な型はなんなのでしょうか?


ごまぷりん  2005-08-18 20:09:26  No: 91554

ちなみに型はVariantなら動くのですが適切でしょうか・・・?
短文ですみません。。


  2005-08-18 20:09:42  No: 91555

Split を使う時には
Dim Data1() As String
...と添え字を書かないで宣言して下さい。


ガッ  2005-08-18 20:14:01  No: 91556

> > 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でも例外を投げません。


ごまぷりん  2005-08-18 20:15:18  No: 91557

夏様、即レスありがとうございます。
おっしゃるとおりの宣言で完璧でした。
ありがとうございます。

> 空の配列に対して例外を投げてきます。
これはData1に一つも配列が存在しないときに、
エラーで方が一致しません、っとでるという解釈で正しいでしょうか?


ごまぷりん  2005-08-18 20:17:14  No: 91558

私の11:15:18の書き込みはガッ様の11:14:01の書き込みを見る以前の内容です。
ガッ様の11:14:01の書き込みで理解できました。
重複失礼しました。


ごまぷりん  2005-08-18 20:20:53  No: 91559

ガッ様の11:14:01の書き込みで理解できました。
配列(0)〜配列(4)までで配列の要素が5つなのに、
0〜4までで要素数が4つだと勘違いしていました。
私の脳内のバグです。
ガッ様、夏様、ありがとうございました。
これはほんの気持ちですがどうぞ(*'_')っ⑩


ガッ  2005-08-18 20:22:34  No: 91560

用語も書いておきませう。
・配列
  →基本型やクラスの配列
・配列の中身
  →配列の要素、配列の元
・配列の次元
  →詳しくはDimステートメント参照。
・配列の(ある次元の)範囲
  →上限、下限
    詳しくはUBoundとかLBoundを参照。

で、
> これはData1に一つも配列が存在しないときに、
> エラーで方が一致しません、っとでるという解釈で正しいでしょうか?
「型が一致しません」は型が一致しないということなので、要素が一つも存在しないこととは関係ありません。
これは、
Dim somearray()
としたときに、somearrayが要素が空の配列であり、
このときに限り、UBoundとLBoundが失敗する、ということを言いたかったのでした。


ごまぷりん  2005-08-18 20:32:37  No: 91561

大変参考になります。
用語が通じないと話が困難になりますね。
用語も勉強させて頂きます。

エラーに関してなのですが、
「型が一致しません」は誤りで「インデックスが有効範囲にありません」でした。
失礼致しました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加