2009-07-24 10 views
7

Estoy refactorizando una cantidad de módulos en un libro de Excel 2003 y el mismo conjunto de hojas de trabajo se declara en cada procedimiento en cada módulo; Me gustaría simplemente declararlos una vez en todo el mundo. Puedo establecer el nombre de hoja de cálculo como un literal, por ejemplo:¿Se puede declarar un objeto de hoja de cálculo globalmente en Excel VBA?

Public Const xlwkGSModel = "gs_model" As String 

Y luego, en el uso procedimiento:

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

Pero hay una manera de declarar el objeto de hoja de modo que el código en el procedimiento podría ser:

...xlwkGSModel.Cells(1,1) 

Respuesta

10

'1. Inserte un módulo

'2. Declara la variable pública hoja de cálculo del módulo de la siguiente manera

Public xlwkGSModel As Worksheet 

'3. Crear instancias de esta variable pública en caso de carga de aplicaciones

Sub Workbook_Open() 

    Set xlwkGSModel = ActiveWorkbook.Worksheets("gs_model") 

End Sub 

'ya se puede consultar la hoja de trabajo gs_model con la variable xlwkGSModel

' Por ejemplo

dim x as string 

x = xlwkGSModel.Cells(1,1) 
0

Editar: el comentario de Alistair de Knock es correcto, debería haber leído la cuestión a fondo - por supuesto, mi respuesta es no t válido para objetos, solo para tipos como cadena o entero. Para objetos necesitas una función o sub que crea una instancia.


Sí, puedes, recientemente lo hice. Si define sus definiciones como Public, puede usarlas directamente en sus otros módulos (dentro del mismo libro de trabajo, por supuesto).

Tal vez el mejor enfoque es tener un módulo separado Globals y ponerlos allí.

+0

Presumiblemente mientras que las definiciones se pueden realizar a nivel de módulo, los valores deberán asignarse en un procedimiento, p. en Workbook_Open()? Como una constante no puede contener objetos ... –

4

Podría, pero ¿realmente desea más variables globales? Por qué no crear (dentro de un módulo estándar) una propiedad pública ModelWorksheet, así:

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

... entonces su código puede hacer:

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

Tenga en cuenta también que se puede hacer referencia a cualquiera de las hojas de trabajo en el libro actual directamente, por lo que si hay una hoja llamada Hoja1 que puede hacer:

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

Pensando en esto ... No sé si lo recomendaría. El problema con una propiedad es que se ve como un objeto y si está en un bucle que actualiza, digamos, 15000 celdas una por una, esta es una gran cantidad de direccionamiento indirecto en cada ciclo. Creo que sería mejor usar una referencia de hoja de trabajo directamente, pero YMMV. Sigo pensando que es mejor ir Dim sht como Worksheet/Set sht = ModelWorksheet()/sht.Cells (1,1) ... y poner la captura de hoja en una función de ModelWorksheet. Sé que no reduce el número de líneas involucradas, pero pasar a nivel global suele ser desacertado. –

+0

@goodgai: estoy de acuerdo con todo el corazón; esa es la razón por la que utilicé una declaración With para evitar hacer referencia a la propiedad dos veces, pero debería haber sido más explícita. Y tienes razón acerca de que incluso este método no es de mucha ayuda en un bucle (a menos que el Con ... Terminar con envuelva todo el bucle). –

+2

Sí, noté los Contras en tu respuesta y vi lo que estabas haciendo pero me quedé sin personajes en mi comentario =) Resolví lo que estaba tratando de decir ahora, concisamente: programación defensiva - al evitar la propiedad que eres menos probabilidades de entrar en una emboscada de rendimiento por accidente. –

5

Es hace mucho tiempo, pero mejor tarde que nunca ;-) No sé si eso funciona en Excel 2003 (probado con 2007):

Ni siquiera necesita declinar son hojas de trabajo en el código, porque ya están declaradas. Estoy trabajando con una versión alemana de Excel y puedo acceder a una hoja de trabajo escribiendo "Tabelle1.Cells (...) ...". Supongo que en la versión en inglés es algo así como "Tabla1" o "Hoja1".

También puede cambiar estos nombres. En el Editor de Visual Basic, eche un vistazo a los objetos de Microsoft Excel de su VBA-Project. (Están justo encima de sus Módulos y UserForms en la vista Proyecto VBA). Están los Objetos Hoja de Trabajo de su libro de trabajo. Seleccione una hoja y active la Ventana de herramientas Propiedades. Allí puede editar el nombre de la hoja y acceder a ella con ese nombre en su código.

2

O si no desea utilizar el Evento de Excel, también puede declarar públicamente su hoja de trabajo y luego crear un sub para establecer el valor para ella. Llame a ese sub al principio de cada sub para inicializar el valor. (Lo hice de la respuesta de Orwell.)


Public WSRawData As Worksheet 

Public Sub RawDataWSInit() 

Set WSRawData = Worksheets(RawData) 

End Sub 

Sub Main() 

Call RawDataWSInit 

End Sub 

0

las hojas de cálculo son "Objetos de Microsoft Excel" definidos en su VBA-Project-Explorer :

Worksheet Properties editing

en la pantalla anterior he llamado mi hoja de cálculo hoja de datos, por lo que ahora puedo acceder a ella directamente desde el código:

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

Por defecto sus hojas de trabajo serán nombrados "Sheet1", "Hoja2", aso ... dependiendo de tu idioma.

Cuestiones relacionadas