通过点击button调用Sub时编译错误

我试图执行这个代码,当button在工作表中按下,但我收到此错误:

调用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 

看看Worksheet_Change子 – 它有'(作为范围的ByVal目标)'作为参数。 这意味着,当工作表变化时,子触发器,并且它携带改变的范围的值。 这允许您操作最后编辑的单元格,例如。 在您的命令button中,您不提供Worksheet_Change子项有关您引用的范围的信息。 如错误状态,该参数不是可选的。

但是在你的情况下,我不明白你为什么需要使用Worksheet_Change子。 我build议你只要把目前在顶端的代码,并把它完全放在button的子。

worksheet_change子需要一个范围传递给它。 像这样的东西应该让它运行:

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

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

如果你希望它只在按下button的时候运行,那么命名其他的东西,并且将“byval target as range”参数移除,以避免必须将范围传递给sub。 就像是:

 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 

如果你希望它在任何时间运行,工作表被改变,并且当按下button时,你也可以像现在这样好,但是我看不到你正在做的任何事情需要它在工作表更改事件?

编辑:你的问题是,你正在循环通过一个范围和撤消你以前。 考虑到这是你的数据:

 __|_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 

您的最终结果是所有的行都被清除了颜色,因为您只是将最后一列中的值作为input来确定行颜色。 因此,在您的示例中,如果您的“我的专栏”包含您正在查找的任何值,则只会看到一个彩色的行。

你可以通过点击F8来查看这个动作,通过这个子步骤,或者在你的celk.entirerow …元素上放置一个断点,这样当一个caseselect被发现是真的,然后从那里点击F8时,它会停止。 我build议首先在小数据集上尝试一下,以便在行动中看到它,否则必须按F8 200次来移动列。

您不要在Worksheet_Change子项中使用Target ,因此您可以将任何范围传递给此子项:

 Call Worksheet_Change(Range("A1")) 

要么

 Call Worksheet_Change(Range("B5000"))