プロが教える店舗&オフィスのセキュリティ対策術

以下①でRange("A1,D1")に空欄があったらメッセージ出し終了、空欄がなかったら②で保存するようにしたいです。
ELSE Ifで繋ぐのだろうなぁと思っていろいろやってみたのですがFor Nextがあるとどこに入れて繋げばいいのかわからなくなってしまいました。
①②を1つにするにはどうしたらいいでしょうか。宜しく御願いします。

①Sub 空欄セル確認()
Dim Rng As Range
For Each Rng In Range("A1,D1")
If Rng.Value = "" Then MsgBox "未入力項目があります"
Next
End Sub

②Sub セルText名でダイアログ_マクロ無し保存()
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("A1").Text & "月" & Range("D1").Text & "日", arg2:=12
End Sub

A 回答 (7件)

No.1へのコメントについて。



> Rng.Value = "" Then MsgBox "未入力項目があります"
> Exit Sub

いや、改行しちゃだめで、
If Rng.Value = "" Then MsgBox "未入力項目があります": Exit Sub
というふうにするんです。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
読解力不足で申し訳御座いません。動作しました。
後学の為に「:」の使い方を確認します。

お礼日時:2022/02/15 10:53

No.6へのコメントについて。


> 後学の為に「:」の使い方を

If Rng.Value = "" Then MsgBox "未入力項目があります": Exit Sub

If文ですから、「条件が不成立なら、Thenの右側は全部無視して次の行にいく」という動作をする。だからこれは

If Rng.Value = "" Then
MsgBox "未入力項目があります"
Exit Sub
End If

と全く同じです。
 ひとつでも未入力項目があるのを発見したら、MsgBoxを出すのはいいけれども、その先を漫然と続けちゃダメで、そこで打ち切り、おしまいにしなくちゃいけない。だからExit Subです。

 ":"は複数の文を1行にまとめて書くための区切りです。だからたとえば

A = 1: B = 2: C = 3 : D = 4: E = 5

のように、行を分けて書くと長ったらしくなるのを、単にスッキリ読みやすくするだけの目的で使ってもいいんです。
 でもこの場合には、ただ短くするだけではありません。条件が成立した場合に二つのこと、MsgBoxとExit Sub を逐次やらせたい。とは言ってもMsgBoxはプログラムの制御にとってさして重要ではない、ま、ザコみたいなもんですので、わざわざ4行で書くのも大げさってか、業腹である。それで":"を使って、「条件が不成立のときには実行しない部分(2つの文)」をまとめたわけです。
    • good
    • 0
この回答へのお礼

回答有難う御座います。
以下と同じでそれを簡略化したコードと言う事なんですね。
Sub 空欄セル確認()
Dim Rng As Range
For Each Rng In Range("A1,D1")
If Rng.Value = "" Then
MsgBox "未入力項目があります"
Exit Sub
End If
Next
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("A1").Text & "月" & Range("D1").Text & "日", arg2:=12
End Sub

お礼日時:2022/02/15 22:30

責任範疇が広がるため、①と②をひとまとめのコードにすることはおすすめしません。


入力値の検証と、検証が妥当だった際の処理を切り分けていると想定します。
その場合、検証結果が妥当/不当かという情報を得た上で、その後の処理を実施するようにします。

Sub Main()
If Not 空欄セル確認() Then
Exit Sub
End If

Call セルText名でダイアログ_マクロ無し保存
End Sub

Function 空欄セル確認() As Boolean
Dim Rng As Range
For Each Rng In Range("A1,D1")
If Rng.Value = "" Then
MsgBox "未入力項目があります"
空欄セル確認 = False
Exit Function
End If
Next
空欄セル確認 = True
End Function

Sub セルText名でダイアログ_マクロ無し保存()
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("A1").Text & "月" & Range("D1").Text & "日", arg2:=12
End Sub
    • good
    • 0
この回答へのお礼

回答有難う御座います。
1行づつ確認させていただきます。

お礼日時:2022/02/15 10:45

こんばんは



チェックするセルが2つだけのようなので、わざわざループにしなくても良いのでは?
単純な If ~ Then ~ Else ~ の構文で済みます。

If Range("A1") = "" Or Range("D1") = "" Then
MsgBox "未入力項目があります"
Else
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("A1").Text & _
"月" & Range("D1").Text & "日", arg2:=12
End If
    • good
    • 0
この回答へのお礼

例題は2つのセルにしたのですが実際はたくさんのセルを扱います。
説明不足で大変申し訳ございません。

お礼日時:2022/02/15 22:20

こんばんは。



例えば、下記の様な記載でしょうか?

①Sub 空欄セル確認()
Dim Rng As Range
For Each Rng In Range("A1,D1")
If Rng.Value = "" Then
MsgBox "未入力項目があります"
Exit Sub
End If
Next
Call セルText名でダイアログ_マクロ無し保存()
End Sub
    • good
    • 0
この回答へのお礼

動作しましたCallというやり方があるのですね、勉強になります。
メモらせていただきます。

お礼日時:2022/02/15 10:47

Sub ~~ End Sub が一番外側



その内側に For Each ~~ Next があり

その更に内側でIf Then Else If がある
    • good
    • 0
この回答へのお礼

回答有難う御座います。
文法の説明いただき非常に勉強になります。

お礼日時:2022/02/15 22:18

まず、「あります"」に続けて : exit sub と書く。

そして、②のナカミをNextの次の行に入れる。
    • good
    • 0
この回答へのお礼

早速の回答有難う御座います。
以下にしてみましたら動作しませんでした。
Sub 空欄セル確認()
Dim Rng As Range
For Each Rng In Range("A1,D1")
If Rng.Value = "" Then MsgBox "未入力項目があります"
Exit Sub
Next
Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("A1").Text & "月" & Range("D1").Text & "日", arg2:=12
End Sub

お礼日時:2022/02/14 23:04

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