プロが教えるわが家の防犯対策術!

再々投稿になりますがうまく動作しない為困っています

D列とE列に3桁、4桁の数字を入力した時にコロンを勝手に入力して時刻にするプログラムが常駐し、

トグルボタンを押すことで
ONの場合
B列に文字が入力された際にD列のみ現在の時刻を入力し
E列に3桁、4桁の数字を入力した時にコロンを勝手に入力して時刻にするプログラムが動作し

OFFの場合
B列に文字が入力された際にD列のみ現在の時刻を入力するプログラムがオフになり
D列とE列に3桁、4桁の数字を入力した時にコロンを勝手に入力して時刻にするプログラムのみ動く
プログラムです

それぞれソースコードを表記しますので解決をお願いします。



'トグルボタンのプログラム
Private Sub ToggleButton1_Click()
With ToggleButton1
If .Value Then
'トグルボタンONの処理
.Caption = "自動入力 ON"
Range("J1") = "ON"
MsgBox "自動入力が ONになりました", vbInformation

Else
'トグルボタンOFFの処理
.Caption = "自動入力 OFF"
Range("J1") = "OFF"
MsgBox "自動入力が OFFになりました", vbInformation

End If
End With
End Sub



'3桁、4桁の数字を入力した時にコロンを勝手に入力して時刻にするプログラム
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c, v
Application.EnableEvents = False

If Range("J1").Text = "ON" Then
Set Target = Intersect(Target, Range("E:E"))
If Not Target Is Nothing Then
For Each c In Target.Cells
v = c.Value
If IsNumeric(v) And v > 0 And v Mod 100 < 60 Then
c.Value = TimeSerial(Int(v / 100), v Mod 100, 0)
c.NumberFormatLocal = "[h]:mm"
End If
Next c
End If
End If
'Call myTime_input(ActiveCell)

Else
Set Target = Intersect(Target, Range("D:E"))
If Not Target Is Nothing Then
For Each c In Target.Cells
v = c.Value
If IsNumeric(v) And v > 0 And v Mod 100 < 60 Then
c.Value = TimeSerial(Int(v / 100), v Mod 100, 0)
c.NumberFormatLocal = "[h]:mm"
End If
Next c
End If

End If
Application.EnableEvents = True
End Sub


'J1にONが入力されている時のみ,B列に値が入力されたらD列に現在の時刻を入力するプログラム
Sub myTime_input(ByVal Target As Range)
If Not Intersect(Target, Range("D:D")) Is Nothing Or Target.Count = 1 Then Call myTime_input(Target)
If Target.Column <> 2 Then Exit Sub
Application.EnableEvents = False
Target.Offset(, 2).Value = Time
Application.EnableEvents = True
End Sub

質問者からの補足コメント

  • つらい・・・

    回答ありがとうございます。

    OFFの場合は問題ないですが

    ONの場合自動入力ができず
    数字を打っても0:00になってしまうという不具合です

      補足日時:2022/10/14 15:27
  • つらい・・・

    回答ありがとうございます
    こちらがおそらく正しいソースコードです
    よろしくお願いします
    (収まりきらないので2回分けて捕捉します)


    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c, v
    Application.EnableEvents = False

    If Range("J1").Text = "ON" Then
    Set Target = Intersect(Target, Range("B:B"))
    If Not Target Is Nothing Then
    For Each c In Target.Cells
    c.Offset(, 2).Value = Time
    Next c
    End If

    No.3の回答に寄せられた補足コメントです。 補足日時:2022/10/15 10:22
  • へこむわー

    '続きです

    Else
    Set Target = Intersect(Target, Range("D:E"))
    If Not Target Is Nothing Then
    For Each c In Target.Cells
    v = c.Value
    If IsNumeric(v) And v > 0 And v Mod 100 < 60 Then
    c.Value = TimeSerial(Int(v / 100), v Mod 100, 0)
    c.NumberFormatLocal = "[h]:mm"
    End If
    Next c
    End If

    End If
    Application.EnableEvents = True
    End Sub

      補足日時:2022/10/15 10:22
  • うーん・・・

    修正ありがとうございます
    J1=OFFは問題なかったですが

    'J1=ONの場合
    'B列に入力された時、D列に現在時刻を設定が
    E列に3桁、4桁の数字を打っても0:00になってしまいます

    No.4の回答に寄せられた補足コメントです。 補足日時:2022/10/15 11:23
  • うれしい

    修正・回答ありがとうございます。
    D:E列に3~4桁の数字が入力された場合、
    J1=ON、J1=OFFにかかわらず、
    そのセルへ:を付加して時刻とわかるようになれば大丈夫です

    B列に文字が入力された場合D列に現在の時刻を入力するのだけon、off切り替えられるようにしたいのです。

    また時刻なので0:00~23:59の範囲で理解してもらって大丈夫です
    よろしくお願いします

    No.7の回答に寄せられた補足コメントです。 補足日時:2022/10/15 17:03

A 回答 (8件)

J1=ON,OFFにかかわらず、D:E列へ数字が入力された場合、:を付加するようにしました。


数字は、0~2359までの整数の場合に限ります。
上記以外の場合は、入力値に:を付加しません(そのままの状態です。)


'時刻設定
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c, v
Dim Trg As Range
Application.EnableEvents = False
If Range("J1").Text = "ON" Then
'J1=ONの場合
'B列に入力された時、D列に現在時刻を設定
Set Trg = Intersect(Target, Range("B:B"))
If Not Trg Is Nothing Then
For Each c In Trg.Cells
If c.Value = "" Then
c.Offset(, 2).Value = ""
Else
c.Offset(, 2).Value = Time
c.Offset(, 2).NumberFormatLocal = "[h]:mm"
End If
Next c
End If
End If
'D,E列に入力された時、:を付加して時刻を設定
Set Trg = Intersect(Target, Range("D:E"))
If Not Trg Is Nothing Then
For Each c In Trg.Cells
If IsNumeric(c.Value) Then
v = Fix(c.Value)
If v = c.Value Then
If v >= 0 And v < 2400 And v Mod 100 < 60 Then
c.Value = TimeSerial(Int(v / 100), v Mod 100, 0)
c.NumberFormatLocal = "[h]:mm"
End If
End If
End If
Next c
End If
Application.EnableEvents = True
End Sub
    • good
    • 0
この回答へのお礼

無事動作しました!
真摯に回答していただきありがとうございました!

お礼日時:2022/10/17 08:02

D:E列に3~4桁の数字を入力するのは


0:00~23:59の範囲と理解してよいですか。
(0時0分から23時59分の範囲)
それとも、26:58のように24時を超える数字も想定していますか。
その場合は、上限は何時になりますか。
この回答への補足あり
    • good
    • 0

No5です。


仕様の確認です。
D:E列に3~4桁の数字が入力された場合、
J1=ON、J1=OFFにかかわらず、
そのセルへ:を付加して設定したい。
ということでしょうか。そうであればNo5は無視してください。
    • good
    • 0

>'J1=ONの場合


>'B列に入力された時、D列に現在時刻を設定が
>E列に3桁、4桁の数字を打っても0:00になってしまいます

Worksheet_Changeを以下のように変えてください。
(ToggleButton1_Clickはそのままです)
--------------------------------------------------------------
'時刻設定
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c, v
Dim Trg As Range
Application.EnableEvents = False
If Range("J1").Text = "ON" Then
'J1=ONの場合
'B列に入力された時、D列に現在時刻を設定
Set Trg = Intersect(Target, Range("B:B"))
If Not Trg Is Nothing Then
For Each c In Trg.Cells
If c.Value = "" Then
c.Offset(, 2).Value = ""
Else
c.Offset(, 2).Value = Time
c.Offset(, 2).NumberFormatLocal = "[h]:mm"
End If
Next c
End If
'D,E列に入力された時、そのまま設定
Set Trg = Intersect(Target, Range("D:E"))
If Not Trg Is Nothing Then
For Each c In Trg.Cells
c.NumberFormatLocal = "G/標準"
Next c
End If
Else
'J1=OFFの場合
'D,E列に入力された時、:を付加して時刻を設定
Set Trg = Intersect(Target, Range("D:E"))
If Not Trg Is Nothing Then
For Each c In Trg.Cells
v = c.Value
If IsNumeric(v) And v > 0 And v Mod 100 < 60 Then
c.Value = TimeSerial(Int(v / 100), v Mod 100, 0)
c.NumberFormatLocal = "[h]:mm"
End If
Next c
End If
End If
Application.EnableEvents = True
End Sub
    • good
    • 0

とりあえず、修正しておきました。


Sub myTime_input(ByVal Target As Range)は不要になりました
(Worksheet_Changeへ組み込みました)ので、使う必要はありません。

以下のようにしてください。
'トグルボタンのプログラム
Private Sub ToggleButton1_Click()
Application.EnableEvents = False
With ToggleButton1
If .Value Then
'トグルボタンONの処理
.Caption = "自動入力 ON"
Range("J1") = "ON"
MsgBox "自動入力が ONになりました", vbInformation
Else
'トグルボタンOFFの処理
.Caption = "自動入力 OFF"
Range("J1") = "OFF"
MsgBox "自動入力が OFFになりました", vbInformation
End If
End With
Application.EnableEvents = True
End Sub

'時刻設定
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c, v
Application.EnableEvents = False
If Range("J1").Text = "ON" Then
'J1=ONの場合
'B列に入力された時、D列に現在時刻を設定
Set Target = Intersect(Target, Range("B:B"))
If Not Target Is Nothing Then
For Each c In Target.Cells
If c.Value = "" Then
c.Offset(, 2).Value = ""
Else
c.Offset(, 2).Value = Time
c.Offset(, 2).NumberFormatLocal = "[h]:mm"
End If
Next c
End If
Else
'J1=OFFの場合
'D,E列に入力された時、:を付加して時刻を設定
Set Target = Intersect(Target, Range("D:E"))
If Not Target Is Nothing Then
For Each c In Target.Cells
v = c.Value
If IsNumeric(v) And v > 0 And v Mod 100 < 60 Then
c.Value = TimeSerial(Int(v / 100), v Mod 100, 0)
c.NumberFormatLocal = "[h]:mm"
End If
Next c
End If
End If
Application.EnableEvents = True
End Sub
この回答への補足あり
    • good
    • 0

こちらで、実行すると


Private Sub Worksheet_Change(ByVal Target As Range)の中で
コンパイルエラーが発生します。添付図参照
(Elseに対応するIfがありません)

正しい Private Sub Worksheet_Change(ByVal Target As Range)の
ソースを提示していただけませんでしょうか。
「【再々投稿】VBAのプログラムで動作しな」の回答画像3
この回答への補足あり
    • good
    • 0

No.1です。



どうも勘違いな回答してしまったようです。
申し訳ございません。
    • good
    • 0

上手く動かないとは『どういう希望に対してどう言う結果になってしまうのか?』があれば良いのかも。



気になるってなら、シリアル値は整数部分が年月日・小数点以下が時間だと思います。
3~4桁の数値を100で割っても全てが小数点以下にはならないのでは?
しかもInt関数を使うと小数点以下は消されますし。
過去質がわからないのでこれ以上はどうなのかは不明です。
    • good
    • 0

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