2009-07-24 16 views
7

Sto rifattorizzando un numero di moduli in una cartella di lavoro di Excel 2003 e lo stesso set di fogli di lavoro viene dichiarato in ogni procedura in ciascun modulo; Mi piacerebbe solo dichiararli una volta a livello globale. Posso impostare il nome del foglio di lavoro come un letterale, ad esempio:Un oggetto foglio di lavoro può essere dichiarato globalmente in Excel VBA?

Public Const xlwkGSModel = "gs_model" As String 

E poi nell'uso procedimento:

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

Ma c'è un modo per dichiarare l'oggetto foglio di lavoro in modo che il codice nella routine potrebbe essere:

...xlwkGSModel.Cells(1,1) 

risposta

10

'1. Inserire un modulo

'2. Dichiarare la variabile pubblica del foglio di lavoro nel modulo come segue

Public xlwkGSModel As Worksheet 

'3. Un'istanza di questa variabile pubblico in caso di carico dell'applicazione

Sub Workbook_Open() 

    Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model") 

End Sub 

'ora che è possibile fare riferimento al foglio di lavoro gs_model con la variabile xlwkGSModel

' Per esempio

dim x as string 

x = xlwkGSModel.Cells(1,1) 
0

Edit: il commento di Alistair di Knock è corretto, ho dovuto leggere attentamente la questione - naturalmente la mia risposta è no t valido per oggetti, solo per tipi come stringa o intero. Per gli oggetti hai bisogno di una funzione o sub che crea un'istanza.


Sì, è possibile, di recente ho fatto. Se definisci le tue definizioni come Public puoi usarle direttamente negli altri moduli (all'interno della stessa cartella di lavoro, ovviamente).

Forse l'approccio migliore è quello di avere un modulo separato Globali e inserirli lì.

+0

Presumibilmente mentre le definizioni possono essere eseguite a livello di modulo, i valori dovranno essere assegnati in una procedura, ad es. in Workbook_Open()? Dal momento che una costante non può contenere oggetti ... –

4

Si potrebbe, ma vuoi davvero più variabili globali? Perché non creare (all'interno di un modulo standard) una proprietà pubblica ModelWorksheet, in questo modo:

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

... allora il tuo codice può fare:

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

Si noti inoltre che è possibile fare riferimento ad uno qualsiasi degli fogli di lavoro nella cartella di lavoro corrente direttamente, quindi se c'è un foglio chiamato Foglio1 si può fare:

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

Pensando a questo ... non so se lo consiglierei. Il problema con una proprietà è che assomiglia ad un oggetto e se si è in un ciclo che aggiorna, diciamo, 15000 celle una per una, questo è un ulteriore punto di riferimento per ogni ciclo. Penso che sarebbe meglio usare direttamente un riferimento al foglio di lavoro, ma YMMV. Continuo a pensare che sia meglio usare Dim sht come foglio di lavoro/Set sht = ModelWorksheet()/sht.Cells (1,1) ... e mettere il foglio in una funzione ModelWorksheet. So che non riduce il numero di linee coinvolte, ma andare globale è di solito sconsiderato. –

+0

@goodgai: concordato con tutto il cuore; questo è il motivo per cui ho usato un'istruzione With, per evitare di fare riferimento alla proprietà due volte, ma avrei dovuto essere più esplicito. E hai ragione anche se questo metodo non è di grande aiuto in un ciclo (a meno che With End ... non completi l'intero ciclo). –

+2

Sì, ho notato il Withs nella tua risposta e ho visto quello che stavi facendo, ma ho esaurito i caratteri nel mio commento =) Ho elaborato quello che stavo cercando di dire ora, in modo conciso: programmazione difensiva - evitando la proprietà che sei meno probabilità di imbattersi in un imboscata di prestazioni per caso. –

5

E 'molto tempo fa, ma meglio tardi che mai ;-) Non so se funziona in Excel 2003 (testato con il 2007):

Non hai nemmeno bisogno di decl sono fogli di lavoro nel codice, perché sono già dichiarati. Sto lavorando con una versione tedesca di Excel e posso accedere a un foglio di lavoro digitando "Tabelle1.Cells (...) ...". Presumo nella versione inglese è qualcosa come "Table1" o "Sheet1".

È inoltre possibile modificare questi nomi. Nel Visual Basic Editor dare un'occhiata agli oggetti di Microsoft Excel del progetto VBA. (Si trovano proprio sopra i moduli e i UserForm nella vista VBA-Project). Ci sono gli oggetti del foglio di lavoro della tua cartella di lavoro. Seleziona un foglio e attiva la finestra delle proprietà. Qui puoi modificare il nome del foglio e accedervi con quel nome nel tuo codice.

2

Oppure, se non si desidera utilizzare l'Evento di Excel, è possibile dichiarare il proprio foglio di lavoro anche pubblicamente, quindi creare un sottotitolo per impostarne il valore. Chiama quel sub all'inizio di ogni sub per inizializzare il valore. (Ho fatto questo dalla risposta di Orwell.)


Public WSRawData As Worksheet 

Public Sub RawDataWSInit() 

Set WSRawData = Worksheets(RawData) 

End Sub 

Sub Main() 

Call RawDataWSInit 

End Sub 

0

i fogli di lavoro sono "oggetti di Microsoft Excel" definite nel VBA-Project-Explorer :

Worksheet Properties editing

nella schermata sopra ho chiamato il mio foglio di lavoro Foglio dati, così ora posso accedervi direttamente all'interno del codice:

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

è preimpostato Fogli di lavoro si chiamerà "Sheet1", "Foglio2", così ... dipende dalla tua lingua.

Problemi correlati