• 締切済み

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

みんなの回答

回答No.4

#3の回答者です。 >If nDat > 5 And nDat < 0 Then >のAndはOrにしないとダメでしたが 除外条件なら、逆でしたね。すみません。 >nDat = Application.InputBox("何ヶ月目ですか?", Type:=1) >  If VarType(nDat) = vbBoolean Then Exit Sub nDatは、String型では、Escを押した時などに、弾くことができませんから。 それを、InputBox関数ですと、ちょっとややこしいのです。

t2grp
質問者

お礼

解説ありがとうございます ESCで止まらないなら、やはりVariant型の方がよさそうですね 他の変数も見直してみます

回答No.3

ご質問の >If nDat = 0 Then mm = 16 のくだりでしたら、単に mm = (nDat + 4) * 4 だけでよいのでは? 詳しく書くなら、 InputBox関数ではなく、InputBox メソッドを使いましょう。 nDat = Application.InputBox("何ヶ月目ですか?", Type:=1)   If VarType(nDat) = vbBoolean Then Exit Sub   If nDat > 5 And nDat < 0 Then     MsgBox ("0から5までの値を入力して下さい")     Exit Sub   End If   mm = (nDat + 4) * 4 'If構文は要りません。   ・'以下For ~Next ループ   ・   ・ 'ただし、ここでは、nDatはVariant型にします。

t2grp
質問者

補足

ありがとうございます 例文動きました いろんな記述の仕方がありますね ただし、 If nDat > 5 And nDat < 0 Then のAndはOrにしないとダメでしたが あと分からないのがVariant型にするのは なぜでしょうか? String型でも動作するようですが

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

if文には二種類の形式があります。 1つめが、end ifを使わず一行で書く形式。 if 条件 then 文 else 文 よく使うのが、end ifを使って複数行で書く二番目の形式。この場合は、thenの後になにも書いてはいけません。 if 条件 then 文 elseif 条件 then 文 else 文 end if >If nDat = 0 Then mm = 16 '0なら16列からデータを呼んでくる Thenの後に文が書いてあるので、一番目の形式と見なされてそこでif文が完結しています。 なので、次の行でいきなりelseifが出てきたようになってしまっている。

t2grp
質問者

お礼

レスありがとうございます 自分で解決できたのですが、notnotさんのおっしゃるとおりだと思われます まだまだ精進が足りないようです 頑張ります

  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

> ネット検索や参考書を見てますが、分かりません そんなものよりまず確認するのはヘルプです。それを見ればすぐに If 条件式1 Then 条件式1を満たした場合の処理 ElseIf 条件式2 Then 条件式2を満たした場合の処理 End If という書き方にしなければならないことがわかるだろう。 あなたの書き方はこんな感じ。 If 条件式1 Then 条件式1を満たした場合の処理 ElseIf 条件式2 Then 条件式2を満たした場合の処理 End If

t2grp
質問者

お礼

即レスありがとうございます 自己解決しました If nDat = 0 Then mm = 16 を If nDat = 0 Then mm = 16 と改行するだけで、動くようになりました お手数をおかけしました