プロが教えるわが家の防犯対策術!

以下コードで未入力セルがあったらメッセージを出し、なければダイアログ保存に進むコードです。
セルに指定が多く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

教えて!goo グレード

A 回答 (7件)

こちらで、詳しく検証はしてせんが、いかのようにされてはいかがでしょうか。

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
    • good
    • 0
この回答へのお礼

いただいたFor Nextを2回くりかえすコードで動作しました。
回答有難う御座います。

お礼日時:2022/02/19 22:27

No6です。



見落としていました。

ご提示のコードには
>Exit Sub
があるので、メッセージが何度も出るようなことはないですね。

失礼いたしました。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
参考にさせていただきます。

お礼日時:2022/02/19 22:46

こんにちは



>セルに指定が多く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 "未入力項目があります"
    • good
    • 1

こんな逃げ道もあります。



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
    • good
    • 1
この回答へのお礼

回答有難う御座います。
まだすぐ理解出来ていないところがありますので検証させていただきます。

お礼日時:2022/02/19 22:33

No.1の者です。



Rangeで指定できる文字数が、255文字の様です。
そのため、文字数の上限超えでエラーとなった様です。
2つを足すと、370文字程度になるので。

下記、検索した記事になります。
https://oshiete.goo.ne.jp/qa/4663253.html
    • good
    • 0
この回答へのお礼

調べましたがどり着かなかったのですがやはり指定セルが多い事による文字数オーバーだったのですね。明解になりました有難う御座います。

お礼日時:2022/02/19 22:31

マクロの記録で、とびとびのセルをたくさん選択すると次のようなコードが生成されます。

なので、同じようなコードを書けばイケると思いますよ。

Union(Range("B16,B18,B20,D11,D13,D15,D17"), Range("K14,J15,L12,M10,B6,B8,B10,B12,B14")).Select
    • good
    • 0
この回答へのお礼

回答有難う御座います。
記録からやってみます。

お礼日時:2022/02/19 22:28

こんにちは。



連続している範囲は、まとめて指定する事で、何とか分割しなくても
大丈夫かと思います。
例えば、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")
    • good
    • 0
この回答へのお礼

早速の回答有難う御座います。
範囲指定してやってたのですがうまくいきませんでした。
もう一度やってみましたところ一部セル結合していてそこの指定範囲が誤っていました。それを修正しましたら上手くいきました有難う御座います。

お礼日時:2022/02/19 22:21

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング