●質問の主旨
ワークシートのイベントプロシージャにおいて右クリック
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
を連続で使用するためには以下のコードをどのように書き換えればよいでしょうか?
ご存知の方ご教示願います。
●質問の補足
ExcelのワークシートとVBAでタイムカードを作成しています。
以下のコードでは「出勤打刻」も「退勤打刻」もできません。
「退勤打刻」のコードを削除すると、「出勤打刻」はできます。
「プロシージャ名が適切ではありません」とエラーが返されます。
エラーの意図は分かりますが、「出勤打刻」と「退勤打刻」のクリック方法が違うのも
紛らわしいとも思います。同じクリック方法で統一するにはどうすればよいか悩んでいます。
●コード
'---------------------定数---------------------
Const SYUKIN_DAKOKU_CLMN As Integer = 5 '出勤打刻位置の列番号
Const TAIKIN_DAKOKU_CLMN As Integer = 6 '退勤打刻位置の列番号
Const DAY_CLMN As Integer = 2 '日付欄の列番号
'---------------------出勤打刻---------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = SYUKIN_DAKOKU_CLMN Then '出勤打刻の位置
Cancel = True 'コンテキストメニューの抑制
If IsEmpty(Target.Value) Then 'ターゲットが空白のとき
If Cells(Target.Row, DAY_CLMN).Value = Day(Date) Then '右クリックしたときの日付が日付欄の日付と等しいとき
Target = Time '右クリックしたセルに現在の時間を表示
Target.NumberFormat = "hh:mm" '時間の表示形式は "hh:mm"
Else
MsgBox "打刻位置が間違っています", vbExclamation, "打刻位置の確認" 'メッセージ表示
Cancel = True 'コンテキストメニューの抑制
End If
Else '打刻済みのときはメッセージ表示
MsgBox "すでに打刻しています", vbExclamation, "打刻位置の確認"
End If
End If
End Sub
'---------------------退勤打刻---------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target2.Column = TAIKIN_DAKOKU Then '出勤打刻の位置
Cancel = True 'コンテキストメニューの抑制
If IsDate(Cells(Target.Row, DAY_CLMN)) = True Then '出勤打刻がされていれば
If IsEmpty(Target.Value) Then 'ターゲットが空白であれば
If Cells(Target.Row, DAY_CLMN).Value = Day(Date) Then '右クリックしたときの日付が日付欄の日付と等しい
Target = Time '右クリックしたセルに現在の時間を表示
Target.NumberFormat = "hh:mm" '時間の表示形式は "hh:mm"
Else
MsgBox "打刻位置が間違っています", vbExclamation, "打刻位置の確認" 'メッセージ表示
Cancel = True 'コンテキストメニューの抑制
End If
Else '打刻済みのときはメッセージ表示
MsgBox "すでに打刻しています", vbExclamation, "打刻位置の確認"
End If
End If
End If
End Sub
No.1ベストアンサー
- 回答日時:
同一イベントプロシージャは1つしか定義できないので1つにまとめて下さい。
私見ですが、クリック列はB列にして、C・D列の入力有無で自動選択しては
如何でしょうか。
mu2011様
いつもお世話になります。
>私見ですが、クリック列はB列にして、C・D列の入力有無で自動選択しては
如何でしょうか。
ご意見参考にさせていただきます。
No.2
- 回答日時:
こんな冗長なVBAコードを読者や回答者に読ませるのはやめてください。
質問するときは、ポイントを文章で記述してください。回答者に手数を出来るだけ掛けさせないこと。
ーー
出勤と退勤を同一シートで区別するなら、ダブルクリックするセル位置で判別するとか、所定のセルの値を何か一定の値にさせる約束にしないと、イベントを受ける(OSなどの)システムでは業務(アプリ)的な意味は区別してないのだから、どうしようもない。
そういう心構えで、無理のないようにシステムを考えよ。
imogasi様
ご回答ありがとうございます。
上記のご意見さんこうにさせていただいた上で
仕様やコードをもう一度考えてみたいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【VBA】写真の貼り付けコードがうまく機能しません。 5 2022/09/01 18:43
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) 【変更】ファイルを閉じてダイアログで保存した時、更新したシートだけの処理の実行をする 5 2022/03/26 18:31
- Visual Basic(VBA) エクセルVBA ダブルクリックしたら色反転を指定したセルのみにしたい 2 2022/04/06 12:52
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Excel(エクセル) B列に文字がはいったらA列に数字が入るマクロードを完成させたい 4 2023/04/21 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
31:30:00が1900/1/1 7:30:0
-
入力後に日付順になるように自...
-
Excelで半年後の日付を計算したい
-
エクセルのセルにカレンダーを...
-
エクセルでENTERを押すと数式が...
-
エクセル関数で日付かどうかの...
-
日付だけを変更して印刷(Excel)
-
Excelで8/26等の日付を全てその...
-
ファイルのオープン時に今日の...
-
エクセルで数字列の間に『/』を...
-
日付入力→指定のセルの色を塗り...
-
Excelで更新日時と更新者を表示...
-
【エクセル】日付を表示させた...
-
エクセル 当番表の作り方 エク...
-
日付を入力したセルをファイル...
-
Excelで、年だけの「西暦」から...
-
エクセルのセルにたとえば「756...
-
エクセルで日付入力欄を作成し...
-
☆Excelエクセルで入力した日の...
-
Excelに入力した個々の日付の数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
31:30:00が1900/1/1 7:30:0
-
日付だけを変更して印刷(Excel)
-
入力後に日付順になるように自...
-
Excelで半年後の日付を計算したい
-
エクセルでENTERを押すと数式が...
-
エクセルで数字列の間に『/』を...
-
エクセルのセルにカレンダーを...
-
エクセル 当番表の作り方 エク...
-
エクセル関数で日付かどうかの...
-
Excelで、年だけの「西暦」から...
-
ファイルのオープン時に今日の...
-
Excelで8/26等の日付を全てその...
-
日付入力→指定のセルの色を塗り...
-
エクセルで日付入力欄を作成し...
-
☆Excelエクセルで入力した日の...
-
EXCELで直近の日付を抽出する関数
-
日付を入力したセルをファイル...
-
◆ EXCEL自動入力日付を自動で...
-
ワード差込について
-
WORDで翌日や翌々日の日付を表...
おすすめ情報