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

tatsumaru77さん見て頂ければご回答お願いします、、
前回の内容が少し尹とが違いまして、、

EEEより下のデータで判定します
もし必須項目にデータがなかったらメッセージボックスに警告を表示したいです。
列・行ともに可変です。(最終行・列の取得方法でお願いします)

「マクロについて(tatsumaru77さ」の質問画像

質問者からの補足コメント

  • うーん・・・

    決め打ちとはどのようなことでしょうか、、
    1行ずつ見ていって
    3行目の場合、
    EEEが20の時括かつBBBには空かどうか
    EEEが20の時括かつDDDには空かどうか

    というような感じにできますでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2023/06/07 19:39
  • ありがとうございます。
    こちらにメッセージ警告アラートは付けられますか。。。

    No.3の回答に寄せられた補足コメントです。 補足日時:2023/06/07 23:55

A 回答 (5件)

列が増えた場合の対応は行っていません。

(行えません)
列が増えて、その列が20か50の必須項目になる場合は、マクロを修正する必要があります。


Option Explicit

Public Sub 必須項目チェック()
Dim maxrow As Long '最大行
Dim wrow As Long '行番号
Dim ws As Worksheet '本シート
Dim cnt As Long '件数カウンター
Set ws = ActiveSheet
maxrow = ws.Cells(Rows.Count, "F").End(xlUp).Row 'F列の最大行取得
If maxrow < 3 Then Exit Sub
ws.Range("B3:E" & maxrow).Interior.Pattern = xlNone
For wrow = 3 To maxrow
If ws.Cells(wrow, "F").Value = 20 Then
Call hantei(ws.Range("C" & wrow), cnt)
Call hantei(ws.Range("E" & wrow), cnt)
End If
If ws.Cells(wrow, "F").Value = 50 Then
Call hantei(ws.Range("B" & wrow), cnt)
Call hantei(ws.Range("D" & wrow), cnt)
End If
Next
If cnt = 0 Then
MsgBox ("チェック完了")
Else
MsgBox ("必須項目データなし=" & cnt & "件")
End If
End Sub
Private Sub hantei(rng As Range, cnt As Long)
If rng.Value = "" Then
rng.Interior.Color = 49407 'オレンジ
cnt = cnt + 1
End If
End Sub
    • good
    • 0
この回答へのお礼

ご回答とご指摘ありがとうございます。
とても助かりました。

お礼日時:2023/06/08 09:06

>こちらにメッセージ警告アラートは付けられますか。

。。

付けるのは可能ですが、質問者さん自身が欲する仕様が不明です。

例えばセルの色が変わったアドレスを一気に表示させたいのか?
⇒この場合セルの色が変化しているので警告が必要なの?とも思えますし、何より色を消すために再度実行する必要があります。
ならVBAより条件付き書式を用いた方がリアルタイムに色を変更できるので、視認性は良いと私は思います。

またセルの色を変え警告を出すよりも、必要な入力がされてないとInput関数やメソッドにより該当セルを選択し入力を促せば、セルの色を変更する必要はないと思います。
⇒その該当セルの量によっては一旦セル色を変え、どこがまずいのかを知る方がやりやすいのかもですが。

その辺の求める仕様次第であり、ここについてはご指名の方が既に対応していると思って省きました。
取り敢えず追加要求が出ているようですから、それに補足してあげては如何でしょうか?
⇒dポイントに興味ないのでBAを狙うつもりは私にはありませんし。
あと特定の回答者名を質問文に載せるのは、知恵袋でも一時期あった【回答リクエスト】の廃止にあるよう【自作自演を疑われる】事に成りかねないので控えた方が宜しいかと。
    • good
    • 0

画像のみで判断したコード。



Sub test()
Dim r As Range

For Each r In Range("F3", Cells(Rows.Count, "F").End(xlUp)).Offset(, -4)

With r

Select Case .Range("E1").Value

Case 20
.Range("B1").Interior.ColorIndex = IIf(.Range("B1").Value = "", 6, 0)
.Range("D1").Interior.ColorIndex = IIf(.Range("D1").Value = "", 6, 0)

Case 50
.Range("A1").Interior.ColorIndex = IIf(.Range("A1").Value = "", 6, 0)
.Range("C1").Interior.ColorIndex = IIf(.Range("C1").Value = "", 6, 0)

End Select

End With

Next

End Sub
この回答への補足あり
    • good
    • 0

>決め打ちとはどのようなことでしょうか、、



マクロ内で20又は50に対応する列を決めて持つということです。
(ハードコーディングともいいます)
20ならば、BBB,DDD列が空白か否かをみる。
50ならば、AAA,CCC列が空白な否かをみる。
上記のようにすることは可能です。
現在はFFFは、空白は無視することになっています。
今後、GGG、HHH、IIIなどが追加されても、その列の空白は無視して良いのでしょうか。

そうであれば、最終列を求める必要はありません。(B列~E列だけみれば良いので)
EEE(F列)の最終行のみを求めれば済みます。
上記の仕様で問題なければ、そのようにすることは可能です。
    • good
    • 0

EEEが20の時、C列(BBB)とE列(DDD)の値が空欄かどうかをみるということですが、EEEが20の時、C列とE列を参照するということは、決め打ちで良いのですか? 


どのようにして、C列とE列にたどり着けば良いのでしょうか。
(前回は2行目にその情報がありましたが、今回はありません)
この回答への補足あり
    • good
    • 0

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