[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2004/11/09(Tue) 18:50
投稿者名:ももたろう
Eメール:
URL :
タイトル:
配列について
配列について教えて下さい。

「配列に何も値が入っていなかったら」という判断はどう書いたらいいかわかりません。

sNewmake(1).Name = "" とか
sNewmake(1).partName = Nothing とか
sNewmake = Nothing とか
試してみましたが、「インデックスが有効範囲にありません。」のエラーになってしまいます。
なので、この配列を参照できる状態ではないという事だと思いますが、publicで宣言しているので
参照できないのはよくわかりません。
判断するときに配列に何もない状態なので、エラーになってしまうのでしょうか?

どなたかご存知の方お願いします。

投稿時間:2004/11/09(Tue) 19:28
投稿者名:java.lang.Nullpo
Eメール:
URL :
タイトル:
Re: 配列について
> 配列について教えて下さい。
>
> 「配列に何も値が入っていなかったら」という判断はどう書いたらいいかわかりません。

If sNewmake(1) Is Nothing Then
  Call MsgBox("何もはいってない")
End If

どこまで要素があるかは、
UBound(sNewmake())でも使いましょう。

投稿時間:2004/11/09(Tue) 21:34
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re: 配列について
> 「配列に何も値が入っていなかったら」という判断はどう書いたらいいかわかりません。

それは、
(a) 初期化されていない配列
(b) 要素数がゼロの配列
(c) 各要素に空データが代入された配列
のいずれのパターンでしょうか?


(a)の場合は、UBound関数を使い、発生するエラーをOn ErrorでトラップすればOKです。
エラートラップを用いたく無い場合は、APIを利用する事になります。

(b)は、LBound関数とUBound関数の結果を比較すればOKです。
それぞれの1次元目の要素数が、「LBoundの結果=(UBoundの結果+1)」になっていれば、
空要素の配列として判断できます。

(c)は、For Each 等を併用して、各要素の値を個別に見ていく事になります。

投稿時間:2004/11/10(Wed) 10:36
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^2: 配列について
java.lang.Nullpoさん、魔界の仮面弁士さん返信ありがとうございます。

java.lang.Nullpoさんのやり方だと、エラーになってしまい出来ませんでした。
配列が初期化されてないからだと思いますが・・・

> > 「配列に何も値が入っていなかったら」という判断はどう書いたらいいかわかりません。
>
> それは、
>  (a) 初期化されていない配列
>  (b) 要素数がゼロの配列
>  (c) 各要素に空データが代入された配列
> のいずれのパターンでしょうか?

(a) 初期化されていない配列
になります。

> (a)の場合は、UBound関数を使い、発生するエラーをOn ErrorでトラップすればOKです。
>  エラートラップを用いたく無い場合は、APIを利用する事になります。

このAPIは何を使ったらいいのでしょうか?本とかネットで調べたのですがみつからなかったです。
また、ネットで調べる場合の"検索キー"とか教えて頂けたらと思います。

お手数ですが、よろしくお願いします。

投稿時間:2004/11/10(Wed) 13:00
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^3: 配列について
> (a) 初期化されていない配列
>
> > (a)の場合は、UBound関数を使い、発生するエラーをOn ErrorでトラップすればOKです。
> >  エラートラップを用いたく無い場合は、APIを利用する事になります。
>
> このAPIは何を使ったらいいのでしょうか?本とかネットで調べたのですがみつからなかったです。
> また、ネットで調べる場合の"検索キー"とか教えて頂けたらと思います。

調べたら、RtlMoveMemoryを使えばなんとかなりそうな気がしてきました。
しかし、参照設定を何にしたらいいのか?とか、いろいろ調べないとわかりません。
アドバイス頂けたらうれしいです。

よろしくお願いします。

投稿時間:2004/11/10(Wed) 15:17
投稿者名:魔界の仮面弁士
Eメール:
URL :
タイトル:
Re^4: 配列について
> > java.lang.Nullpoさんのやり方だと、エラーになってしまい出来ませんでした。
On Error でトラップして判断すれば良いのでは?
エラーになれば「初期化されていない」という事で。
APIを使うほどの事は無いような…。


> > このAPIは何を使ったらいいのでしょうか?本とかネットで調べたのですがみつからなかったです。
記憶が曖昧なのですが、この掲示板でも以前サンプル投稿があったような気がします。
…今、検索している時間が無いので、保証はできませんけど。m(_ _)m

> 調べたら、RtlMoveMemoryを使えばなんとかなりそうな気がしてきました。
それでいけます。宣言側を
   ByRef Dest As Long, ByRef src() As Any, ByVal Length As Long
のようにして、
   RtlMoveMemory x, 配列, 4
   If x = 0 Then
   End If
じゃないかな。

> しかし、参照設定を何にしたらいいのか?とか、いろいろ調べないとわかりません。
参照設定は関係無いかと。

投稿時間:2004/11/10(Wed) 16:13
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^5: 配列について
> > > このAPIは何を使ったらいいのでしょうか?本とかネットで調べたのですがみつからなかったです。
> 記憶が曖昧なのですが、この掲示板でも以前サンプル投稿があったような気がします。
> …今、検索している時間が無いので、保証はできませんけど。m(_ _)m

検索したら、RtlMoveMemoryが見つかり、そのままモジュールに下記を追記したのですが、
「ユーザー定義型は定義されていません。」のエラーになってしまい、先に進めない状態になってしまいました。
Public Declare Function RtlMoveMemory Lib "kernel32" _
                        (ByRef Destination As Long, _
                        ByRef Source() As MyUserDefinedType, _
                        Optional ByVal Length As Long = 4&)

> > しかし、参照設定を何にしたらいいのか?とか、いろいろ調べないとわかりません。
> 参照設定は関係無いかと。

上記エラーだったので、参照設定が必要かと思ったのですが、違うみたいですね・・・

ずっとこの状態で進めず、結局APIは諦め、ERR処理を行うことにしました。
(APIは勉強がてらチャレンジしていて、こだわっていませんでしたので)
On Error Resume Next
iWork = UBound(sNewmake())
On Error GoTo 0     'エラー時に通常通りの動作をするように戻す
If err.Number <> 0 Then
・・・処理・・・

以上です、魔界の仮面弁士さんお忙しい中ありがとうございました。

投稿時間:2004/11/10(Wed) 18:22
投稿者名:LESIA
Eメール:
URL :
タイトル:
Re^6: 配列について
APIはあきらめたようですが、せっかくだから書いておきます(^^;

> 検索したら、RtlMoveMemoryが見つかり、そのままモジュールに下記を追記したのですが、
> 「ユーザー定義型は定義されていません。」のエラーになってしまい、先に進めない状態になってしまいました。
> Public Declare Function RtlMoveMemory Lib "kernel32" _
>                         (ByRef Destination As Long, _
>                         ByRef Source() As MyUserDefinedType, _
>                         Optional ByVal Length As Long = 4&)

APIを使う場合は、引数ユーザー定義型が使われていたら、その宣言もしなければ
いけません。
この場合は、MyUserDefinedTypeですね。
検索したところに、MyUserDefinedTypeの宣言文があると思うのでそれもモジュールに
追加してください。

投稿時間:2004/11/12(Fri) 17:50
投稿者名:ももたろう
Eメール:
URL :
タイトル:
Re^7: 配列について
LESIAさん返信ありがとうございます。

また試してみます。