激凹みから立ち直る方法

●質問の主旨

下記コード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

「Excel2007VBAセルの値とFor」の質問画像

A 回答 (3件)

次のようなコードにすればよいでしょう。



Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 5 Then '出勤打刻の位置
Cancel = True 'コンテキストメニューの抑制
If Cells(Target.Row, 2).Value = Day(Date) Then
Target = Time
Target.NumberFormat = "hh:mm"
Else
MsgBox "打刻位置が間違っています", vbExclamation, "打刻位置の確認" 'メッセージ表示
Cancel = True 'コンテキストメニューの抑制
End If
End If
End Sub

この回答への補足

KURUMITO様
たびたびの質問恐れ入ります。
KURUMITO様がご教示いただいた

If Cells(Target.Row, 2).Value = Day(Date) Then

のコードによると本日(2012年2月13日)でなくとも、
クリックした日とB列の日付は常に照合されることに
なると考えて差支えないのでしょうか?

補足日時:2012/02/13 12:00
    • good
    • 0
この回答へのお礼

KURUMITO様
ご回答ありがとうございます。
補足の方も閲覧くだされば幸いです。

お礼日時:2012/02/13 12:01

NO1です。

(追記)
VBAの日付範囲は、西暦100年1月1日~西暦9999年12月31で
0を1899/12/30で変換されるので数値を指定すると-1少ない日付に
なり、本日が13日とするとFormat(Day(Date),"d")では12となるので
IF文ではFalseになります。
    • good
    • 0
この回答へのお礼

mu2011様
いつもご丁寧なご回答ありがとうございます。
上記のアドバイスもプログラミングの参考にさせていただきます。

お礼日時:2012/02/13 12:05

Format(Day(Date), "d") は既に日をさらに書式変換しているので


以下のコードで如何でしょうか。
 If Range("B30").Value = Day(Date) Then

又、次の様にしたらE列を右クリックした行を選択できます。
If Target.Offset(0, -3).Value = Day(Date) Then
Target.Value = Format(Time, "hh:mm")
    • good
    • 0
この回答へのお礼

mu2011様
いつもご丁寧なご回答ありがとうございます。
お礼が遅くなり恐縮です。

お礼日時:2012/02/14 07:52

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