- ベストアンサー
配列の二重定義エラーと型一致エラーの原因と回避方法
- 名前が二重に定義されているエラーの原因や回避方法について教えてください。
- split関数による型一致エラーの原因や回避方法について教えてください。
- 自分としてはif文の条件にあてはまらない限り中の処理を実行しないため、二重に定義してはいないと思っているのですが、エラーが出る理由がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
anyを単純なバリアント型として宣言しておきましょう 配列でアクセスしたい場合は Redimで要素数を指定してから使います Splitで分解する場合はRedimは使用しません dim arry If 条件 then redim arry(2) arry(0)="null" arry(1)="null" arry(2)="null" else if 条件 then redim arry(2) arry(0)="0" arry(1)="0" arry(2)="0" elseif y(0)="1" then arry=split(x,",") end if end if
その他の回答 (2)
>自分としてはif文の条件にあてはまらない限り中の処理を実行しないため、二重に定義してはいないと思っているのですが 変な仕様に思えますが、VBScript では、定義済み変数の有無を調べる時に IF 文の中か外かを区別しませんし、IF 文の中だけで有効な変数というものも定義できません。従って IF 文の始まる前に定義するのが正解です。 Java などでは、変数の有効範囲をなるべく小さくするよう推奨されますが、VBScript では、一連の処理コーディングの前に固めて変数定義をします。こういう理由がある為です。 >dim arry(2) と1回だけ宣言すればこのエラーは出なくなりますが今度はsplitの処理のところで「型が一致しません」というエラーが出ます。 split の受け側を配列にすると、エラーになるのが要因です。
- SAYKA
- ベストアンサー率34% (944/2776)
宣言だけして実体はif内でnew できない? http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-3.aspx
お礼
回答ありがとうございます。 If 条件1 then dim arry(2) ・・・*1 arry(0)="null" arry(1)="null" arry(2)="null" else if 条件2 then dim arry(2) ・・・*2 arry(0)="0" arry(1)="0" arry(2)="0" elseif 条件3 then arry=split(x,",") end if end if と言う場合、条件1の中に入っていったときに、*1をコメントアウトすると「型の不一致」が出ます。*1ではなく*2をコメントアウトすれば正常に動作します。 条件2の中に入っているときに*1のみコメントアウトすると正常に動作し、*2のみコメントアウトすると「型の不一致」になります。 恐らく、if内でも配列の初期化はできているのではと思うのですが。
お礼
回答ありがとうございます。参考にさせていただきます。 dim arry(2) If 条件 then arry(0)="null" arry(1)="null" arry(2)="null" else if 条件 then arry(0)="0" arry(1)="0" arry(2)="0" elseif 条件 then z=split(x,",") arry(0)=z(0) arry(1)=z(1) arry(2)=z(2) end if end if という感じで、split処理の部分は別の配列を用意してその要素を代入するという形にして見ました。