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

作業者のうっかりミスを警告するプログラムを作成しています。
A列9行目以降の値が500以上で、かつ同じ行のF列の値が空白であったときメッセージを表示する。・・・(1)
G列9行目以降が「○」で、かつ同じ行のDまたはE列に「在庫」の文字列あったときメッセージを表示する。・・・(2)

下記のようなプログラムを作成したのですが、もっと良い方法があるのではないかと思っています。
何かアドバイスいただけると助かります。
欲を言えば、メッセージ「部品番号○○の発注先のセルが空白になています。」((1)の場合)や、
「部品番号○○の備考のセルに在庫の文字があります。」((2)の場合)が、ミスが多数あれば
何度も表示されるのを1回または(1)(2)それぞれ1回にまとめて表示できないか考えています。

作業者は以下の作業を行います。
A列の9行目以降は部品番号の数値を入力します。(1、2・・・、101、102・・・、501、502・・・など)
DまたはE列の9行目以降は備考の文字列を入力します。(熱処理、ボルト付属、在庫使用・・・など)
F列の9行目以降は発注先の文字列を入力します。(フタバ、ミスミ、パンチ・・・など)
G列の9行目以降は発注先によって自動的に○になります。(セルに数式が入っています)
表を見やすくするために空白の行を任意の行に設けます。
入力する行は最大でも999以内とします。(実際には300くらいです)

(1)の補足:部品番号(A列)の500以降は発注先(F列)が必ず必要であり、この記入漏れに対して警告する。
(2)の補足:備考(DまたはE列)が「在庫使用」で発注(G列)が○は矛盾するので、この記入に対して警告する。

<シート>
(B、C列の値は省略しています)
    A      B      C    D      E      F    G

8  部品番号  型番   個数  備考1   備考2   発注先  発注
9    101                   
10  102                              パンチ
11
12  501                              フタバ  ○
13  502                              パンチ
14  503
15  504
16  505               在庫使用         ミスミ  ○
17  506                              ミスミ  ○
18  507               熱処理  在庫使用  ミスミ  ○
19  508                              ミスミ  ○
20  509                              ミスミ  ○
21  510                              ミスミ  ○
22 
23  601                              フタバ  ○
24  602                              フタバ  ○

<プログラム>
Sub TEST()

Dim 部品番号 As String
For i = 9 To 999
If Cells(i, 1).Value >= 500 And Cells(i, 6).Value = "" Then
部品番号 = Cells(i, 1).Value
MsgBox "部品番号" & 部品番号 & "の発注先のセルが空白になっています。"
Else
End If
Next

For i = 9 To 999
If Cells(i, 7).Value = "○" And (Cells(i, 4).Value Like "*在庫*" Or Cells(i, 5).Value Like "*在庫*") Then
部品番号 = Cells(i, 1).Value
MsgBox "部品番号" & 部品番号 & "の備考のセルに在庫の文字があります。"
Else
End If
Next

End Sub

A 回答 (2件)

とりあえずご質問の直接の回答として。



sub macro1()
 dim i as long
 dim mes as string
 dim lastrow as long

 range("F:G").interior.colorindex = xlnone
 lastrow = range("A65536").end(xlup).row

 for i= 9 to lastrow
  if cells(i, "A") >= 500 and cells(i, "F") = "" then
   mes = mes & vblf & "部品番号" & cells(i, "A") & "の発注セルが空白"
   cells(i, "F").interior.color = vbred
  end if
 next i
 msgbox mid(mes, 2)

 mes = ""
 for i = 9 to lastrow
  if cells(i, "G") = "○" then
  if cells(i, "D") like "*在庫*" or cells(i, "E") like "*在庫*" then
   mes = mse & vblf & "部品番号" & cells(i, "A") & "は在庫使用"
   cells(i, "G").interior.color = vbred
  end if
  end if
 next i
 msgbox mid(mes, 2)
end sub
    • good
    • 0

質問者様がどれくらいプログラムに詳しいかわかりませんが…。



個人的にもよく遭遇する問題なので、お気持ちはわかります。
案としては以下の4案があるかと思います。

案1:1か所でも条件に合わないセルがあったら、それ以上のチェックを止める
 条件に合わないセルを見つけたら、警告メッセージの表示を行い、その後"Exit Sub"で処理を終わらせます。
 [メリット]
  1回の処理で1回の警告メッセージしか出さないので、操作がうっとおしくない
 [デメリット]
  1回の処理で警告を1か所しか知らせないので、複数該当箇所があれば、
  全ての該当箇所を修正するまで何度もチェック処理を実行しなくてはいけない

案2:条件不適合セルの情報を集めておいて、最後に表示する
 ・多少プログラムがお分かりであれば、String変数Alartを宣言し、条件に合わないセルを見つけたら、
  Alartに部品番号のなどの情報を設定しておく
  (この場合、変数に部品番号の情報を追記していく形で設定していきます)
 ・全セルのチェックを終えたら、Alartが空白かどうかチェックします。
  空白でない場合(部品番号情報が設定されている場合は)最後に警告メッセージを出力します。
 [メリット]
  1回の操作で全てのエラー個所が判明する
 [デメリット]
  多少のプログラム知識が必要

案3:セルの色を変える
 エラーメッセージではなく、条件に合わないセルの色を変更する
 [メリット]
  1回の操作で全てのエラー個所が判明する
  細かいプログラム知識が不要
 [デメリット]
  セルの値を修正後、セルの色を元に戻す必要がある
 
案4:マクロではなく、条件付き書式で対応
 該当セルに条件付き書式を組み込み、条件に合わないようであればセルの色が変わるように設定
 [メリット]
  そもそもマクロが不要で、チェック処理を走らせる必要もない
  結果は案3と同じになる
  正しい値を入力すればセルの色が戻るので、案3のようなセルの入りを戻す対応も不要
 [デメリット]
  条件付き書式を設定する知識が必要
  値の範囲が可変的に極まる場合は、ちょっと問題があるかも?
    • good
    • 0

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