[[20100316112608]] 『同じシートでマクロを組む場合』(あさ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『同じシートでマクロを組む場合』(あさ)
 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

 こちらのコードをこのエクセルの学校のログからコピーしました
 (あさ)

[[20100312112651]] 『時刻の入力』(まゆ)
 こちらで私が回答したコードですね^^;

 こんな感じにしてください。

 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.