セルの時間入力について

このQ&Aのポイント
  • 00:00と入力すると最初は入力できますが、2回目の入力からセルが空になります。
  • 数字が入ると問題はありません。
  • 式の値は00:00:00となっています。
回答を見る
  • ベストアンサー

セルの時間入力について

以下のコードで 00:00と入力すると最初は入力でいますが、 2回目の入力から、ユーザー定義でもhh:mmなのにセルが空になります。 数字が入ると問題有りません。 式の値(関数の入力)は00:00:00となっています。 どうか教えていただけませんでしょうか。 よろしくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Columns("L:M")) Is Nothing Or Selection.Count <> 1 _ Or Not IsNumeric(Target) Then Exit Sub If Target <= 2359 And Target Mod 100 < 60 Then Application.EnableEvents = False ' ' Debug.Print "Target.Address:" & Target.Address ' Debug.Print "Target.Address:" & Target.AddIndent With Target If Len(Target) = 4 Then Debug.Print "Len(Target) = 4" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = Left(Target, 2) & ":" & Right(Target, 2) ElseIf Len(Target) = 3 Then Debug.Print "Len(Target) = 3" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "0" & Left(Target, 1) & ":" & Right(Target, 2) ElseIf Len(Target) = 2 Then Debug.Print "Len(Target) = 2" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "00:" & Right(Target, 2) ElseIf Len(Target) = 1 And Target = 0 Then Debug.Print "Len(Target) = 1 And Target=0" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "00:00" .Select ElseIf Len(Target) = 1 Then Debug.Print "Len(Target) = 1" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "00:0" & Right(Target, 1) End If .NumberFormatLocal = "hh:mm" End With Application.EnableEvents = True Else ' MsgBox "入力値が不正です。" With Target .Value = "" .Select End With Exit Sub End If End Sub 'この行まで

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

  • ベストアンサー
回答No.1

1回目と2回目の入力内容、 どのセルに入力したかなどを詳しく書いてください。 さらっと動かしましたが空うんぬんの意味がわかりません。 ' MsgBox "入力値が不正です。"の所を通れば空にしてるみたいですが 別にこれの事ではないんですよね? あと、Application.EnableEvents = Falseの位置が悪いので .Value = ""でイベントが走ります。直した方が良いと思いますよ。

hatokamome
質問者

お礼

ご回答ありがとうございます。 Application.EnableEvents = Falseは理解できました。 おそらくですが、セルの中書式がデフォルトで00:00:00になっており、 0や0000などは、すべて0時0分0秒と判断する仕様なのではないかと推測しています。 しかし、その00:00:00を消しマクロを書いて最初の実行時は00:00と書き込んでくれます。 セルの値も00:00:00ではなく、00:00になっています。 いったい何が起きているのでしょうか。

hatokamome
質問者

補足

いろいろ試して、以下のコードで完成いたしましあた。 書式設定を文字列にすると出来ました。 ありがとうございます。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から If Intersect(Target, Columns("L:M")) Is Nothing Or Selection.Count <> 1 _ Or Not IsNumeric(Target) Then Exit Sub If Target <= 2359 And Target Mod 100 < 60 Then Application.EnableEvents = False ' Debug.Print "Target.Address:" & Target.Address ' Debug.Print "Target.Address:" & Target.AddIndent With Target If Len(Target) = 4 Then Debug.Print "■Len(Target) = 4" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = Left(Target, 2) & ":" & Right(Target, 2) ElseIf Len(Target) = 3 Then Debug.Print "■Len(Target) = 3" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "0" & Left(Target, 1) & ":" & Right(Target, 2) ElseIf Len(Target) = 2 Then Debug.Print "■Len(Target) = 2" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "00:" & Right(Target, 2) ElseIf Len(Target) = 1 And Target <> 0 Then Debug.Print "■Len(Target) = 1 And Target <> 0 Then" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "00:0" & Right(Target, 1) ElseIf Len(Target) = 1 And Target = 0 Then Debug.Print "■Len(Target) = 1 And Target = 0 Then" Debug.Print "Target:" & Target Debug.Print "Len(Target):" & Len(Target) .Value = "00:00" '★セルの書式設定は文字列にする。 End If .NumberFormatLocal = "hh:mm" End With Application.EnableEvents = True Else ' MsgBox "入力値が不正です。" With Target .Value = "" .Select End With Exit Sub End If End Sub 'この行まで

関連するQ&A

  • VBAの時間入力について

    先日、時間を文字列で、HH:mmのフォーマット入力するPGを教えて頂き、 内容理解をしているのですがわからない部分があります。 ★の部分の条件で、00:00も入力したいです。 ご存知か方がおられましたら教えてください。 よろしくお願い致します。 Private Sub Worksheet_Change(ByVal Target As Range) 'この行から 'Intersect:http://officetanaka.net/excel/vba/tips/tips118.htm 'Is Nothing:nullではない 'Selection.Count <> 1:選択数が1以下ではない(<> :等しくない) ' Not IsNumeric(Target):数値ではない If Intersect(Target, Columns(12)) Is Nothing Or Selection.Count <> 1 _ Or Not IsNumeric(Target) Then Exit Sub ' 'Target:セルの値は24:00以下 '2つの数値の除算を行いし,その剰余を返す 'Mod:2つの数値の除算を行いし,その剰余を返す '★ここで00:00時も入力したい。 If Target <= 2400 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

    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 'この行まで

  • エクセル ダブルクリックで処理日の入力

    お世話になります。 先般、お教え頂きました別のダブルクリックイベントプロシージャと 下記の当日の日付を入力するという処理を同じシート上で行いたいのですが、VBエディターにどのように記述したら良いかわかりません。 当方、かなりの初心者です。 よろしくご教授くださいませ。 【新しく加えたい処理】 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("b4:C999")) Is Nothing Then Exit Sub If ActiveCell = "" Then ActiveCell = Date Cancel = True End If End Sub 【もともと使っている処理】 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Not Intersect(Target, Range("h1:h999")) Is Nothing Then With Target If .Value = "" Then .Value = "有" ElseIf .Value = "有" Then .Value = "無" ElseIf .Value = "無" Then .Value = "" End If End With ElseIf Not Intersect(Target, Range("i1:i999")) Is Nothing Then With Target If .Value = "" Then .Value = "要" ElseIf .Value = "要" Then .Value = "不要" ElseIf .Value = "不要" Then .Value = "" End If End With End If End Sub よろしくお願いします。

  • このEXCELVBAを複数のセルにも別々に同じ処理をしたい

    はじめまして。 過去ログに私のやりたいような内容を探していたらこのような下記のエクセルVBAがあったので、 教えて頂きたいです。 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> "$A$1" Then Exit Sub If Target.Value = "" Then Exit Sub x = Target.Value With Application .ScreenUpdating = False .EnableEvents = False .Undo y = Target.Value Target.Value = x + y .EnableEvents = True .ScreenUpdating = True End With With Cells(ActiveSheet.Rows.Count, "C").End(xlUp) .Offset(1, 0).Value = x .Offset(1, 1).Value = Time() End With End Sub A1に入力するたびに同一セルに加算。 A1をクリアできる。 C列に入力履歴、D列に入力時間を記録。 If Target.Address <> "$A$1" Then Exit Sub の$A$1を変えることによって他のセルにも設定できる。 と、いう内容なのですが、これを同一シートの複数のセルにも同じよう別々に処理できるように設定したいのですが、 どのようにすればいいのでしょうか? VBAは最近始めたばかりなのでわからない事だらけです。 Excelのバージョンは2003です。 よろしくお願い致します。

  • エクセルでデータ入力された日付と時間を自動入力する

    前回ご質問にて 1行目に何か入力したら2行目に日付と時間を自動入力する というVBAを教えて頂きました。 ------------------------ Private Sub Worksheet_Change(ByVal Target As Excel.Range) Application.EnableEvents = False If Target.Row = 1 Then Target.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If Application.EnableEvents = True End Sub ------------------------ これを1行目に何か入力したら2行目に日付と時間ではなく セル指定を行いたいのです。 例)F13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という作りです。 よろしくお願いします。

  • エクセルで特定のセルへの直接入力だけを禁止したいんです。

    過去の質問を参考に『セルをダブルクリックすると"○"と入力される』というマクロを○⇒●⇒-⇒  ⇒○⇒・・・として使っているんですが、ダブルクリックの度にセルが直接入力の状態(縦の棒の点滅)になってしまい、一度他のセルをクリックしないと次へ進めずに困っています。 良い方法ってあるのでしょうか? ちなみに使用しているマクロは Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Const rng As String = "A1:A3" '処理対象のセル範囲 If Not Application.Intersect(Target, Range(rng)) Is Nothing Then If Target.Value = "" Then Target.Value = "○" ElseIf Target.Value = "○" Then Target.Value = "●" ElseIf Target.Value = "●" Then Target.Value = "-" Else Target.ClearContents End If End If End Sub というものです。 よろしくお願いします。

  • エクセルで日付と時間を自動入力する

    エクセルでF13~P13に何か入力したら、その下のセルの F14~P14に日付と時間が自動入力される という質問、回答を見つけました。 これで日付を削除するかどうかのメッセージボックスを出さずに 入力するセルのデータを削除した時に日付も削除するには どの部分を削除すれば良いですか? Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim mRng As Range Application.EnableEvents = False For Each mRng In Target If Not Intersect(mRng, Range("F13:P13")) Is Nothing Then If mRng.Value = "" Then If MsgBox("日付も削除しますか?", vbYesNo + vbDefaultButton2) = vbYes Then mRng.Offset(1, 0).Value = "" End If Else mRng.Offset(1, 0).Value = Format(Now, "yyyy/mm/dd"" ""hh:mm:ss") End If End If Next mRng Application.EnableEvents = True End Sub

  • 複数のシートにコードを適用したい

    excel vbaについての質問です (vbaについて初心者です) 現在、エクセルで勤務記録表を作成しています。 同じシートが70枚くらいあります。 各シートは同じ構成で、B6からC36までは時刻を打ち込み、 4ケタの数字を打ち込むと時間になるようにしたいと思っています。 例)1234⇒12:34 以下のようなコードを貼り付けているのですが vbaの編集をする「microsoft visual basic」というウインドウのところで、各シートをダブルクリックすると 出てくるウインドウに一つ一つ貼り付けないとうまく動きません ■全てのシートに貼り付けをしなくても動作する方法を教えて いただきたく、お願いします。 コードに誤りがあれば教えていただきたくお願いします。 (標準モジュールや「this workbook」にも貼り付けをしてみたのですが、思うようになりませんでした) 以下 ====================== Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next Dim 入力値 As Variant Dim 時 As Long Dim 分 As Long If Intersect(Target, Range("B6:C36")) Is Nothing Then Exit Sub 入力値 = Target.Value '1 If 入力値 = 0 Then 入力値 = terget.Value '2 ElseIf Target.Count <> 1 Then 'And (入力値 <> 0) Then ' メッセージを出す MsgBox "複数セル選択できません", vbCritical With Application .EnableEvents = False .Undo .EnableEvents = True End With '3 ElseIf VarType(入力値) <> vbDouble Then MsgBox "時刻を表す数字を入力してください。" ElseIf 入力値 < 1 Then Exit Sub Else 入力値 = Target.Value 時 = 入力値 \ 100 分 = 入力値 Mod 100 Application.EnableEvents = False Target.Value = TimeSerial(時, 分, 0) Application.EnableEvents = True End If End Sub

  • Excel セルをクリックするだけで入力(エクセル2003)

    http://questionbox.jp.msn.com/qa915096.html からの転載で申し訳ありません。 この中で、jindonさまの方法で、2つの文字の入れ替えはできました。 ------------------------------------------------ Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) With Target If .Row=1 And .Column=1 Then If .Value = "○" Then .Value = "" Else .Value = "○" End If End If End With End Sub ------------------------------------------------ そこで、例えば○△×のように、順番に3つの文字を入れ替えるにはどう記述すればよいでしょうか? よろしくお願いいたします。

  • VBAで入力ミスの時、空白に戻すには

    いつもお世話になります WINDOWS7 EXCELL2010 です。 何れかのセルで入力ミスを、 例えば I13 に 1 を入力した時 「日」が 当然表示されますがこれがミスで空白に戻したい時に 「0」 で空白できると考えていましたが実際は空白でないみたいです。 見た目では空白ですが空白のセルのカウント COUNTBLANLK では1つ少なくなっています。 このようなミスの時に空白に戻す方法はどのようにすればいいかご教授いただけませんか。 よろしくお願いします。 参考 空白のセルのカウント AO13 =IF($B13="","",COUNTBLANK($I13:$AM13)) 入力のVBA Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("I13:AM27")) Is Nothing Then Exit Sub 'ココで範囲指定 Application.EnableEvents = False If Target.Value = 0 Then Target.Value = " " If Target.Value = 1 Then Target.Value = "日" If Target.Value = 2 Then Target.Value = "△" If Target.Value = 3 Then Target.Value = "▼" If Target.Value = 4 Then Target.Value = "前" If Target.Value = 5 Then Target.Value = "夜" If Target.Value = 6 Then Target.Value = "明" If Target.Value = 7 Then Target.Value = "有" Application.EnableEvents = True End Sub

専門家に質問してみよう