配列の二重定義エラーと型一致エラーの原因と回避方法

このQ&Aのポイント
  • 名前が二重に定義されているエラーの原因や回避方法について教えてください。
  • split関数による型一致エラーの原因や回避方法について教えてください。
  • 自分としてはif文の条件にあてはまらない限り中の処理を実行しないため、二重に定義してはいないと思っているのですが、エラーが出る理由がわかりません。
回答を見る
  • ベストアンサー

名前が二重に定義されています

If 条件 then dim arry(2) arry(0)="null" arry(1)="null" arry(2)="null" else if 条件 then dim arry(2) arry(0)="0" arry(1)="0" arry(2)="0" elseif y(0)="1" then arry=split(x,",") end if end if と書いてみたのですが、arryのところで「名前が二重に定義されています」というエラーが出てしまいます。自分としてはif文の条件にあてはまらない限り中の処理を実行しないため、二重に定義してはいないと思っているのですが間違っているのでしょうか? if文の外に dim arry(2) と1回だけ宣言すればこのエラーは出なくなりますが今度はsplitの処理のところで「型が一致しません」というエラーが出ます。 これの原因または回避方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.2

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

shaka001
質問者

お礼

回答ありがとうございます。参考にさせていただきます。 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処理の部分は別の配列を用意してその要素を代入するという形にして見ました。

その他の回答 (2)

noname#259269
noname#259269
回答No.3

>自分としてはif文の条件にあてはまらない限り中の処理を実行しないため、二重に定義してはいないと思っているのですが 変な仕様に思えますが、VBScript では、定義済み変数の有無を調べる時に IF 文の中か外かを区別しませんし、IF 文の中だけで有効な変数というものも定義できません。従って IF 文の始まる前に定義するのが正解です。 Java などでは、変数の有効範囲をなるべく小さくするよう推奨されますが、VBScript では、一連の処理コーディングの前に固めて変数定義をします。こういう理由がある為です。 >dim arry(2) と1回だけ宣言すればこのエラーは出なくなりますが今度はsplitの処理のところで「型が一致しません」というエラーが出ます。 split の受け側を配列にすると、エラーになるのが要因です。

  • SAYKA
  • ベストアンサー率34% (944/2776)
回答No.1

宣言だけして実体はif内でnew   できない? http://www.microsoft.com/japan/msdn/net/vbnetref/vbnetref3-3.aspx

shaka001
質問者

お礼

回答ありがとうございます。 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内でも配列の初期化はできているのではと思うのですが。

関連するQ&A

  • VBAで変数定義を変更する方法

    Data_Typeという変数の中に文字列doubleが入っていたら、 AIyyという変数をdoubleで定義、 longが入っていたらlongで定義するというプログラムを作りたいのですが If Data_Type = "double" Then Dim AIyy As Double ElseIf Data_Type = "long" Then Dim AIyy As Long End If と書くと、定義が重複しているというエラーが表示されてうまくいきません。 これはどうすれば良いでしょうか? それと一度integerで定義した変数をlongなどに定義を変更したい場合どのようにすれば良いでしょうか?

  • Valiantで定義したものをIntegerに変換したい

    中でIntegerで処理したいのですが 入口で何が入ってくるかわからないので 初めValiantで定義しておいて、変換したいのですが If ax = "" Then a = 0 Else a = Val(ax) End If とすると Nullの使い方が不正です、のエラーがでてしまいます

  • VB6でユーザー定義型がNothingかどうか調べるには?

    VB6でユーザー定義型がNothingじゃなかったら~処理~をするという事をしたいのですが 下記のように書くと「型が一致しません。」のエラーが出ます。 If Not ユーザー定義型 Is Nothing Then ~処理~ End If どのようにしたらユーザー定義型がNothingかどうか見分けられるのでしょうか?

  • [Excel VBA]Doloop途中のifで処理を飛ばすには

    久しぶりにお世話になりたいのですが・・・ Do Until 条件 何らかの処理 If条件 Then 何らかの処理 Elseif条件 Then 何らかの処理 Else 何らかの処理 (1)  End if 何らかの処理 Loop というような構文を作った際に(1)のところ(Elseに適合した 場合のみ)でEnd if以下の処理を飛ばして次の周回(? 要はDo~の 最初のところに戻る)にはどうすればよいのでしょうか?

  • エクセルVBA 「名前の定義」について

    いつもお世話様です。エクセル2000での名前定義に関するVBA操作で疑問がありますのでよろしくお願い申し上げます。 (o。_。)oペコッ 以下のマクロで、あるエクセルのBOOKの名前の定義をすべて書き出してみました。 Sub Names_Check() Dim nm As Object Set sh = ActiveWorkbook.Worksheets.Add For Each nm In ActiveWorkbook.Names i = i + 1 sh.Cells(i, 1) = nm.Name sh.Cells(i, 2) = "'" & nm.RefersTo Next End Sub すると、なかにはセル範囲を参照していない名前の定義がけっこう見つかりました。 それらはよく見ると =○○○.xls!△△マクロ のようなマクロの名前を参照していました。 そんな名前の定義はつけた覚えが無いのですが、これは何でしょうか? なぜそのような名前の定義が出来てしまうのでしょうか? 次にセル範囲を参照していないこれらの名前定義を削除するため下記のマクロを書いてみたところ、「実行時エラー1004 その名前は正しくありません」というエラーがでてしまいます。 どう書いたら削除できるのでしょうか?(もちろん手動では削除できます。) Sub Del_NameRefQuestion() '不明な参照の名前定義削除 Dim nm As Object Dim mystr As String, ans As Integer For Each nm In ActiveWorkbook.Names If InStr(nm.RefersTo, "$") = False Then ans = MsgBox(nm.Name & "/" & nm.RefersTo, vbYesNo + vbQuestion, "削除しますか?") If ans = vbYes Then nm.Delete ’ここでエラー End If Next MsgBox "不明参照の名前定義削除完了", , " ( ̄ー ̄)v" End Sub

  • VBAで配列のNULL判定

    VBAで下記のように配列に設定したNULL値を判定しようとしました。 Dim str() ReDim Preserve str(2) str(0) = "aaa" str(1) = Null str(2) = "bbb" 以下(1)、(2)の分岐処理ではNullと判定されませんでした。 どのように判定すれば良いでしょうか? (1) If str(1) = Null Then Debug.Print "Null値です" End If (2) If str(1) = "" Then Debug.Print "Null値です" End If

  • エクセルのVBA、ループ処理について

    if文とループ処理をどう組み合わせればいいのかわかりません 以下のコードで、iの数をを増やしていく処理を行いたいのですが、エラーがでてしまいうまくいきません どのように書けばいいのでしょうか 教えてください For i = 2 To 11 If Cells("4,i") > 80 Then Cells("5,i").Value = "A" ElseIf Cells("4,i") > 70 Then Cells("5,i").Value = "B" ElseIf Cells("4,i") > 60 Then Cells("5,i").Value = "C" Else Cells("4,i").Value = "D" End If Next

  • VBAでの計算後のセルに2重線で囲む

    まだPC・VBA不慣れな為、実行できないので、教えてください。 c16セルに休日を入力すると無理つぶしは成功しましたが、c16セルに祭日を入力すると赤の2重線で囲みたいのですが、できませんので、方法をお願いします。 もう1点がCELLS・RANGEを使った2種類の方法をお願いします。 よろしくお願いします。 Sub 練習44() Dim kyuyo As Currency If Range("c16").Value = "祭日" Then Worksheets("練習1If~Then").Cells(16, 3).xlDouble.ColorIndex = 3 ElseIf Range("c16").Value = "休日" Then Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 5 Else Worksheets("練習1If~Then").Cells(16, 3).Interior.ColorIndex = 10 End If End Sub

  • excelのマクロで2007だとエラーが。

    excel2003では動いていたマクロが2007では、エラーになってしまいます。 中断→デバッグ→再開→中断→デバッグ→再開、、、、 と中断しながらも10~20行ずつ進みます。 解決法がありましたら教えてください。 ※デバッグで確認すると「end if」で中断します。 Sub 仕分() Dim n As Long Dim nRow As Long Worksheets("シート名").Activate nRow = Range("A1").End(xlDown).Row For n = 2 To nRow If Cells(n, 6) = "条件1" Then Cells(n, 22) = "仕分け" ElseIf Cells(n, 6) = "条件2" Then Cells(n, 22) = "仕分けしない" ElseIf Cells(n, 6) = "条件1" And Cells(n, 7) = "条件2" Then Cells(n, 22) = "仕分け2" Else Cells(n, 22) = "OK" End If Next n End Sub

  • VBAでelseに対応するifがありませんとエラー

    VBA初心者です 入力した数値(0から5)により、呼んでくる列を変えたいマクロを組んでいます if then elseif end ifで条件式を作ったのですが、 「elseに対応するifがありません」とエラーが出て進みません elseifが悪いのかと思い、条件を1つに絞ると上手く動きます(この際はendifは不要) ネット検索や参考書を見てますが、分かりません どなたか間違いを指摘して頂けませんか? Sub inputboxA() Dim nDat As String nDat = inputbox("何ヶ月目ですか?") If IsNumeric(nDat) = False Then MsgBox ("0から5までの値を入力して下さい") Exit Sub End If If nDat = 0 Then mm = 16 '0なら16列からデータを呼んでくる ElseIf nDat = 1 Then mm = 20 'ここでエラーが出る  1なら20列目からデータを呼んでくる ElseIf nDat = 2 Then mm = 24 '2なら24列目からデータを呼んでくる ElseIf nDat = 3 Then mm = 28 '3なら28列目からデータを呼んでくる ElseIf nDat = 4 Then mm = 32 '4なら32列目からデータを呼んでくる ElseIf nDat = 5 Then mm = 36 '5なら36列目からデータを呼んでくる End If 'データを呼んでくる For r = 4 To 2000 '処理するSheet1の行数範囲 b = Sheets(1).Cells(r, 1) 'bにA列の値を代入 For t = 6 To 2000 '検索するSheet3の行数範囲 If Sheets(3).Cells(t, 7) = b Then 'Sheet1のA列の値とSheet3のA列が一致した場合 y = Sheets(3).Cells(t, mm) 'yにB列の値を代入 Sheets(1).Cells(r, 6).Value = y 'Sheet1のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub

専門家に質問してみよう