2008-11-12 7 views
1

Je voudrais faire quelque chose comme ajouter une propriété nice-to-Excel-fonctions Name à la classe WorkBook. Y at-il un bon moyen de le faire?Ajouter une propriété à la classe VBA existante

Problème plus détaillé: Dans VBA, vous pouvez affecter une formule à une plage dans une feuille de calcul Excel. Je veux faire ainsi, et je veux que ma formule se rapporte à un deuxième classeur, qui est un objet appelé wb dans mon code. J'utilise ensuite wb.Name pour affecter une formule à une plage.

Le problème se pose lorsque wb.Name comporte une guillemet simple. Ensuite, vous liquidez avec quelque chose comme ceci:

=MONTH('[Ryan's WB]Sheet1'A1) 

dans la feuille de calcul, qui échoue parce que le seul citation dans le nom du classeur correspond au premier guillemet simple.

Ce que je voudrais est une propriété FunName pour la classe WorkBook qui remplace toutes les guillemets simples dans la propriété Name avec deux guillemets simples et renvoie cela. Ensuite, la formule ci-dessus serait bien le vent ressembler

=MONTH('[Ryan''s WB]Sheet1'A1) 

Répondre

3

Vous n'avez pas besoin de créer une classe distincte pour étendre la classe de classeur. Vous pouvez ajouter des propriétés au module existant ThisWorkbook de classe, comme ceci:

Public Property Get FunName() As String 

    FunName = Replace(Me.Name, "'", "''") 

End Property 

Ensuite, vous appelez ThisWorkbook.FunName pour obtenir votre nom nettoyé. Cependant, ce code doit exister dans le classeur à portée de main. Si vous voulez travailler sur n'importe quel classeur, votre fonction est la voie à suivre.

1

Il suffit de faire un REPLACE pour doubler les guillemets simples

WorksheetName = Replace(WB.Name, "'", "''") 
0

Qu'est-ce que vous avez besoin est une classe qui étend l'objet Workbook. Insérez un module de classe, essayez le code suivant

Dim WithEvents WB As Workbook 

Public Sub SetWB(W As Workbook) 
    Set WB = W 
End Sub 

Public Property Get FunName() As String 
    FunName = Replace(WB.Name, "'", "''") 
End Property 

Private Sub WB_SheetCalculate(ByVal Sh As Object) 
    'this runs when WB calculates 
End Sub 

« utiliser comme ceci

Dim WB As New wbClass 
WB.SetWB ActiveWorkbook 
CleanedName = WB.FunName 

Notez que comme un bonus, j'ai mis WithEvents dans la ligne qui tamise WB en haut de la classe. Cela vous permet de piéger tous les événements qui arrivent à WB, et j'ai inclus l'événement Calculate comme une démo ci-dessus. Si vous êtes dans le code de classe et cliquez sur la liste déroulante objets en haut à gauche du volet de code, vous verrez l'objet WB, et si vous cliquez dessus, la zone de liste de droite vous donnera tous les événements à choisir.

+0

Absolument parfait! Ceci est exactement ce que je cherchais. Je vous remercie! –

+0

OK, presque parfait. Il apparaît maintenant que les objets wbClass ont uniquement accès à la propriété FunName. Est-il possible de conserver l'intégralité de l'objet WB d'origine et d'ajouter la propriété FunName? –

+0

Malheureusement, VBA ne supporte pas l'héritage, vous devez répliquer tout ce que vous voulez. (Personnellement, je voudrais simplement ajouter une fonction normale pour ce faire, plutôt que d'étendre les objets). – dbb

1

La réponse finale semble être que la classe WorkBook peut être étendue pour inclure une propriété de nom qui est agréable aux formules Excel. Cela peut être fait en utilisant la méthode fournie par dbb. Toutefois, comme VBA ne prend pas en charge l'héritage, les objets de la classe étendue auront uniquement les propriétés que vous définissez pour eux.

Par conséquent, il est vraiment plus logique d'utiliser simplement une fonction. Voici ce que je vais utiliser:

Function FormulaWorkName(ByVal aName As String) As String 
    FormulaWorkName = Replace(aName, "'", "''") 
End Function 

Ce que je vais appliquer aux noms des feuilles de calcul et des classeurs.