- 締切済み
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
- t2grp
- お礼率72% (50/69)
- その他MS Office製品
- 回答数4
- ありがとう数3
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- WindFaller
- ベストアンサー率57% (465/803)
#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関数ですと、ちょっとややこしいのです。
- WindFaller
- ベストアンサー率57% (465/803)
ご質問の >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型にします。
補足
ありがとうございます 例文動きました いろんな記述の仕方がありますね ただし、 If nDat > 5 And nDat < 0 Then のAndはOrにしないとダメでしたが あと分からないのがVariant型にするのは なぜでしょうか? String型でも動作するようですが
- notnot
- ベストアンサー率47% (4848/10261)
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が出てきたようになってしまっている。
お礼
レスありがとうございます 自分で解決できたのですが、notnotさんのおっしゃるとおりだと思われます まだまだ精進が足りないようです 頑張ります
- f272
- ベストアンサー率46% (8012/17124)
> ネット検索や参考書を見てますが、分かりません そんなものよりまず確認するのはヘルプです。それを見ればすぐに If 条件式1 Then 条件式1を満たした場合の処理 ElseIf 条件式2 Then 条件式2を満たした場合の処理 End If という書き方にしなければならないことがわかるだろう。 あなたの書き方はこんな感じ。 If 条件式1 Then 条件式1を満たした場合の処理 ElseIf 条件式2 Then 条件式2を満たした場合の処理 End If
お礼
即レスありがとうございます 自己解決しました If nDat = 0 Then mm = 16 を If nDat = 0 Then mm = 16 と改行するだけで、動くようになりました お手数をおかけしました
関連するQ&A
- VLOOKUP関数と同じことをVBAでおこなうには
初めまして、当方VBAの素人です。よろしくお願いします。 同じような質問で、このようなVBAを見つけました。 Sub Macro1() For n = 2 To 5 '処理するSheet2の行数範囲 a = Sheets("Sheet2").Cells(n, 1) 'aにA列の値を代入 For m = 2 To 5 '検索するSheet1の行数範囲 If Sheets("Sheet1").Cells(m, 1) = a Then 'Sheet2のA列の値とSheet1のA列が一致した場合 v = Sheets("Sheet1").Cells(m, 2) 'vにB列の値を代入 Sheets("Sheet2").Cells(n, 2).Value = v 'Sheet2のB列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub このVBAではSheet2での検索、入力が列になるのですが、列でなく、行でできないでしょうか。できればSheet1のB列の値をSheet2の1行で検索、Sheet2の2行に入力されるだけではなく、Sheet1のC列の値をSheet3の1行で検索、Sheet3の2行に入力されるようにしたいと思います。 解る方、よろしくお願いします。
- ベストアンサー
- オフィス系ソフト
- VBAの記述で、あるシートを別ファイルにした場合
エクセル2002で、商品を管理しています。 1列目に品番をいれると、2列目に品名が表示するようにし、 新規の品番は品名を入れると、追加登録されるようにVBAを組みました。 今度、このシート"商品"を別ファイル(商品.xls)にしたいと思うのですが、 どうしても、やり方が分かりません。 よろしくお願いします。 Public Sub Worksheet_Change(ByVal Target As Excel.Range) Dim 品番 As String Dim 品名 As String Dim i As Long With Target If .Column = 1 Then 品番 = .Text For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then ActiveSheet.Cells(.Row, 2) = "" Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then ActiveSheet.Cells(.Row, 2) = Sheets("商品").Cells(i, 2) Exit For End If Next i End If If .Column = 2 Then 品名 = .Text 品番 = ActiveSheet.Cells(.Row, 1) If 品名 = "" Or 品番 = "" Then Else For i = 1 To 65536 If Sheets("商品").Cells(i, 1) = "" Then Sheets("商品").Cells(i, 1) = 品番 Sheets("商品").Cells(i, 2) = 品名 Exit For ElseIf 品番 = Sheets("商品").Cells(i, 1) Then Exit For End If Next i End If End If End With End Sub
- ベストアンサー
- オフィス系ソフト
- vbaプログラミング
excelのsheet1のF列とj列には5桁の文字列がはいっていて、それぞれ1文字目から3文字目の3文字分を判定して、値をsheet3に出力しています。下記がプログラムです。6しか出力されないんです。 間違い、ご指摘点があればよろしくお願いします。 For i = 3 To 100 If CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "089" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 0 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "090" And (Sheets("sheet1").Cells(i, 10) = "033") Or (Sheets("sheet1").Cells(i, 10) = "036") Then Sheets("Sheet3").Cells(j, 2).Value = 3 ElseIf CStr(Mid(Sheets("sheet1").Cells(i, 6), 1, 3)) = "093" Then Sheets("Sheet3").Cells(j, 2).Value =6
- ベストアンサー
- その他(プログラミング・開発)
- エクセルVBAのIF・・・Else文について
A列に日付が入っていて、それが12月の時はF列に"○"、 それ以外は"×"と表示したいのですが、下記を実行すると、 A列の空白セルの時もF列に"○"が表示されます。 何故でしょうか。Offsetを使って作成したいのですが、 すみませんが、宜しく御願いします。 Sub Test() Dim i For i = 2 To 20 If Month(Cells(i, 1)) = 12 Then Cells(i, 1).Offset(0, 6) = "○" Else Cells(i, 1).Offset(0, 6) = "×" End If Next End Sub
- ベストアンサー
- オフィス系ソフト
- *二つのマクロを両方実行させたいです*(初心者)
*二つのマクロを両方実行させたいです*(初心者) VLOOKUPのように、二つのSHEETで、それぞれ値が一致するものがあればもうひとつのSHEETのほうに値を自動的に表示させる、という仕組みをマクロで作ってみました。 (尚、今回はその中身の質問ではありません) 下記の二つの式は、それぞれは機能する、ということは確認済みなので、中身には問題ないはずなのですが、 これら二つを同じエクセルファイルに、Macro1,Macro2と設定して、実行しても、Macro2のほうしか実行されません。 1のほうは、実行を押しても作動しません。 尚、Macro2を消去すると、1のほうは正常に実行されます。 このMacro1と2は、一つにまとめても問題ありません。 (何にせよどちらも実行されればどんな形でも構いません) 初心者のため、説明が下手ですが、どなたか教えていただけないでしょうか。 どうすれば、下記の1と2を両方実行することができるのでしょうか。 下記が、私の作った式(Macro1と2です) Sub Macro1() For s = 2 To 70 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 70 '検索する元データの行数範囲 If Sheets("MASTER").Cells(u, 1) = b Then 'MASTERのA列の値とSheet1のB列が一致した場合 w = Sheets("MASTER").Cells(u, 2) 'wにB列の値を代入 Sheets("Sheet1").Cells(s, 3).Value = w 'Sheet1のC列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub Sub Macro2() For s = 2 To 70 '処理するSheet1の行数範囲 b = Sheets("Sheet1").Cells(s, 2) 'bにB列の値を代入 For u = 2 To 70 '検索する元データの行数範囲 If Sheets("MASTER").Cells(u, 1) = b Then 'MASTERのA列の値とSheet1のB列が一致した場合 w = Sheets("MASTER").Cells(u, 2) 'wにB列の値を代入 Sheets("Sheet1").Cells(s, 3).Value = w 'Sheet1のC列に値を入力 Exit For '値が見つかったのでForを終了 End If Next Next End Sub
- ベストアンサー
- Visual Basic
- Excel VBA グラフ作成のときのエラー
VBA初心者です。Excel2003を使っています。 Sheet1に作りたいグラフがあります。 データは下記のとおりです。 ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A")のところで、「実行時エラー13 型が一致しません」とエラーがでます。 不思議なのは、昨日は動いていたのです。 なぜ、エラーが出るようになったのかわかりません。 ご教授よろしくお願いします。 A B 1 a 1 2 2 3 3 4 4 5 5 6 b 6 7 7 8 8 9 9 10 10 11 c 11 12 12 13 13 14 14 15 15 Sub test() Wrow = Worksheets("sheet1").Cells(Rows.Count, "A").End(xlUp).Row For i = 1 To Wrow If Worksheets("sheet1").Cells(i, "A").Value = "a" Then a_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "b" Then b_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "c" Then c_data = Worksheets("sheet1").Cells(i, "A").Row ElseIf Worksheets("sheet1").Cells(i, "A").Value = "d" Then d_data = Worksheets("sheet1").Cells(i, "A").Row End If Next Sheets("sheet1").Select Range(Cells(a_data, "B"), Cells(b_data, "B")).Select ActiveSheet.ChartObjects.Add(30, 10, 500, 200).Select ActiveChart.ChartType = xlLineMarkers ActiveChart.SetSourceData Source:=Sheets("sheet1").Range(Cells(a_data, "B"), Cells(b_data - 1, "B")), PlotBy:=xlColumns ActiveChart.Location where:=xlLocationAsObject, Name:="sheet1" Sheets("sheet1").Select ActiveChart.Axes(xlCategory, xlPrimary).CategoryType = xlAutomatic ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection.NewSeries ActiveChart.SeriesCollection(1).Name = Cells(a_data, "A") ←エラーがでます。 ActiveChart.SeriesCollection(2).Values = Range(Cells(b_data, "B"), Cells(c_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(b_data, "A") ActiveChart.SeriesCollection(3).Values = Range(Cells(c_data, "B"), Cells(d_data, "B")) ActiveChart.SeriesCollection(2).Name = Cells(c_data, "A") End Sub
- ベストアンサー
- オフィス系ソフト
- EXCEL2007 VBA IF文について
プログラム If Sheets("sheet1").Cells(85, 1).Value = Cells(13, 1).Value Then msgBox "true" Else msgBox"false" End If 値 Sheets("sheet1").Cells(85, 1).Value ← 0.38125 Cells(13, 1).Value ← 0.38125 上記のプログラムと値のとき、結果はtrueが表示されると思うのですが、なぜかfalseが表示されてしまいます。なぜ、falseが表示されるのか解りましたら教えてください。 値はウォッチで確認しています。
- ベストアンサー
- その他MS Office製品
- このVBA、もうちょっとシンプルにできないですか?
自力でVBAを書いてみたのですが、長くなってしまいました。 もうちょっとシンプルにするアイディアがあればお願いします。 やりたいことは、 (1)ユーザーフォームのテキストボックス内が空欄だったら「無視」 (2)テキストボックスの中が空欄でなければ「書き込み」 以上のことをやりたいのですが、テキストボックスが6種類あるので単純に記述すると結構長くなってしまいました。 特に問題がなければ、その旨をお願いします。 If TextBox1 = "" Then If TextBox2 = "" Then If TextBox3 = "" Then If TextBox4 = "" Then If TextBox5 = "" Then If TextBox6 = "" Then MsgBox ("得点が入力されていません。") ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If ElseIf TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ElseIf TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If ElseIf TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If ElseIf TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value If TextBox6 <> "" Then Sheets("総合(得点)").Cells(t + 9, u) = TextBox6.Value End If End If End If End If ElseIf TextBox2 <> "" Then Sheets("総合(得点)").Cells(t + 5, u) = TextBox2.Value If TextBox3 <> "" Then Sheets("総合(得点)").Cells(t + 6, u) = TextBox3.Value If TextBox4 <> "" Then Sheets("総合(得点)").Cells(t + 7, u) = TextBox4.Value If TextBox5 <> "" Then Sheets("総合(得点)").Cells(t + 8, u) = TextBox5.Value ・ ・ ・ こんな感じで規則的に記述しただけです。(文字数が多いので最後は省略しました) 段差がなくて見づらいですが、宜しくお願いします。
- ベストアンサー
- Visual Basic
- IFの構文で
IF の構文を作っていますが Cells(p, 6) がブランクのとき何もしない Cells(p, 6)<= If Cells(p, 7) とき何もしない Cells(p, 6)< If Cells(p, 7) とき その列を削除する という文にしたいのですがうまくできません 自分なりに以下つくったのですが.... お教えいただければと思い投稿しました、どうぞよろしくお願いします。 Sub 削除() Dim p As Long Sheets("前P").Select For p = 200 To 7 Step -1 ’なにもしないで次の処理へ行く ここがうまくいかない If Cells(p, 6) = " " Then ElseIf Cells(p, 6) < Cells(p, 7) Then Range(Cells(p, 2), Cells(p, 20)).Select Selection.Delete Shift:=xlUp End If Next p End Sub うまくいかないのは上記の構文だとブランクも削除の対象と なってしまうところです。 うまくブランクは残して実行する方法を教えていただきたいのですがよろしくお願いいたします。 .
- 締切済み
- Visual Basic
- エクセルVBAについて教えてください。
DSUMを使ってVBAで自動計算をさせたいのですがうまくいきません。 ・Sheetsデータにデータを置いていて、A1からU1610までデータが入ってます。 ・Sheets集計用は計算させるための(条件を入れる)シートで、A1からE列まで(選択する項目によって何行目になるかわかりません。) ・mycountでE列のデータが入ってる行を出してます。 ・部屋タイプで1K~1LDKを選ぶとDSUMの式のタイプに1を入れたいのです。(1K~1LDKの場合はCells(1,3) 下記のように書いてみましたが上手くいきません。 どなたかご教授いただけると助かります。 mycount = "=COUNT(集計用!E2:E300)" Sheets("集計用").Cells(5, 7).Value = Range("g10") = " =DSUM(cells(データ!,1),1610,21),cells(データ!1,タイプ),cells(集計用!),cells(mycount,5))" '部屋タイプの選択 If Sheets("フォーム").Range("c30") = "1K~1LDK" then タイプ = 3 ElseIf Sheets("フォーム").Range("c30") = "2K~2LDK" Then タイプ = 6 ElseIf Sheets("フォーム").Range("c30") = "3K~3LDK" Then タイプ = 9 ElseIf Sheets("フォーム").Range("c30") = "4K~4LDK" Then タイプ = 12 Else Sheets("フォーム").Range("c30") = "その他" Then タイプ = 15 End If
- ベストアンサー
- Visual Basic
お礼
解説ありがとうございます ESCで止まらないなら、やはりVariant型の方がよさそうですね 他の変数も見直してみます