2017-04-05 69 views
0

我知道您只能有一个私人子工作表更改事件,但我正在努力为我需要的事件组合代码。我是VBA的新手,因此我们赞赏任何帮助或建议。使用select case会更有效率吗?不同范围的私人子工作表事件

首先需要代码:

Private Sub Worksheet_Change(ByVal target As Range) 

Dim cell As Range 
Set cell = Range("AK9:AR50") 

Application.EnableEvents = False 
If Not Application.Intersect(cell, target) Is Nothing Then 
If target.Column = 37 Then 
    target.Offset(, 1).Value = target.Value/Range("V" & target.Row).Value 
ElseIf target.Column = 38 Then 
    target.Offset(, -1).Value = WorksheetFunction.RoundUp((target.Value * Range("V" & target.Row).Value), -2) 
End If 
If target.Column = 39 Then 
    target.Offset(, 1).Value = target.Value/Range("V" & target.Row).Value 
ElseIf target.Column = 40 Then 
    target.Offset(, -1).Value = WorksheetFunction.RoundUp((target.Value * Range("V" & target.Row).Value), -2) 
End If 
If target.Column = 41 Then 
    target.Offset(, 1).Value = WorksheetFunction.RoundUp((target.Value * Range("V" & target.Row).Value), -2) 
ElseIf target.Column = 42 Then 
    target.Offset(, -1).Value = target.Value/Range("V" & target.Row).Value 
End If 
If target.Column = 43 Then 
    target.Offset(, 1).Value = target.Value/Range("V" & target.Row).Value 
ElseIf target.Column = 44 Then 
    target.Offset(, -1).Value = WorksheetFunction.RoundUp((target.Value * Range("V" & target.Row).Value), -2) 
End If 
End If 
Application.EnableEvents = True 

End Sub 

二码需要:

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim controlRng, nRng As Range 
Set controlRng = Range("AF9:AF1000") 
Set nRng = Intersect(controlRng, Target) 

If nRng Is Nothing Then Exit Sub 

If Target.Value = "No Promotion" Then 
    Target.Offset(0, 1) = Range("M" & Target.Row).Value 
ElseIf Target.Value = "Promotion" Then 
    Target.Offset(0, 1) = "" 
ElseIf Target.Value = "Demotion" Then 
    Target.Offset(0, 1) = "" 
ElseIf Target.Value = "Partner" Then 
    Target.Offset(0, 1) = "" 
ElseIf Target.Value = "" Then 
    Target.Offset(0, 1) = "" 
End If 
End Sub 
+0

使用'Select Case Target.Column'而不是多个'If's。 –

回答

0

选择案例肯定会收拾你的代码。您可能还希望构建一个检查,即Target不超过单个单元格。

Private Sub Worksheet_Change(ByVal Target As Range) 

Dim cell As Range 
Dim controlRng As Range, nRng As Range 

Set cell = Range("AK9:AR50") 
Set controlRng = Range("AF9:AF1000") 
Set nRng = Intersect(controlRng, Target) 

Application.EnableEvents = False 

If Not Application.Intersect(cell, Target) Is Nothing Then 
    Select Case Target.Column 
     Case 37, 39, 41, 43 
      Target.Offset(, 1).Value = Target.Value/Range("V" & Target.Row).Value 
     Case 38, 40, 42, 44 
      Target.Offset(, -1).Value = WorksheetFunction.RoundUp((Target.Value * Range("V" & Target.Row).Value), -2) 
    End Select 
End If 

If Not nRng Is Nothing Then 
    Select Case Target.Value 
     Case "No Promotion" 
      Target.Offset(0, 1) = Range("M" & Target.Row).Value 
     Case "Promotion", "Demotion", "Partner", "" 
      Target.Offset(0, 1).ClearContents 
    End Select 
End If 

Application.EnableEvents = True 

End Sub