[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『同じシートでマクロを組む場合』(あさ)
Private Sub Worksheet_Change(ByVal Target As Range) A行・B行でマクロを組んだ場合最初のこの↑はエラーにならないのですが C行・D行で同じマクロを組むと Private Sub Worksheet_Change(ByVal Target As Range)が黄色になってしまい コンパイルエラー:名前が適切ではありませんWorksheet_Change とでてしまいます。 VB初心者です。 宜しくお願い致します。
Private Sub Worksheet_Change(ByVal Target As Range) If or(target.columns = 1,target.columns = 2) Then
elseif or(target.column = 3,target.column = 4) Then
とか、条件式で分岐させます。 BJ
BJさん 私もよく間違えますが、ワークシート関数とVBAの表記の違いが・・・^^;
>If or(target.columns = 1,target.columns = 2) Then
>elseif or(target.column = 3,target.column = 4) Then
If Target.Columns = 1 Or Target.Columns = 2 Then
ElseIf Target.Column = 3 Or Target.Column = 4 Then
(momo)
すみません。 s が余計なものが混じってました。 target.columns ↓ target.column
追加、 あ、そうか、Orの書き方ですね。 しばらく気がつかなかった。 BJ
このコードを入力しましたが同じエラーになってしまいます。
C行とD行・F行とG行・I行とJ行に同じマクロを入力したいんですが
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Columns = 1 Or Target.Column = 2 Then
Const Sinya1 As Date = "5:00" '深夜終了時間
Const Sinya2 As Date = "22:00" '深夜開始時間
Dim myTime As Date, buf As Long
If Target.Count > 1 Then Exit Sub
If Application.Intersect(Target, Me.Range("C5:D35")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
If .NumberFormatLocal Like "*:*" Then
.Value = Int(.Value) & ":" & Round((.Value - Int(.Value)) * 100, 0)
End If
If Me.Range("C" & .Row).Value <> "" And Me.Range("D" & .Row).Value <> ""
Then
myTime = TimeValue(Me.Range("C" & .Row).Text)
If myTime < Sinya1 Then
buf = DateDiff("n", myTime, Sinya1)
End If
myTime = TimeValue(Me.Range("D" & .Row).Text)
If myTime > Sinya2 Then
buf = buf + DateDiff("n", Sinya2, myTime)
End If
Me.Range("E" & .Row).Value = TimeSerial(0, buf, 0)
End If
End With
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
ElseIf Target.Column = 3 Or Target.Column = 4 Then
Const Sinya1 As Date = "5:00" '深夜終了時間
Const Sinya2 As Date = "22:00" '深夜開始時間
Dim myTime As Date, buf As Long
If Target.Count > 1 Then Exit Sub
If Application.Intersect(Target, Me.Range("F5:G35")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
If .NumberFormatLocal Like "*:*" Then
.Value = Int(.Value) & ":" & Round((.Value - Int(.Value)) * 100, 0)
End If
If Me.Range("F" & .Row).Value <> "" And Me.Range("G" & .Row).Value <> "" Then
myTime = TimeValue(Me.Range("F" & .Row).Text)
If myTime < Sinya1 Then
buf = DateDiff("n", myTime, Sinya1)
End If
myTime = TimeValue(Me.Range("G" & .Row).Text)
If myTime > Sinya2 Then
buf = buf + DateDiff("n", Sinya2, myTime)
End If
Me.Range("H" & .Row).Value = TimeSerial(0, buf, 0)
End If
End With
Application.EnableEvents = True
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
Const Sinya1 As Date = "5:00" '深夜終了時間
Const Sinya2 As Date = "22:00" '深夜開始時間
Dim myTime As Date, buf As Long
If Target.Count > 1 Then Exit Sub
If Application.Intersect(Target, Me.Range("I5:J35")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
If .NumberFormatLocal Like "*:*" Then
.Value = Int(.Value) & ":" & Round((.Value - Int(.Value)) * 100, 0)
End If
If Me.Range("I" & .Row).Value <> "" And Me.Range("J" & .Row).Value <> "" Then
myTime = TimeValue(Me.Range("I" & .Row).Text)
If myTime < Sinya1 Then
buf = DateDiff("n", myTime, Sinya1)
End If
myTime = TimeValue(Me.Range("J" & .Row).Text)
If myTime > Sinya2 Then
buf = buf + DateDiff("n", Sinya2, myTime)
End If
Me.Range("K" & .Row).Value = TimeSerial(0, buf, 0)
End If
End With
Application.EnableEvents = True
End Sub
こちらのコードをこのエクセルの学校のログからコピーしました (あさ)
こちらで私が回答したコードですね^^;
こんな感じにしてください。
Private Sub Worksheet_Change(ByVal Target As Range)
Const Sinya1 As Date = "5:00" '深夜終了時間
Const Sinya2 As Date = "22:00" '深夜開始時間
Dim myTime As Date, buf As Long, myR1 As Range, myR2 As Range
If Target.Count > 1 Then Exit Sub
If Application.Intersect(Target, Me.Range("C5:D35,F5:G35,I5:J35")) Is Nothing Then Exit Sub
Application.EnableEvents = False
With Target
If .NumberFormatLocal Like "*:*" Then
.Value = Int(.Value) & ":" & Round((.Value - Int(.Value)) * 100, 0)
End If
Select Case .Column
Case 3, 6, 9
Set myR1 = Target
Set myR2 = Target.Offset(, 1)
Case 4, 7, 10
Set myR1 = Target.Offset(, -1)
Set myR2 = Target
End Select
If myR1.Value <> "" And myR2.Value <> "" Then
myTime = TimeValue(myR1.Text)
If myTime < Sinya1 Then
buf = DateDiff("n", myTime, Sinya1)
End If
myTime = TimeValue(myR2.Text)
If myTime > Sinya2 Then
buf = buf + DateDiff("n", Sinya2, myTime)
End If
myR2.Offset(, 1).Value = TimeSerial(0, buf, 0)
End If
End With
Application.EnableEvents = True
End Sub
ちなみに Private Sub Worksheet_Change(ByVal Target As Range) は シートモジュールのイベントプロシージャですので複数作成することはできません。 1つのプロシージャで組まないといけないのでIFやSelectCaseで分岐したり イベント実行の判定も複数考慮する必要があります。 (momo)
(momo)様 ありがとうございました。<m(__)m> 助かりました。(あさ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.