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

VBAのworksheet_changeで

J1にONの値が入っているときのみ
B列に文字が入力された場合
D列に時間を入力し

それ以外は
D列とE列に
3桁か4桁の文字を入力した場合
コロンを自動入力し時刻を入力するようにしましたが

>J1にONの値が入っているときのみ
B列に文字が入力された場合
D列に時間を入力し
の方だけうまく動かないので教えてください


ソースコード
Private Sub Worksheet_Change(ByVal Target As Range)

Select Case Target.Address
Case "$J$1"
If Range("J1").Value = "ON" Then

If Target.Column <> 2 Then Exit Sub
Application.EnableEvents = False
Target.Offset(, 2).Value = Time
Application.EnableEvents = True

Else
End If
End Select

Dim myTime As Long
If Intersect(Target, Range("D3:E1100")) Is Nothing Or Target.Count > 1 Then Exit Sub
With Target
On Error GoTo EH
If .Value <> "" Then
If IsNumeric(.Value) And .Value > 0 Then
If .Value - Int(.Value) = 0 And .Value Mod 100 < 60 Then
myTime = .Value
Application.EnableEvents = False
.Value = TimeSerial(Int(myTime / 100), myTime Mod 100, 0)
.NumberFormatLocal = "[h]:mm"
Application.EnableEvents = True
Exit Sub
End If
End If
End If
EH:
Application.EnableEvents = False
.ClearContents
.Select
Application.EnableEvents = True
End With
End Sub

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

  • どう思う?

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

    >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

    の部分は常に動作させて

    trueで
    J1にONの値が入っているとき
    B列に文字が入力された場合D列に時間を入力

    elseは何もしない場合

    どう書き換えればよろしいですかね?

    No.1の回答に寄せられた補足コメントです。 補足日時:2022/10/11 14:55

A 回答 (2件)

No1です。



ご質問文にある、
 >J1にONの値が入っているときのみ
 >B列に文字が入力された場合
 >D列に時間を入力し
 >それ以外は
 >D列とE列に
 >3桁か4桁の文字を入力した場合
 >コロンを自動入力し時刻を入力する
のようにしたつもりですが、動作しないってことでしょうか???

ただし、内容的にはご提示のコードにならっていますので、「3桁か4桁の文字」のチェックは行っていませんし、セルの書式設定の制御もご提示のロジックのままにしてあります。
(全体の書式が「標準」等の時に、J1がONでない時には、D、E列に数値を入れると時刻と解釈されたり、そうでなかったりする可能性があります)


>trueで
>J1にONの値が入っているとき
>B列に文字が入力された場合D列に時間を入力
>elseは何もしない場合
>どう書き換えればよろしいですかね?
文章の意味がわかりません。

何か制御を変えたいのであれば、なさりたいように変更してください。
もしも、「J1がONでなければ何もしない」と言う意味であるなら、Else句以降を削除すれば良いでしょう。
    • good
    • 0

こんにちは



ご質問文に記載のない部分はよくわかりませんけれど、ざっと見て同じ内容でよければこんな感じでしょうか?
(複数セルにコピペ等しても動作するようにしてあります)

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

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
この回答への補足あり
    • good
    • 0

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