Excel2007VBAセルの値とFormat関数

このQ&Aのポイント
  • Excel2007VBAセルの値とFormat関数について質問します。
  • Excelのタイムカードを作成している際に、出勤・退勤打刻の列を右クリックすると現在の時刻を表記したいと考えています。
  • コードの該当箇所で条件分岐を行っており、本日の日付と指定のセルの日付が一致する場合に出勤打刻の代入値を指定フォーマットでセルに表記します。
回答を見る
  • ベストアンサー

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

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

  • ベストアンサー
  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.2

次のようなコードにすればよいでしょう。 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

dradra33
質問者

お礼

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

dradra33
質問者

補足

KURUMITO様 たびたびの質問恐れ入ります。 KURUMITO様がご教示いただいた If Cells(Target.Row, 2).Value = Day(Date) Then のコードによると本日(2012年2月13日)でなくとも、 クリックした日とB列の日付は常に照合されることに なると考えて差支えないのでしょうか?

その他の回答 (2)

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

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

dradra33
質問者

お礼

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

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

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")

dradra33
質問者

お礼

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

関連するQ&A

  • 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

  • 時間フォーマット VBA

    VBA初心者です。Javaなどはある程度できるレベルのものです セルにHH:mmフォーマットで時間を入力したくて以下のコードで実行すると12列目は正常に入力でき、 13列目にも同じように指定シたいです。 試したのは If IntersectからEnd Ifまでを最終行の手前にColumns(13)で全体を追加しました。 しかし、13列目はVBAが効いていません また、12列目に入力した値を消すと : (コロン)が残ってしまいます。 また、ThisWorkBookにこのコードを書いてもVBAが効いていません。 このファイルは作業中のシートに対するものでしょうか。 だとしたら、作業中シートに対して行うにはどう書いたらよいのかわからずにおります。 細かい質問ですみません。 ご存知か方がおられましたら教えてください。 よろしくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Columns(12)) Is Nothing Or Selection.Count <> 1 Or Not IsNumeric(Target) Then Exit Sub ' Debug.Print "Target==" & Target If Target <= 2359 And Target Mod 100 < 60 Then ' Application.EnableEvents = False ' With Target ' If Len(Target) = 3 Then .Value = 0 & ":" & Right(Target, 2) ElseIf Len(Target) = 3 Then .Value = Left(Target, 1) & ":" & Right(Target, 2) Else .Value = Left(Target, 2) & ":" & Right(Target, 2) End If .NumberFormatLocal = "hh:mm" ' End With ' Application.EnableEvents = True ' Else MsgBox "入力値が不正です。" ' With Target ' .Value = "" .Select End With Exit Sub ' End If End Sub 'この行まで

  • 続・VBAでセルに値が入ったときにイベントを起こしたい

    http://oshiete1.goo.ne.jp/qa4650025.htmlで教えていただきありがとうございました。大変分かりやすい解説でした。 こういうことが出来るんだーとわかりもっと使いやすいように仕様を変えた方がいいと気づき新たに書き込んでみました。 Private Sub Worksheet_Change(ByVal Target As Range) Dim i As Long ' 変更したセルに値が入った場合条件成立 If Trim(Target.Value) <> "" Then ' 行番号が10以上65530以内のとき条件成立 If Target.Row >= 10 And Target.Row <= 65530 Then ' BCD列で、5の倍数の行のとき条件成立 If (Target.Column = 2) And (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next Worksheets("Sheet4").Range("A2:K6").Copy Target.Offset(5, -1) End If ElseIf (Target.Column = 3) And (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next End If ElseIf (Target.Column = 4) And (Target.Row Mod 5) = 0 Then If Target.Value <> "" Then For i = 0 To 4 Target.Copy Target.Offset(i, 10).PasteSpecial Paste:=xlPasteValues Next End If Else Exit Sub End If End If End If End Sub ここまでは何とか出来たのですが問題点があります・・・ ・複数セルを選択してDELすると実行時エラー13が出ます。(別の回答にあったやつですが・・・) ・別シートより範囲指定したセルをコピーして張り付けるときも出ます。 ・B列には6桁の整数値しか入らないようにしたいけど整数値限定は可能?・・・その整数値を貼り付ける際日付型へのフォーマットが難しい などあります。ヒントをいただけないでしょうか?

  • 【Excel】セルの値を変更した時間を記録したい

    excel2002を使用している初心者です A1セルの値を変更したらその時間をすべてB列に順番に記録していく方法を考えています。 参考書によると If Target.Value = Range("A1").Value Then と ActiveCell.Value = Format$(Now, "hh:mm") 使うば良さそうだとのことです、 具体的にどのようにつなげてよいのか、またどんな風に宣言をしていけばよいのかなど、教えていただけると助かります

  • 文字を入力したセル以降のセルも同じ文字になるVBA

    Private Sub Worksheet_Change(ByVal Target As Range) Dim R As Range ActiveSheet.Protect UserInterfaceOnly:=True Set R = Union(Range("D5:D38"), Range("E5:E38"), Range("T5:T38")) With Target If Intersect(.Cells, R) Is Nothing Then Exit Sub Application.EnableEvents = False Range(Cells(.Row, .Column), Cells(38, .Column)).Value = .Value Application.EnableEvents = True End With End Sub この様なコードがあるのですが範囲を変更したいと思います。 D5:D38は上記コードのままで良いのですが、E5;E38はE5:E36に、T5:T38はT5:T36に変更するにはどうすれば良いのでしょうか?

  • VBA初心者です

    VBA初心者です。 同じセルに数字を入れて足し算して行きたいんですが! 下記のVBA見つけたのですが、A1に数字を入れて答えがE1に出るんですが、同じ事を A2、A3、A4、A5答えもE2、E3......で増やしたいのですが、どうするか分かりません。 どなたか教えてください。 宜しくお願いします。 Private Sub Worksheet_Change(ByVal Target As Range) Dim inp, outp As String inp = "$A$1" outp = "E1" Application.EnableEvents = False If Target.Address = inp Then Range(outp).Value = Range(outp).Value + Target.Value If Target.Value <> "" Then ActiveCell.Offset(-1, 0).Select Else Range(outp).Value = 0 End If End If Application.EnableEvents = True End Sub

  • エクセル VBA について

    エクセルで、 ダブルクリックしたら"*"を表示したい範囲に【入力】という名前をつけ、 ダブルクリックしたら9つ左のセルの内容を表示したい範囲に【金額】という名前をつけ、 二つの構文?をVisual Basicに作成したんですが、エラーが出てしまいます。 ひとつずつだと上手くいくのですが、なぜでしょうか? わかる方教えてください。 あと申し訳ないのですが、VBAはまったくわからないため、ネット上で構文をコピーして貼り付けました。 そんな者でもわかる修正の説明をお願いいたします。 以下が作成し、エラーとなってしまう構文です。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "金額" If Target.Value = "" Then Target.Value = Target.Offset(0, -9).Value Cancel = True End If End Sub Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const RangeName As String = "入力" If Not Intersect(Range(RangeName), Target) Is Nothing Then Cancel = True If Target = "*" Then Target = "" Else Target = "*" End If End If End Sub

  • VBA 範囲選択時エラー

    Private Sub Worksheet_SelectionChangeのVBAでA列B列C列でワンクリックで文字が入力できるように設定致しました。 その後、A列からC列を範囲選択してDeleteするとデバック 「実行時エラー  型が一致しません」と出てしまいます。業務上、そのセルのデータは一気に消したいので困っております。どなたか分かる方よろしくお願い致します。 Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim rng As Range, rng_1 As Range, rng_2 As Range Application.EnableEvents = False Set rng_1 = Range("H17:H100") Set rng_2 = Range("I17:I100") Set rng_3 = Range("J17:J100") Set rng_4 = Range("K17:K100") Application.EnableEvents = True Set rng = Intersect(Target, rng_1) If Not rng Is Nothing Then Cancel = True If Target.Value = "" Then Target.Value = "(1)" Else Target.Value = "(1)" End If Else Set rng = Intersect(Target, rng_2) If Not rng Is Nothing Then Cancel = True If Target.Value = "(2)" Then Target.Value = Empty Else Target.Value = "(2)" End If Else Set rng = Intersect(Target, rng_3) If Not rng Is Nothing Then Cancel = True If Target.Value = "(3)" Then Target.Value = Empty Else Target.Value = "(3)" End If Else Set rng = Intersect(Target, rng_4) If Not rng Is Nothing Then Cancel = True If Target.Value = "(4)" Then Target.Value = Empty Else Target.Value = "(4)" End If End If End If End If End If End Sub

  • Excel  関数をまたいだTargetの使用

    excel2013 OS はwindows8を使用しています。 Excelのマクロで、以下のコードについて質問です。(コード内の・・・は省略の意) Private Sub Worksheet_Change(ByVal Target As Range) Dim ・・・・・・・      ・      ・  If Target.Value = ・・・・・    Call myfunction End If End Sub Sub myfunction() If 条件 Then Target.Offset(0,1).Value = "aaa" End If End Sub このマクロのPrivate Sub Worksheet_Change(ByVal Target As Range)を実行するとエラーが 出ます。エラーの内容は「オブジェクト変数またはwithブロック変数が設定されていません」 となり、 Target.Offset(,1).Value = "aaa" の行が黄色く表示されます。 myfuncton内で使用しているTargetが何なのかがわからないというエラーだと理解しています。 そこで私は以下の2つを試しました。 1つめはうまくいかず、2つめは何か2度手間のような感じがするのですが、正常動作する ようです。 そこで質問なのですが、Targetをプロシージャをまたいで利用したい場合に一般的に用いら れている手法などがあれば教えて頂きたいです。 1つめ・・Targetをプロシージャをまたいで使えるようにコードの一番上の部分 、つまり、Private Sub Worksheet_Change(ByVal Target As Range)の一行上の 部分にDim Target As Range と宣言してみました。が、これはうまくいきませんでした。 2つめ・・適当な(この場合e)変数を宣言し、プロシージャをまたいで使用する。 Dim e As Range Private Sub Worksheet_Change(ByVal Target As Range) Dim ・・・・・・・      ・      ・  If Target.Value = ・・・・・ Set e = Target    Call myfunction End If End Sub Sub myfunction() If 条件 Then e.Offset(0,1).Value = "aaa" End If End Sub 以上何か良い方法があれば教えて頂きたいです。また不明な点があれば ご質問ください     

  • 値を変更後にセルがアクティブ状態に

    セルをダブルクリックして値を変えるマクロを作ったのですが 値を変更後にセルがアクティブ状態になってしまいます。 エンターを押したり他のセルをクリックすれば通常通りになるのですが、 VBAでも通常通りに戻すにはどうすればいいでしょうか? Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Dim mystr As String mystr = Target.Value If mystr = "Yes" Then Target.Value = "No" ElseIf mystr = "No" Then Target.Value = "Yes" End If End Sub を実行すると、 セルをクリックしてF2を押した時のような状態になってしまいます。 コードの最後に Target.Cells.Select を入れてみましたが、変わりませんでした。 スクショを撮ってみたのですが、カーソル?棒?が映りませんでした。

専門家に質問してみよう