Vba 从同一工作簿中的特定工作表运行宏

Vba 从同一工作簿中的特定工作表运行宏,vba,excel,Vba,Excel,下面的宏可以正常工作,如果我把它放在sheet1中。但是我想把这个宏放在表2中。不幸的是,它不能从表2生成作业,只能从表1生成作业。你能帮我从第二张纸开始吗 Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range Dim sRes As Variant On Error GoTo haveError Set rng = Application.Intersect(Sheet1.Range("I15:I18"),

下面的宏可以正常工作,如果我把它放在sheet1中。但是我想把这个宏放在表2中。不幸的是,它不能从表2生成作业,只能从表1生成作业。你能帮我从第二张纸开始吗

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim sRes As Variant
On Error GoTo haveError

Set rng = Application.Intersect(Sheet1.Range("I15:I18"), Target)


If Not rng Is Nothing Then
    If rng.Cells.count = 1 Then
        sRes = Application.VLookup(rng.Value, _
               Sheet2.Range("A56:B58"), 2, True)
        'turn off events before updating the worksheet
        Application.EnableEvents = False
        rng.Offset(0, 1).Value = IIf(IsError(sRes), "???", sRes)
        Select Case rng.Offset(0, 1).Value
            Case "Low Risk": rng.Offset(0, 2).Value = Date + 180

            Case "Medium Risk": rng.Offset(0, 2).Value = Date + 150

            Case "High Risk": rng.Offset(0, 2).Value = Date + 120

        End Select
        Application.EnableEvents = True
    End If '<< edit added missing line here
End If
Exit Sub

haveError:
Application.EnableEvents = True '<< ensures events are reset
End Sub
Private子工作表\u更改(ByVal目标作为范围)
变暗rng As范围
作为变体的Dim sRes
关于错误转到haveError
设置rng=Application.Intersect(表1.Range(“I15:I18”),目标)
如果不是,那么rng什么都不是
如果rng.Cells.count=1,则
sRes=应用程序.VLookup(rng.Value_
表2.范围(“A56:B58”),2,真实值)
'在更新工作表之前关闭事件
Application.EnableEvents=False
rng偏移量(0,1)。值=IIf(IsError(sRes),“??”,sRes)
选择案例rng.Offset(0,1).值
案例“低风险”:净抵销(0,2)。值=日期+180
案例“中等风险”:净抵销(0,2)。价值=日期+150
案例“高风险”:净抵销(0,2)。值=日期+120
结束选择
Application.EnableEvents=True

结束如果这个问题的答案比我想象的要简单:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng As Range
Dim rng1 As Range

Dim sRes As Variant
Dim sRes1 As Variant
On Error GoTo haveError

Set rng = Application.Intersect(Sheet1.Range("I15:I18"), Target)
Set rng1 = Application.Intersect(Sheet1.Range("I20:I23"), Target)
If Not rng Is Nothing Then
    If rng.Cells.count = 1 Then
        sRes = Application.VLookup(rng.Value, _
               Sheet2.Range("A56:B58"), 2, True) 'Waterlow
        'turn off events before updating the worksheet
        Application.EnableEvents = False
        rng.Offset(0, 1).Value = IIf(IsError(sRes), "???", sRes)
        Select Case rng.Offset(0, 1).Value
            Case "Low Risk": rng.Offset(0, 2).Value =  Date + 180
            Case "Medium Risk": rng.Offset(0, 2).Value = Date + 150      
            Case "High Risk": rng.Offset(0, 2).Value = Date + 120

        End Select
        Application.EnableEvents = True
    End If '<< edit added missing line here

ElseIf Not rng1 Is Nothing Then
If rng1.Cells.count = 1 Then
        sRes1 = Application.VLookup(rng1.Value, _
               Sheet3.Range("A28:B30"), 2, True) 'MUST
        'turn off events before updating the worksheet
        Application.EnableEvents = False
        rng1.Offset(0, 1).Value = IIf(IsError(sRes1), "???", sRes1)
        Select Case rng1.Offset(0, 1).Value
            Case "Low Risk": rng1.Offset(0, 2).Value = Date + 180
            Case "Medium Risk": rng1.Offset(0, 2).Value = Date + 150
            Case "High Risk": rng1.Offset(0, 2).Value = Date + 120

        End Select
        Application.EnableEvents = True
    End If '<< edit added missing line here
   End If
Exit Sub

haveError:
Application.EnableEvents = True '<< ensures events are reset
End Sub
Private子工作表\u更改(ByVal目标作为范围)
变暗rng As范围
变暗rng1 As范围
作为变体的Dim sRes
Dim sRes1作为变体
关于错误转到haveError
设置rng=Application.Intersect(表1.Range(“I15:I18”),目标)
设置rng1=Application.Intersect(表1.Range(“I20:I23”),目标)
如果不是,那么rng什么都不是
如果rng.Cells.count=1,则
sRes=应用程序.VLookup(rng.Value_
表2.范围(“A56:B58”)、2,真实)“Waterlow
'在更新工作表之前关闭事件
Application.EnableEvents=False
rng偏移量(0,1)。值=IIf(IsError(sRes),“??”,sRes)
选择案例rng.Offset(0,1).值
案例“低风险”:净抵销(0,2)。值=日期+180
案例“中等风险”:净抵销(0,2)。价值=日期+150
案例“高风险”:净抵销(0,2)。值=日期+120
结束选择
Application.EnableEvents=True

结束如果“将代码中的
sheet1
更改为
sheet2
如何,只需删除
sheet1.
中的
Application.Intersect(sheet1.Range(“I15:I18”),Target)
为什么不将代码放入模块(而不是表格)并更改所有表格参考(sheet1、sheet2等)到Activesheet?最后一个建议部分起作用,因为它作为模块运行宏的一部分。它不会放置偏移值in@ArindamD因为这必须在工作表中,因为它是一个
工作表\u更改
事件?因此,您不能将此子模块放入模块中。使用
ActiveSheet
也是一种不好的做法。