Excel2007VBA右クリックの複数回使用

このQ&Aのポイント
  • Excel2007VBAのワークシートイベントプロシージャにおいて、右クリックを連続で使用する方法について教えてください。
  • 質問者はExcelのワークシートとVBAでタイムカードを作成しており、出勤打刻と退勤打刻の両方を使用したいのですが、コードを修正する必要があります。
  • 質問者は「出勤打刻」と「退勤打刻」のクリック方法が異なることで混乱しており、統一する方法を知りたいと考えています。
回答を見る
  • ベストアンサー

Excel2007VBA右クリックの複数回使用

●質問の主旨 ワークシートのイベントプロシージャにおいて右クリック 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

質問者が選んだベストアンサー

  • ベストアンサー
  • mu2011
  • ベストアンサー率38% (1910/4994)
回答No.1

同一イベントプロシージャは1つしか定義できないので1つにまとめて下さい。 私見ですが、クリック列はB列にして、C・D列の入力有無で自動選択しては 如何でしょうか。

dradra33
質問者

お礼

mu2011様 いつもお世話になります。 >私見ですが、クリック列はB列にして、C・D列の入力有無で自動選択しては 如何でしょうか。 ご意見参考にさせていただきます。

その他の回答 (1)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

こんな冗長なVBAコードを読者や回答者に読ませるのはやめてください。 質問するときは、ポイントを文章で記述してください。回答者に手数を出来るだけ掛けさせないこと。 ーー 出勤と退勤を同一シートで区別するなら、ダブルクリックするセル位置で判別するとか、所定のセルの値を何か一定の値にさせる約束にしないと、イベントを受ける(OSなどの)システムでは業務(アプリ)的な意味は区別してないのだから、どうしようもない。 そういう心構えで、無理のないようにシステムを考えよ。

dradra33
質問者

お礼

imogasi様 ご回答ありがとうございます。 上記のご意見さんこうにさせていただいた上で 仕様やコードをもう一度考えてみたいと思います。

関連するQ&A

  • Excel2007VBAセルの値とFormat関数

    ●質問の主旨 下記コード4行目と添付画像より Range("B30").ValueとFormat(Day(Date), "d")の戻り値は 等しいように思います。 ですが、E列を右クリックしたときに現在の時間を 入力できません。なぜでしょうか?ご存知の方ご教示願います。 ●質問の補足 エクセルでタイムカードを作成しています。 出勤・退勤打刻の列を右クリックすれば 現在の時刻が表記できるようにしたいと考えております。 下記のコードでは2月13日の出勤打刻(E30セル)しか できないことになりますが、徐々にコードを加筆していくつもりです。 ●コード Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 5 Then '出勤打刻の位置 Cancel = True 'コンテキストメニューの抑制 If Range("B30").Value = Format(Day(Date), "d") Then '本日の日付とB30セルの日付が合致すれば Range("E30").Value = Format(Time, "hh:mm") '出勤打刻の代入値を"hh:mm"でE30に表記する Else MsgBox "打刻位置が間違っています", vbExclamation, "打刻位置の確認" 'メッセージ表示 Cancel = True 'コンテキストメニューの抑制 End If End If End Sub

  • Excel VBA で1時的に右クリックを使いたい

    30枚ほどのシートの表を一挙に変更したいです。ところが、各シートに次のコードが入っているため、右クリックしてコピーとか一切使えません。各シートの変更ができるまで、右クリック使いたいです。何か方法ありませんでしょうか? ' 画面の一番上表示 Dim hr As Range Set hr = Range("A1") '左上隅セルを設定 ActiveWindow.ScrollRow = hr.Row '行の一番上にスクロール ActiveWindow.ScrollColumn = hr.Column '列の一番左にスクロール End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True 'プロシージャ終了後に表示されるショートカットメニューの非表示 If Target.Row > 14 And Target.Row < 45 And Target.Column > 13 And Target.Column < 15 Then 明細入力フォーム.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 1 And Target.Column < 3 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 3 And Target.Column < 5 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 5 And Target.Column < 7 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 8 And Target.Column < 10 Then Call ShowCalendarFromRange2(Target) End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 2 And Target.Column < 4 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 4 And Target.Column < 6 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 45 And Target.Column > 6 And Target.Column < 8 Then UserForm3.Show End If If Target.Row > 36 And Target.Row < 44 And Target.Column > 9 And Target.Column < 11 Then UserForm3.Show End If End Sub

  • ダブルクリック・右クリックの操作方法

    勤務表作成してます。 A1に「ON・OFF」を表示します。 「ON」のときに、ダブルクリックで、上のセルを表示、右クリックで「1」を表示します。 「OFF」のときは、コンテキストメニュ-(通常の操作)が出来るようにしたいのですが、ON.OFFの切り替え操作のVBAがわかりません。 よろしくお願いします。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ActiveCell = ActiveCell.Offset(-1, 0).Value If Target = Range("$A$1") Then Cancel = True If Range("$A$1").Value = "イベントON" Then Range("$A$1").Value = "イベントOFF" Else Range("$A$1").Value = "イベントON" End If If Range("$A$1").Value = "イベントOFF" Then Exit Sub End If End If End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) ActiveCell = "1" ' If Target = Range("$A$1") Then ' Cancel = True ' ' If Range("$A$1").Value = "イベントON" Then ' Range("$A$1").Value = "イベントOFF" ' Else ' Range("$A$1").Value = "イベントON" ' End If If Range("$A$1").Value = "イベントOFF" Then Exit Sub End If End Sub

  • 右クリック、ダブルクリックの操作

    勤務表作成してます。 A1に「ON・OFF」を表示します。 「ON」のときに、ダブルクリックで、上のセルを表示、右クリックで「1」を表示します。 「OFF」のときは、コンテキストメニュ-(通常の操作)が出来るようにしたいのですが、ON.OFFの切り替え操作のVBAがわかりません。 よろしくお願いします。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) ' ActiveCell = ActiveCell.Offset(-1, 0).Value ' ' If Target = Range("$A$1") Then ' Cancel = True If Range("$A$1").Value = "イベントON" Then Range("$A$1").Value = "イベントOFF" Else Range("$A$1").Value = "イベントON" ActiveCell = ActiveCell.Offset(-1, 0).Value Exit Sub End If Cancel = True If Range("$A$1").Value = "イベントOFF" Then Exit Sub End If End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) 'ActiveCell = "1" ' If Target = Range("$A$1") Then ' Cancel = True ' If Range("$A$1").Value = "イベントON" Then ' Range("$A$1").Value = "イベントOFF" If Range("$A$1").Value = "イベントON" Then ActiveCell = "1" Else: Range("$A$1").Value = "イベントOFF" Exit Sub End If Cancel = True If Range("$A$1").Value = "イベントOFF" Then Exit Sub End If End Sub

  • VBA ダブルクリックで行に色をつける方法

    VBAでダブルクリックしたセルを含む行に色をつけたいです。 セルに色をつけるマクロは書いた(下記)のですが、これを行全体に色付けしたいのですが、 うまくいきません。 どなたかご教授ください。 Private Sub Worksheet_BeforeDoubleClick _ (ByVal Target As Range, Cancel As Boolean) If Not Application.Intersect _ (Target, Range("A3").CurrentRegion) _ Is Nothing Then With Target.Interior If .Color = vbRed Then .Color = xlNone Else .Color = vbRed End If End With Cancel = True End If End Sub よろしくお願いします。

  • Private Sub Worksheet_BeforeDoubleC

    Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Column = 4 Then Target.Value = Date End If If Target.Column = 5 Then Target.Value = Date End If End Sub これは、他の方の回答で4列と5列のどこかをダブルクリックすると日付が入力されました。 しかし、シートの保護を入れるとダブルクリックしても入力されません。 それで、例えば、B3セルとかC3セルとかの特定のセルをダブルクリックすると日付が入力されるようにできませんか?宜しくお願いします。

  • EXCEL複数マクロ起動

    Aの範囲をダブルクリックしたら特殊文字挿入。 Bの範囲をクリックしたらA4セルの文字表示を赤色にして点滅表示 というマクロを作成しようとしています。 AとBの範囲は一部重複しています。 重複している範囲は、クリックの内容が優先でA4セルを点滅表示としたい。 VBAは全く初心者で、いろんなサイトで見た内容を貼り付けで下記まで作成してみましたが、 動作が中途半端になっています。 どうもシングルクリックとダブルクリックの対応部分でけんかをしているみたいなのですが、 どの様に修正したらよいか教えて頂きたく。 尚、全く新たなVBAでもかまいません、よろしくお願いします。 'Aの範囲;E16:E98あるいはK14:K147をダブルクリックしたら特殊文字挿入 '特殊文字が表示されている状態でダブルクリックした場合は空欄表示 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("E16:E98", "K14:K147")) Is Nothing Then Exit Sub Cancel = True If Target.Value = "" Then Target.Value = ChrW(&H2713) Else Target.ClearContents End If End Sub 'Bの範囲;B15:G37をクリックしたらA4セルの文字表示を赤色にして点滅表示 'Bの範囲外をクリックしたら文字表示を点滅表示と停止させて黒色表示…(まだ作成未です) Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row < 15 Or Target.Row > 37 Then Exit Sub If Target.Column < 2 Or Target.Column > 7 Then Exit Sub 点滅フラグ = True Call 点滅 End Sub '標準モジュール部 Public 点滅フラグ As Boolean Public Sub 点滅() If Range("A4").Font.ColorIndex = 3 Then Range("A4").Font.ColorIndex = 2 Else Range("A4").Font.ColorIndex = 3 End If If 点滅フラグ Then '進捗状況を示すために準備する 指定時刻 = Now + TimeValue("0時00分01秒") '1秒後 待ち時間 = TimeValue("0時00分01秒") Application.OnTime TimeValue(指定時刻), "点滅", TimeValue(待ち時間) End If End Sub excel2003です。

  • エクセルVBA ダブルクリックした左隣の値を返す方法

    いつもお世話になっております。 あるワークシートにおいて、 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) If ActiveCell.Column = 7 Then Target.Value = "希望" End If End Sub というマクロを記述することができました。 今度は、 G列のどこかのセルをダブルクリックすると、 同じ行のE列の値が、 ダブルクリックしたセルに入るようにしたいのです。 どのような記述をすればよいのか ご教示ください。

  • 複数のダブルクリックイベントを同一シートで

    以前 質問して回答をいただいたシートで他のダブルクリックイベントを記述したいのですが・・・ 単独だと できるようですが 複数できるようにしたいのですが エクセル2010です。 >http://okwave.jp/qa/q7230128.html A1:N1 のセルをダブルクリックしたら 色が黄色 また ダブルクリックしたら 色なし 教えをうけたマクロコードが 以下です。 ダブルクリックイベント その1 Private Sub worksheet_beforedoubleclick(ByVal Target As Excel.Range, cancel As Boolean) If Application.Intersect(Target, Range("A1:N1")) Is Nothing Then Exit Sub If Target.Interior.ColorIndex = xlNone Then Target.Interior.Color = vbYellow Else Target.Interior.ColorIndex = xlNone End If cancel = True End Sub ダブルクリックイベントその2 J8:J9,L8:L9,N8:N9,P8:P9,R8:R9,T8:T9,V8:V9,J29:J30,L29:L30,N29:N30,P29:P30,R29:R30 上の セルをダブルクリックしたら 現在時刻を表示したい 記述コードは 以下です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("J8:J9,L8:L9,N8:N9,P8:P9,R8:R9,T8:T9,V8:V9,J29:J30,L29:L30,N29:N30,P29:P30,R29:R30")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Time Cancel = True End If End Sub 2つのコードをうまくまとめたいのですが 知識不足でとまどっております。 詳しいかた、アドバイスお願いいたします。 よろしくお願いします。

  • エクセルのマクロ設定について

    クリックすると、日付が表示されるように、下記のマクロ設定してあります。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("C4:C30")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub C4~C30とG4~G30の2箇所にしたいのですが、式はどうしたらいいのでしょうか。 よろしくお願いします。

専門家に質問してみよう