以下コードで未入力セルがあったらメッセージを出し、なければダイアログ保存に進むコードです。
セルに指定が多くRngだけで全部のセルを指定するとエラーになってしまいました。
ネットで調べてもわからなかったのですが指定セル数を減らすとエラーが出ませんでした。
そこでRngとRng2の2つに分けたのですがRngセルが未入力セルがあったらメッセージ出るのですがRng2セルに未入力があってもメッセージが出ません。
以下に
If Rng2.Value = "" Then
MsgBox "未入力項目があります"
が入れ方混乱してまだ入っていません。
Rng2セルで未入力があったらメッセージを出すコードをご教授お願いします。
Sub 未入力確認後保存()
Dim Rng As Range
Dim Rng2 As Range
For Each Rng In Range("M1,O1,Q1,S1,U1,C2,E2,H2,S4,C5,K5,S5,C7,E7,G7,I7,K7,M7,O7,Q7,S7,K9,C14,E14,G14,I14,K14,M14,O14,Q14,S14,U14,C15,E15,G15,I15,K15,M15,O15,Q15,S15,U15,C16,E16,G16,I16,K16,M16,O16,Q16,S16,U16")
For Each Rng2 In Range("Q20,S20,U20,Q21,S21,U21,Q22,S22,U22,Q23,S23,U23,Q24,S24,U24,Q25,S25,U25,Q26,S26,U26,U27,U28,I36,K36,M36,O36,Q36,S36,U36,I37,K37,M37,O37,Q37,S37,U37,I38,K38,M38,O38,Q38,S38,U38,S47,U47,S53")
'↑セルが多すぎる為2分割にして回避
If Rng.Value = "" Then
MsgBox "未入力項目があります"
Exit Sub
End If
Next
Next
If Range("C3").Value = "" Then
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("C4") & "_" & Range("M1").Text & "年" & Range("O1").Text & "月" & _
Range("Q1").Text & "日" & "_" & Range("C2").Text & Range("E2").Text & "-" & Range("H2").Text
Else
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("C4") & "_" & Range("M1").Text & "年" & Range("O1").Text & "月" & _
Range("Q1").Text & "日" & "_" & Range("C2").Text & Range("E2").Text & "-" & Range("H2").Text & "・" & Range("C3").Text & Range("E3").Text & "-" & Range("H3").Text
End If
End Sub
No.2ベストアンサー
- 回答日時:
こちらで、詳しく検証はしてせんが、いかのようにされてはいかがでしょうか。
2重のFor Nextではなく、For Nextを2回くりかえすようにします。Sub 未入力確認後保存()
Dim Rng As Range
For Each Rng In Range("M1,O1,Q1,S1,U1,C2,E2,H2,S4,C5,K5,S5,C7,E7,G7,I7,K7,M7,O7,Q7,S7,K9,C14,E14,G14,I14,K14,M14,O14,Q14,S14,U14,C15,E15,G15,I15,K15,M15,O15,Q15,S15,U15,C16,E16,G16,I16,K16,M16,O16,Q16,S16,U16")
If Rng.Value = "" Then
MsgBox "未入力項目があります"
Exit Sub
End If
Next
For Each Rng In Range("Q20,S20,U20,Q21,S21,U21,Q22,S22,U22,Q23,S23,U23,Q24,S24,U24,Q25,S25,U25,Q26,S26,U26,U27,U28,I36,K36,M36,O36,Q36,S36,U36,I37,K37,M37,O37,Q37,S37,U37,I38,K38,M38,O38,Q38,S38,U38,S47,U47,S53")
If Rng.Value = "" Then
MsgBox "未入力項目があります"
Exit Sub
End If
Next
If Range("C3").Value = "" Then
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("C4") & "_" & Range("M1").Text & "年" & Range("O1").Text & "月" & _
Range("Q1").Text & "日" & "_" & Range("C2").Text & Range("E2").Text & "-" & Range("H2").Text
Else
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("C4") & "_" & Range("M1").Text & "年" & Range("O1").Text & "月" & _
Range("Q1").Text & "日" & "_" & Range("C2").Text & Range("E2").Text & "-" & Range("H2").Text & "・" & Range("C3").Text & Range("E3").Text & "-" & Range("H3").Text
End If
End Sub
No.6
- 回答日時:
こんにちは
>セルに指定が多くRngだけで全部のセルを指定するとエラーになってしまいました。
多分、引数の文字数制限などに引っかかっているのではないかと思われます。
セル配置に多少の規則性があるようなので、それを利用してセル範囲で指定すれば、少しは効率が良くなるかも知れません。
>Rng2セルに未入力があってもメッセージが出ません。
え~~っと・・
ループの中でRng2はチェックしていませんよね?
(Rngのみチェックしている)
とは言え、2重ループにする意味がないので、ご提示のコードだと、無駄に同じセルを何度もチェックすることになってしまいます。
また、未入力セルが見つかるごとにメッセージが表示されますので、複数セル存在すればその回数だけ表示されることになります。
(極端に言えば、全部空白なら延々とメッセージが出続ける)
以下、チェック部分の一例です。
(セル範囲指定には、ご提示のものをそのまま利用しています)
Set R1 = Range("M1,O1,Q1,S1,U1,C2,E2,H2,S4,C5,K5,S5,C7,E7,G7,I7,K7,M7,O7,Q7,S7,K9,C14,E14,G14,I14,K14,M14,O14,Q14,S14,U14,C15,E15,G15,I15,K15,M15,O15,Q15,S15,U15,C16,E16,G16,I16,K16,M16,O16,Q16,S16,U16")
Set R2 = Range("Q20,S20,U20,Q21,S21,U21,Q22,S22,U22,Q23,S23,U23,Q24,S24,U24,Q25,S25,U25,Q26,S26,U26,U27,U28,I36,K36,M36,O36,Q36,S36,U36,I37,K37,M37,O37,Q37,S37,U37,I38,K38,M38,O38,Q38,S38,U38,S47,U47,S53")
flg = True
For Each Rng In Union(R1, R2)
If Rng.Value = "" Then flg = False: Exit For
Next Rng
If Not flg Then MsgBox "未入力項目があります"
No.5
- 回答日時:
こんな逃げ道もあります。
Option Explicit
Sub 未入力確認後保存()
Const Rng2 = "M1,O1,Q1,S1,U1,C2,E2,H2,S4,C5,K5,S5,C7,E7,G7,I7,K7,M7,O7,Q7,S7,K9,C14,E14,G14,I14,K14,M14,O14" _
& ",Q14,S14,U14,C15,E15,G15,I15,K15,M15,O15,Q15,S15,U15,C16,E16,G16,I16,K16,M16,O16,Q16,S16,U16" _
& ",Q20,S20,U20,Q21,S21,U21,Q22,S22,U22,Q23,S23,U23,Q24,S24,U24,Q25,S25,U25,Q26,S26,U26,U27,U28" _
& ",I36,K36,M36,O36,Q36,S36,U36,I37,K37,M37,O37,Q37,S37,U37,I38,K38,M38,O38,Q38,S38,U38,S47,U47,S53"
Dim Rng As Variant
For Each Rng In Split(Rng2, ",")
If Range(Rng).Value = "" Then
Range(Rng).Select
MsgBox "未入力項目があります"
Exit Sub
End If
Next
If Range("C3").Value = "" Then
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("C4") & "_" & Range("M1").Text & "年" & Range("O1").Text & "月" & _
Range("Q1").Text & "日" & "_" & Range("C2").Text & Range("E2").Text & "-" & Range("H2").Text
Else
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("C4") & "_" & Range("M1").Text & "年" & Range("O1").Text & "月" & _
Range("Q1").Text & "日" & "_" & Range("C2").Text & Range("E2").Text & "-" & Range("H2").Text & "・" & Range("C3").Text & Range("E3").Text & "-" & Range("H3").Text
End If
End Sub
No.4
- 回答日時:
No.1の者です。
Rangeで指定できる文字数が、255文字の様です。
そのため、文字数の上限超えでエラーとなった様です。
2つを足すと、370文字程度になるので。
下記、検索した記事になります。
https://oshiete.goo.ne.jp/qa/4663253.html
調べましたがどり着かなかったのですがやはり指定セルが多い事による文字数オーバーだったのですね。明解になりました有難う御座います。
No.1
- 回答日時:
こんにちは。
連続している範囲は、まとめて指定する事で、何とか分割しなくても
大丈夫かと思います。
例えば、C14:U16 や Q20:U26 の様な書き方で。
Range("M1,O1,Q1,S1,U1,C2,E2,H2,S4,C5,K5,S5,C7,E7,G7,I7,K7,M7,O7,Q7,S7,K9,C14:U16,Q20:U26,U27:U28")
早速の回答有難う御座います。
範囲指定してやってたのですがうまくいきませんでした。
もう一度やってみましたところ一部セル結合していてそこの指定範囲が誤っていました。それを修正しましたら上手くいきました有難う御座います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) Excelでセル内の一部のみ同じセルを検索し、そのセルと同じ行で任意の列のセルを選択する方法 2 2021/12/17 11:01
- Visual Basic(VBA) 左から空白文字を探して左側を比較する 4 2022/02/02 22:48
- Visual Basic(VBA) select case について 1 2023/09/24 23:14
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) シート名でファイル検索する 2 2021/11/30 17:05
- Visual Basic(VBA) セルS2に入力した「月」と一致したB列の右隣へセルS110の値を転記する下記マクロを実行するとエラー 2 2022/12/06 17:32
- Visual Basic(VBA) 転記先VBA 一致しているセルがコピーされない 5 2021/11/15 17:23
- Excel(エクセル) Rangeメソッドは失敗しました。globalオブジェクトについて 6 2021/11/21 21:54
- Excel(エクセル) 空白行も含めてソートしたい 3 2022/02/01 23:13
- Excel(エクセル) マクロで変数を用いてセルを選択し、そのセル内の数値を計算式に入れる方法 3 2021/12/27 22:59
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
EXCELマクロ 保護されているシ...
-
エクセルテキストボックスの文...
-
データが入力されている隣のセ...
-
ハイパーリンクされているファ...
-
カンマ区切りの文字列単位で色...
-
セル色を5秒間隔で変える
-
ダブルクリックすると現在の時...
-
困った!日付の変換
-
メッセージを1度だけ表示したい。
-
VBA セルに合わせて移動するが...
-
(VBA)アクティブセルを起点に...
-
Swing 編集不可でも選択可能なJ...
-
VBAで丸をつけたいです。
-
文字の表示のさせかた
-
VBAで、貼り付け禁止命令を実現...
-
StringGridでの文字入力制限
-
Excelのセル内にある図形を削除...
-
離れた複数のセルのどこかに文...
-
エクセルのVBAでダブルクリック...
-
エクセル: セルの枠を超えて表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELマクロ 保護されているシ...
-
VBAで、貼り付け禁止命令を実現...
-
エクセルテキストボックスの文...
-
データが入力されている隣のセ...
-
VBAで丸をつけたいです。
-
ダブルクリックすると現在の時...
-
メッセージを1度だけ表示したい。
-
エクセルVBA セル選択後にカレ...
-
ハイパーリンクされているファ...
-
Excelについて
-
エクセルVBA(実行時エラー438...
-
Windowsで動くVBAがmacOSで動か...
-
Jtableの特定のセルの背景色や...
-
(VBA)アクティブセルを起点に...
-
VBAについて教えてください。 E...
-
VBA セルに合わせて移動するが...
-
セル色を5秒間隔で変える
-
Excel VBA ダブルクリックで入...
-
Excelのセル内にある図形を削除...
-
Excel VBA セルを指定個数ラン...
おすすめ情報