Ошибка компиляции при вызове Sub нажатием кнопки

Я пытаюсь выполнить этот код, когда на листе нажата кнопка, но я получаю эту ошибку:

Вызов 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 Target As Range)». Это означает, что когда рабочий лист изменяется, вспомогательные триггеры, и он переносит значение диапазона, который изменился. Это позволяет, например, манипулировать последней отредактированной ячейкой. В своей командной кнопке вы не предоставляете субтитру Worksheet_Change информацию о том, к какому диапазону вы обращаетесь. Как указывает ошибка, этот аргумент не является необязательным.

Однако в вашем случае я не понимаю, почему вам нужно использовать Sub Worksheet_Change. Я предлагаю вам просто взять код, находящийся в верхней части, и полностью разместить его в пределах кнопки.

Для элемента worksheet_change требуется диапазон, который должен быть передан ему. Что-то вроде этого должно заставить его работать:

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

Однако внесение этого в событие изменения рабочего листа означает, что он запускается и запускается каждый раз, когда что-либо в листе изменяется. Значение диапазона, переданное событию изменения (A1 в моем примере выше), всегда является диапазоном любых изменений ячеек / ячеек на листе.

Если вы хотите, чтобы он запускался ТОЛЬКО при нажатии кнопки, назовите sub что-то еще и удалите аргумент «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 

Если вы хотите, чтобы он запускался в любое время, когда лист был изменен, а также когда нажата кнопка, вы в порядке, как и вы, но я не вижу, что вы делаете что-либо в своем подменю изменения, в котором оно должно быть событие изменения рабочего листа?

Edit: Ваша проблема в том, что вы перебираете диапазон и уничтожаете то, что ранее. Подумайте, что это ваши данные:

 __|_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, чтобы пройти через суб, или поместите точку останова на своих элементах celk.entirerow … так, чтобы она остановилась, когда выбран случай, выбранный как истина, а затем ударил F8 оттуда. Я бы рекомендовал сначала попробовать его на небольшом наборе данных, чтобы увидеть его в действии, или вам придется ударить F8 200 раз, чтобы переместиться через столбец.

Вы не используете Target в Worksheet_Change sub, поэтому вы можете передать любой диапазон для этого субполя:

 Call Worksheet_Change(Range("A1")) 

или

 Call Worksheet_Change(Range("B5000")) 
Давайте будем гением компьютера.