最大1万円超分の電子書籍プレゼント♪

ある空白セルに「済」と入力(実際はデータの入力規則によりリストから選択)することにより、次の処理が発火するように設定しています。
もともと空白セルに「済」を入力する場合はよいのですが、既に「済」が入力されている場合でももう一度「済」をリスト選択することも可能であるため、二重に処理がされてしまいます。
これを防ぐため、既に「済」が入力されている場合はメッセージを出す等のチェックをしたいのですが、今の私では思い付きません。
この場合は、worksheet changeイベントプロシージャにてどのような構文にすればよいでしょうか。

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

  • changeイベントはセルの値が変更された時点で発生するのであれば、済と入力する前のセル値が何かを判別できないのではないでしょうか。

    No.1の回答に寄せられた補足コメントです。 補足日時:2021/12/02 22:29
gooドクター

A 回答 (6件)

基本的な部分は、すでに実装できているんですよね?


であれば、こんなのはどうでしょうか。
SelectionChangeイベントで、選択されたセルの値を保存し、Changeイベントで、保存した値を参照しています。

Option Explicit

Dim b As Variant

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
b = Target.Value

End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
If b = "" And Target.Value = "済" Then
MsgBox "発火"
ElseIf b = "済" And Target.Value = "済" Then
MsgBox "すでに済です。"
End If

b = Target.Value

End Sub
    • good
    • 0

#1,3です


ざっくりで気になり、少し考えました
既に解決出来であろう回答が出ているので気が引けますが、

Thisworkbookモジュールに
Private Sub Workbook_Open()
Worksheets("Sheet1").Activate
Call prohibition_Range(ActiveSheet)
End Sub
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Call prohibition_Range(Sh)
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim rc As VbMsgBoxResult
Application.EnableEvents = False
If Not phbRange Is Nothing Then
If Not Intersect(phbRange, Target) Is Nothing Then
rc = MsgBox("入力しますか?", vbYesNo + vbDefaultButton2)
If rc = vbNo Then
Application.Undo
Application.EnableEvents = True
Exit Sub
End If
End If
End If
Call prohibition_Range(Sh)
Application.EnableEvents = True
End Sub

標準モジュールに
Public phbRange As Range
Sub prohibition_Range(Sh As Worksheet)
Dim r As Range
Set phbRange = Nothing
With Sh
For Each r In .Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp))
If r.Value = "済" Then
If phbRange Is Nothing Then
Set phbRange = r
Else
Set phbRange = Union(phbRange, r)
End If
End If
Next
End With
End Sub

.Range(.Cells(1, 1), .Cells(Rows.Count, 1).End(xlUp)) については
各シート同じ範囲なら適時範囲を設定してください。
暫定 A列1行から最終行、、
Workbook_SheetChangeはシートの限定が必要かも、、
デバッグ不足でエラーの可能性があるかと思いますが、対応してください。
    • good
    • 0

No.2の者です。



>1ヶ月ごとのシートにおいて、
シートが何枚か?Max12枚あるという事でしょうか?

>毎日分の31列×3ヶ所(3行分)だけです。
今まで、使用した事のあるセルでしたが、下記の様に範囲指定で良いかと。
myAllDat = Range(Range("A1"), Range("A1").SpecialCells(xlCellTypeLastCell)).Value

myAllDat = Range("A1:AE3").Value 'A1~AE3なら、適宜変更して下さい

>イベントプロシージャにて、済と入力すると次の処理を行うかをMsgboxで選択させていますが、イベントプロシージャではなく、別ボタン等で処理を促せばセル値が何かによって分岐できるんですけど。
→セルには、旧、新のデータが取得できて、そのデータだけでは判断できず
他にボタンなどでの操作が必要という事でしょうか?
msgboxですと、はい、いいえ、キャンセルの3つのボタンが表示できます。
これを応用するのが簡単だと思いますが、それ以外ですとユーザーフォーム
を表示されてとなるでしょうか?
    • good
    • 0

こんばんは、#1です


深く考えず回答してしまいすみませんでした。
#2様が回答しているように
Private Sub Workbook_Open() や
Private Sub Workbook_SheetActivate(ByVal Sh As Object) などで
済と入力されている範囲のデータ(又はアドレス)を取得して
アドレスの場合、worksheet change で Intersectなどを用いて
Target.Addressなどで分岐するのはどうでしょう。

ざっくりでごめんなさい。
    • good
    • 0
この回答へのお礼

現時点では、済入力欄のセル範囲を名前で定義付けし、その範囲内のセルに済と入力された場合は、次処理がされるようなコードです。

お礼日時:2021/12/07 12:56

こんばんは。



他に良い方法があるかも知れませんが、例えば、下記とかどうでしょうか?
1,Workbook_Openで、シート上の全データを取得
2,Worksheet_Changeで、変更のあったセルと、1,で取得しておいた
 データで、同じアドレスのデータを比較する。
3,その後、全データを取得し直し。 2,から繰り返し

'Sheet1に下記を記載
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With Target
If .Value = myAllDat(.Row, .Column) Then
MsgBox "同じ"
Else
MsgBox "違う"
End If
Call データの取得
End With
End Sub

'Thisworkbookに下記を記載
Private Sub Workbook_Open()
Worksheets("Sheet1").Select
Call データの取得
End Sub


'標準モジュールに下記を記載
Option Explicit
Public myAllDat As Variant
Sub データの取得()
myAllDat = Range(Range("A1"), Range("A1").SpecialCells(xlCellTypeLastCell)).Value
End Sub


注意点として、複数のセルを選んで、Ctrl + Enterなどの、一括入力だと
エラーが出ますので、その対応は必要かもしれません。
その他、適宜、調整してみて下さい。
    • good
    • 0
この回答へのお礼

ありがとうございます。
済と入力するセル範囲は、1ヶ月ごとのシートにおいて、毎日分の31列×3ヶ所(3行分)だけです。
イベントプロシージャにて、済と入力すると次の処理を行うかをMsgboxで選択させていますが、イベントプロシージャではなく、別ボタン等で処理を促せばセル値が何かによって分岐できるんですけど。

お礼日時:2021/12/02 23:24

>処理が発火するように設定しています


ならば、Target.Value または、Target.Textで処理を分けます。

If Target.Value = "済" Then
'セルの値が済の場合
Else
'セルの値が済でない場合
End If
この回答への補足あり
    • good
    • 0

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

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

gooドクター

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

人気Q&Aランキング