2009-07-24 5 views
7

Je suis en train de refactoriser un certain nombre de modules dans un classeur Excel 2003 et le même ensemble de feuilles de calcul est déclaré dans chaque procédure de chaque module; Je voudrais juste les déclarer une fois globalement. Je peux définir le nom de feuille de calcul comme littéral, par exemple:Un objet de feuille de calcul peut-il être déclaré globalement dans Excel VBA?

Public Const xlwkGSModel = "gs_model" As String 

Et puis dans l'utilisation de la procédure:

...ActiveWorkbook.Worksheets(xlwkGSModel).Cells(1,1) 

Mais est-il un moyen de déclarer l'objet de feuille de calcul afin que le code dans la procédure pourrait être:

...xlwkGSModel.Cells(1,1) 

Répondre

10

« 1. Insérer un module

'2. Déclarer la variable publique de feuille de calcul dans le module comme suit

Public xlwkGSModel As Worksheet 

'3. Instancier cette variable publique en cas de charge de l'application

Sub Workbook_Open() 

    Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model") 

End Sub 

« Maintenant, vous pouvez consulter la feuille de gs_model avec la variable xlwkGSModel

» Par exemple

dim x as string 

x = xlwkGSModel.Cells(1,1) 
0

Edit: le commentaire par Alistair Frappez est correct, j'ai lu la question à fond - bien sûr, ma réponse est non t valide pour les objets, seulement pour les types comme string ou integer. Pour les objets, vous avez besoin d'une fonction ou d'un sous-élément qui crée une instance.


Oui, vous pouvez, je l'ai fait récemment. Si vous définissez vos définitions comme Public, vous pouvez les utiliser directement dans vos autres modules (dans le même classeur, bien sûr).

Peut-être que la meilleure approche est d'avoir un module séparé Globals et de les mettre là.

+0

dans Workbook_Open()? Comme une constante ne peut pas contenir d'objets ... –

4

Vous pourriez, mais voulez-vous vraiment plus de variables globales? Pourquoi ne pas créer (dans un module standard) une propriété publique ModelWorksheet, comme ceci:

Public Property Get ModelWorksheet As Worksheet 
    Const ModelWorksheetName As String = "gs_model" 
    Set ModelWorksheet = ActiveWorkbook.Worksheets(ModelWorksheetName) 
End Property 

... alors votre code peut faire:

With ModelWorksheet 
    .Cells(1,1).Value = "foo" 
    .Font.Bold = True 
End With 

Notez également que vous pouvez vous référer à l'un des feuilles dans le classeur en cours directement, donc s'il y a une feuille appelée Sheet1 vous pouvez faire:

With Sheet1 
    .Cells(1,1).Value = "foo" 
    .Font.Bold = True 
End With 
+1

En pensant à ça ... je ne sais pas si je le recommanderais. Le problème avec une propriété est qu'elle ressemble à un objet et si vous êtes dans une boucle qui met à jour, disons, 15000 cellules une par une, c'est beaucoup d'indirection supplémentaire à parcourir à chaque cycle. Je pense qu'il serait préférable d'utiliser directement une référence Worksheet mais YMMV. Je pense toujours qu'il est préférable d'aller Dim sht comme Worksheet/Set sht = ModelWorksheet()/sht.Cells (1,1) ... et mettre le grab de feuille dans une fonction ModelWorksheet. Je sais que cela ne réduit pas le nombre de lignes impliquées, mais se mondialiser est généralement mal conseillé. –

+0

@goodgai: entièrement d'accord; c'est en fait pourquoi j'ai utilisé une instruction With, pour éviter de référencer deux fois la propriété, mais j'aurais dû être plus explicite. Et vous avez raison de dire que même cette méthode n'est pas très utile dans une boucle (à moins que l'option With ... End With enveloppe la boucle entière). –

+2

Oui, j'ai remarqué le Withs dans votre réponse et j'ai vu ce que vous faisiez mais j'ai manqué de caractères dans mon commentaire =) J'ai élaboré ce que j'essayais de dire maintenant, de façon concise: programmation défensive - en évitant la propriété que vous êtes moins susceptible de marcher dans une embuscade de performance par accident. –

5

Il est depuis longtemps, mais mieux plus tard que jamais ;-) Je ne sais pas si cela fonctionne dans Excel 2003 (testé avec 2007):

Vous n'avez même pas besoin de décliner sont des feuilles de calcul dans le code, car elles sont déjà déclarées. Je travaille avec une version allemande d'Excel et je peux accéder à une feuille de calcul en tapant "Tabelle1.Cells (...) ...". Je suppose que dans la version anglaise, c'est quelque chose comme "Table1" ou "Sheet1".

Vous pouvez également modifier ces noms. Dans l'éditeur Visual Basic consultez les objets Microsoft Excel de votre projet VBA. (Ils sont juste au-dessus de vos modules et UserForms dans la vue VBA-Project). Il y a les objets de feuille de travail de votre classeur. Sélectionnez une feuille et activez la fenêtre d'outils Propriétés. Là, vous pouvez modifier le nom de la feuille et y accéder par ce nom dans votre code.

2

Si vous ne souhaitez pas utiliser l'événement Excel, vous pouvez également déclarer votre feuille de calcul publiquement, puis créer un sous-ensemble pour définir la valeur correspondante. Appelez ce sous au début de chaque sous pour initialiser la valeur. (Je l'ai fait de la réponse orwellienne.)


Public WSRawData As Worksheet 

Public Sub RawDataWSInit() 

Set WSRawData = Worksheets(RawData) 

End Sub 

Sub Main() 

Call RawDataWSInit 

End Sub 

0

Vos feuilles de travail sont "objets Microsoft Excel" définis dans votre VBA-Project-Explorer :

Worksheet Properties editing

Dans l'écran ci-dessus, je l'ai appelé ma feuille de calcul DataSheet, maintenant je peux y accéder directement à partir du code:

Set SomeRange = DataSheet.Range("A3:B6") 

Par défaut, votre Worksheets sera nommé « Sheet1 », « Feuil2 », aussi ... en fonction de votre langue. Il est vraisemblable que, bien que les définitions puissent être faites au niveau du module, les valeurs devront être affectées dans une procédure, par exemple,

Questions connexes