Excel 单击工作表时触发工作表宏

Excel 单击工作表时触发工作表宏,excel,vba,worksheet-function,Excel,Vba,Worksheet Function,我编写了以下宏:其中单元格e3使用公式填充,可以更改值。但是,为了使这个宏工作,我必须在e3中按enter键来触发它。我希望在单击名为unit specification的选项卡时触发此宏,并相信我需要第二个宏来触发它。我在底部尝试了一个名为second macro的宏,但没有成功 谁能帮忙吗 Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("E3")) Is Nothing T

我编写了以下宏:其中单元格e3使用公式填充,可以更改值。但是,为了使这个宏工作,我必须在e3中按enter键来触发它。我希望在单击名为unit specification的选项卡时触发此宏,并相信我需要第二个宏来触发它。我在底部尝试了一个名为second macro的宏,但没有成功

谁能帮忙吗

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("E3")) Is Nothing Then
If UCase$(Range("E3").Value) = "DWW" Then
    Rows("6:47").EntireRow.Hidden = False 'if "DWW" is entered in E3, rows 
are visible
Else
    Rows("6:47").EntireRow.Hidden = True 'if anything other than "DWW" is  
entered in E3 or E3 is blank, the rows are hidden
End If
End If


If Not Intersect(Target, Range("E3")) Is Nothing Then
If UCase$(Range("E3").Value) = "THETIS" Then
    Rows("48:70").EntireRow.Hidden = False 'if "Thetis" is entered in E3, 
rows are visible
Else
    Rows("48:70").EntireRow.Hidden = True 'if anything other than "Thetis" 
is  entered in E3 or E3 is blank, the rows are hidden
End If
End If

If Not Intersect(Target, Range("E3")) Is Nothing Then
If Range("E3").Value = "" Then
    Rows("71:75").EntireRow.Hidden = False 'if "DWW" is entered in E3, rows 
are visible
Else
    Rows("71:75").EntireRow.Hidden = True 'if anything other than "THETIS" 
is  entered in E3 or E3 is blank, the rows are hidden
End If
End If
   End Sub

 'second macro
 private sub SecondMacro()
 call Worksheet_change
end sub

您正在查找工作表\u Activate方法。无论何时选择该选项卡,都将运行此操作

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("E3")) Is Nothing Then
        Call runYourThing 'When the cell change event is triggered, only run your thing if the changed range includes cell E3
    End If
End Sub

Private Sub Worksheet_Activate()
    Call runYourThing 'When the worksheet activate event is triggered, always run your thing
End Sub

Sub runYourThing() 'Run the thing
    If UCase$(Range("E3").Value) = "DWW" Then
        Rows("6:47").EntireRow.Hidden = False 'if "DWW" is entered in E3, rows are Visible
    Else
        Rows("6:47").EntireRow.Hidden = True 'if anything other than "DWW" is entered in E3 or E3 is blank, the rows are hidden
    End If

    If UCase$(Range("E3").Value) = "THETIS" Then
        Rows("48:70").EntireRow.Hidden = False 'if "Thetis" is entered in E3, rows are visible
    Else
        Rows("48:70").EntireRow.Hidden = True 'if anything other than "Thetis" is  entered in E3 or E3 is blank, the rows are hidden
    End If

    If Range("E3").Value = "" Then
        Rows("71:75").EntireRow.Hidden = False 'if "DWW" is entered in E3, rows are Visible
    Else
        Rows("71:75").EntireRow.Hidden = True 'if anything other than "THETIS" is  entered in E3 or E3 is blank, the rows are hidden
    End If
End Sub

请注意,这里可以使用3种不同的事件

工作表\u激活 如果从其他工作表切换到此工作表时工作表被激活,则运行

工作表\u ChangeByVal目标作为范围 当单元格中的值更改时运行

工作表\u选择ChangeByVal目标作为范围 如果选择其他单元格,则运行


因此,您可以决定哪个事件最适合您。

在我读取宏的方式中,您似乎希望根据对E3单元格值的更改自动隐藏某些行。如果这是正确的,那么我认为以下代码替换将起作用:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("E3")) Is Nothing Then checkE3
End Sub

Sub checkE3()
    Dim E3val As String
    E3val = UCase$(Range("E3").Value)
    Rows("6:47").EntireRow.Hidden = Not (E3val = "DWW")
    Rows("48:70").EntireRow.Hidden = Not (E3val = "THETIS")
    Rows("71:75").EntireRow.Hidden = Not (E3val = "")
End Sub
如果E3的值因用户自己更改而发生更改,则会“触发”,但如果E3中存在重新计算时导致更改的公式,则不会触发

在这种情况下,您可能希望对其他事件(例如工作表)运行checkE3。这将导致它的运行频率远远超过您的需要,基本上每次执行重新计算时都是如此,但是checkE3中使用的资源非常小,因此您不太可能看到任何问题,除非正在进行大量计算

Private Sub Worksheet_Calculate()
    checkE3
End Sub

我想触发的宏使用了2。想要第二个宏,它触发我的第一个宏,它查看e3中的单元格值。但是,此值可以根据使用公式填充的先前条件进行更改。所以我想让我的第二个宏说出类似于1的内容,然后触发初始宏,但我无法让触发器工作:@PGD15非常不清楚。编辑你的原始问题,请更具体一些。快一点,这是我从另一条评论中所想的,但我已经包括了我的初始代码,名称在末尾,我得到的错误是编译错误:参数不是可选的。。。我做错了什么?我对宏不是很在行,所以很抱歉,如果这是明显的私有子工作表\u ChangeByVal目标范围那么,工作表\u change将更改的范围作为参数。您可以通过编写调用工作表\u changerange3来修复它。不过这有点像黑客。实际上,您要做的是创建第三个子系统,工作表激活和工作表更改方法都会调用该子系统。只有在确保“更改”范围等于您要查找的单元格后,才能调用它。啊,比我想象的要复杂。。。我该怎么做??因为我能想到的所有选项我都已经尝试了2宏类型的格式——ofc不起作用:我编辑了我的答案来说明我的意思。这是非常简单的事情,只是重新组织你的代码。另一个注意事项是,当你试图弄清楚一块代码的实际功能时,正确的格式/缩进将极大地帮助你。Brill万分感谢工作得很好!!我不太明白这有那么容易——我几乎就要到了,这是我的书中的一个胜利!!: