2016-12-05 2 views
0

J'ai peu de feuille, et une nécessité pour une fois qu'une cellule spécifique (A1) est égale à "1" la couleur de l'étiquette devient verte une fois que la valeur de leur changement.excel/VBA passer un nom de feuille à une fonction

Je déclare dans un ThisWorkbook la fonction suivante:

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 

Ainsi, dans chaque feuille i définir le code suivant

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

mais je reçois l'erreur suivante

Compilation Erreur. Variable attendue ou routine et non forme

Qu'est-ce qui ne va pas?

Quelqu'un m'aider?

Merci!

+0

Vous devez insérer un module 'new' et y placer votre code, plutôt que le module' ThisWorkbook' – CallumDA

Répondre

0

Si la fonction est définie dans le mod ThisWorkbook ule, vous devriez l'appeler ainsi:

ThisWorkbook.ColorLabel Me.Name 

et par ailleurs, comme il est écrit, ColorLabel qui devraient être un sous pas une fonction (il ne retourne rien).

Cependant, une meilleure conception serait:

  • déplacer sous un module de code indépendant ou
  • renommer le sous-programme dans un gestionnaire d'événement à l'aide Workbook_SheetChange
1

Votre Public Function ColorLabel(LabelName) doit être placé dans un Module, pas dans l'un des Sheets ou Workbook. Habituellement nous plaçons le code qui est lié uniquement aux événements Sheets ou aux événements Workbook.

voir l'image pour Public Function ColorLabel(LabelName) Code

enter image description here

Votre Private function Worksheet_Change(ByVal Target As Range) devrait être en cas Workbook_SheetChange (dans le module Workbook):

enter image description here

code:

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

ColorLabel (Sh.Name) 

End Sub 

Vous pouvez améliorer votre code, en ne demandant pas la fonction ColorLabel sur chaque modification apportée à une cellule dans une feuille, en vérifiant si l'Target est à l'intérieur Range("A1"), voir le code ci-dessous:

code de l'amélioration:

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

Pourquoi avez-vous besoin passer le nom de la feuille de travail à tous? Il suffit de passer une référence à la feuille de calcul elle-même:

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