通过单击按钮调用Sub时的编译错误

时间:2016-01-15 13:20:49

标签: excel vba

我在工作表中按下按钮时尝试执行此代码, 但我收到这个错误:

  

调用Worksheet_Change - >编译错误 - 参数不是可选的

Sub Worksheet_Change(ByVal Target As Range)
Set MyPlage = Range("A1:I1200")
For Each cell In MyPlage
Select Case cell.Value
Case Is = "OK"
cell.EntireRow.Interior.ColorIndex = 43
Case Is = "NOTOK"
cell.EntireRow.Interior.ColorIndex = 3
Case Is = "P"
cell.EntireRow.Interior.ColorIndex = 6
Case Else
cell.EntireRow.Interior.ColorIndex = xlNone
End Select
Next
End Sub

Private Sub CommandButton1_Click()
Call Worksheet_Change
End Sub

3 个答案:

答案 0 :(得分:1)

查看Worksheet_Change子 - 它具有'(ByVal Target As Range)'作为一个论点。这意味着当工作表更改时,子触发器会带有更改范围的值。例如,这允许您操纵最后编辑的单元格。在命令按钮中,您不能为Worksheet_Change子提供有关您所指的范围的信息。正如错误所述,该参数不是可选的。

但是在你的情况下,我无法理解为什么你需要使用Worksheet_Change sub。我建议您只需将当前代码放在顶部子代码中,并将其完全放在按钮的子代码中。

答案 1 :(得分:1)

worksheet_change子系统需要传递一个范围。这样的事情应该让它运行:

Private Sub CommandButton1_Click()
Call Worksheet_Change(Range("A1"))
End Sub

但是,将其放在工作表更改事件中意味着每当表单中的任何内容发生更改时,它都会触发并运行。传递给change事件的范围值(上例中的A1)始终是工作表中更改的任何单元格/单元格的范围。

如果您希望它仅在按下按钮时运行,请将该子项命名为其他内容,并将' byval目标移除为范围'避免必须将范围传递给子的参数。类似的东西:

Sub testSub()
Set MyPlage = Range("A1:I1200")
For Each cell In MyPlage
Select Case cell.Value
Case Is = "OK"
cell.EntireRow.Interior.ColorIndex = 43
Case Is = "NOTOK"
cell.EntireRow.Interior.ColorIndex = 3
Case Is = "P"
cell.EntireRow.Interior.ColorIndex = 6
Case Else
cell.EntireRow.Interior.ColorIndex = xlNone
End Select
Next
End Sub

Private Sub CommandButton1_Click()
Call testSub
End Sub

如果你希望它在任何时候更换工作表以及按下按钮时都能运行,那么你就可以了,但是我无法看到你在做任何事情您的更改子需要它在工作表更改事件中吗?

编辑:您的问题是您正在循环浏览范围并撤消之前的内容。请考虑这是您的数据:

__|_A__|_B_|___C___|__D__|_E_|_F_|_
1_|_OK_|___|_NOTOK_|_FOO_|_P_|___|_
2_|____|___|_______|_____|___|___|_

就本例而言(保持简短),MyPlage范围为A1至F2。你的循环正在寻找价值并采取行动:

A1 = OK > Colour whole row green
A2 = "" > Clear colour from whole row
B1 = "" > Clear colour from whole row (the row that was previously green)
B2 = "" > Clear colour from whole row
C1 = NOTOK > Colour whole row red (the row that was previously cleared of colour)
C2 = "" > Clear colour from whole row
D1 = "FOO" > Clear colour from whole row (the row that was previously red)
D2 = "" > Clear colour from whole row
E1 = "P" > Colour whole row yellow(the row that was previously cleared of colour)
E2 = "" > Clear colour from whole row
F1 = "" > Clear colour from whole row (the row that was previously yellow)
F2 = "" > Clear colour from whole row

您的最终结果是所有行都被清除了颜色,因为您只需将最后一列中的值作为输入来确定行颜色。因此,在您的示例中,如果您的I列包含您要查找的任何值,则只会看到彩色行。

你可以通过点击F8来逐步查看sub,或者在你的celk.entirerow ...元素上放置一个断点,以便在发现case选择为true然后从那里击中F8时停止。我建议您首先在小型数据集上尝试使用它,或者您必须按F8 200次才能移动到列中。

答案 2 :(得分:0)

您不能在Target sub中使用Worksheet_Change,因此您可以将任何范围传递给此子类,如:

Call Worksheet_Change(Range("A1"))

Call Worksheet_Change(Range("B5000"))