[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『同じシートでマクロを組む場合』(あさ)
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.