2016-12-05 6 views
0

У меня есть несколько листов, и нужно, чтобы один раз из него была выбрана определенная ячейка (A1) «1», цвет ярлыка станет зеленым после изменения их значения.excel/VBA передают имя листа функции

Я заявляю в ThisWorkbook следующую функцию:

Public Function ColorLabel(LabelName) 
Set Foglio = Sheets(LabelName) 
Set Target = Foglio.Range("A1") 

If Target = "1" Then 
    Foglio.Tab.ColorIndex = 4 
Else 
    Foglio.Tab.ColorIndex = xlNone 
end if 
End Function 

Таким образом, в каждом листе я определить следующий код

Private function Worksheet_Change(ByVal Target As Range) 
ColorLabel(ActiveSheet.CodeName) 
end function 

но я получаю следующую ошибку

Компиляция ошибка. Ожидаемая переменная или рутина, а не форма

Что случилось?

Кто-нибудь мне помогает?

Спасибо!

+0

Вы должны вставить новый модуль и разместить там свой код, а не модуль 'ThisWorkbook' – CallumDA

ответ

0

Если функция определена в ThisWorkbook мод ОЮЛ, вы должны назвать это таким образом:

ThisWorkbook.ColorLabel Me.Name 

и, кстати, как написано, ColorLabel Шоуда быть Sub не функция (она ничего не возвращает).

Однако лучше дизайн будет:

  • двигаться к югу, чтобы независимый модуль кода или
  • переименовать подлодку в обработчик событий с помощью Workbook_SheetChange
1

Ваш Public Function ColorLabel(LabelName) должен быть помещен в Module, а не внутри одного из Sheets или Workbook. Обычно мы размещаем там код, который связан только с событиями Sheets или Workbook событиями.

см Изображение Public Function ColorLabel(LabelName) кода

enter image description here

Ваш Private function Worksheet_Change(ByVal Target As Range) должен быть в Workbook_SheetChange случае (в Workbook модуле):

enter image description here

Код:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

ColorLabel (Sh.Name) 

End Sub 

Вы можете улучшить свой код, не вызывая ColorLabel функцию на всех внесенных изменениях в любую ячейку на любом листе, проверяя, если Target внутри Range("A1") см ниже код:

Улучшен код:

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) 

' call the ColorLabel function only if value in Cell A1 was modified 
If Not Intersect(Target, Range("A1")) Is Nothing Then 
    ColorLabel (Sh.Name) 
End If 

End Sub 
0

Почему вам нужно пропустите имя рабочего листа? Просто отправьте ссылку на рабочий лист:

Public Function ColorLabel(Foglio As Worksheet) 
    Dim Target As Range 
    Set Target = Foglio.Range("A1") 

    If Target.Value = "1" Then 
     Foglio.Tab.ColorIndex = 4 
    Else 
     Foglio.Tab.ColorIndex = xlNone 
    End If 
End Function 

'If this is the event handler you want... 

Private Function Worksheet_Change(ByVal Target As Range) 
    ColorLabel Me 
End Function 

'Or in ThisWorkbook: 

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)  
    ColorLabel Sh  
End Sub 
Смежные вопросы