2010-04-27 44 views
86

me escribió el siguiente código:¿Cómo declaro una variable global en VBA?

Function find_results_idle() 

    Public iRaw As Integer 
    Public iColumn As Integer 
    iRaw = 1 
    iColumn = 1 

y me sale el mensaje de error:

"atributo no válido en Sub o Function"

¿Conoce lo que hice mal?

He intentado usar Global en lugar de Public, pero tengo el mismo problema.

Intenté declarar la función en sí misma como `Pública, pero tampoco sirvió de nada.

¿Qué debo hacer para crear la variable global?

Respuesta

130

tiene que declarar las variables fuera de la función:

Public iRaw As Integer 
Public iColumn As Integer 

Function find_results_idle() 
    iRaw = 1 
    iColumn = 1 
29

Para utilizar variables globales, Insertar nuevo módulo de VBA Proyecto de interfaz de usuario y las variables de declarar utilizando Global

Global iRaw As Integer 
Global iColumn As Integer 
87

Ésta es una pregunta acerca scope.

Si sólo desea las variables para durar toda la vida útil de la función, use Dim (abreviatura de Dimensión) dentro de la función o sub declarar las variables:

Function AddSomeNumbers() As Integer 
    Dim intA As Integer 
    Dim intB As Integer 
    intA = 2 
    intB = 3 
    AddSomeNumbers = intA + intB 
End Function 
'intA and intB are no longer available since the function ended 

Un variable global (como señaló SLaks) se declara fuera de la función utilizando la palabra clave Public. Esta variable estará disponible durante la vida de su aplicación en ejecución. En el caso de Excel, esto significa que las variables estarán disponibles siempre que ese libro de Excel en particular esté abierto.

Public intA As Integer 
Private intB As Integer 

Function AddSomeNumbers() As Integer 
    intA = 2 
    intB = 3 
    AddSomeNumbers = intA + intB 
End Function 
'intA and intB are still both available. However, because intA is public, ' 
'it can also be referenced from code in other modules. Because intB is private,' 
'it will be hidden from other modules. 

Puede también tener variables que sólo son accesibles dentro de un módulo en particular (o clase) declarándolos con la palabra clave Private.

Si está creando una aplicación grande y siente la necesidad de usar variables globales, le recomendaría crear un módulo separado solo para sus variables globales. Esto debería ayudarlo a hacer un seguimiento de ellos en un solo lugar.

+1

+1 Todavía útil 7 años después. Pero, ¿hay algún matiz adicional con respecto a las variables de objeto frente a las variables de datos? Me encontré con un problema relacionado con el ámbito de las variables de objeto que provocó una nueva pregunta. Muy apreciado si tuviera tiempo para echar un vistazo. https://stackoverflow.com/q/46058096/5457466 – Egalth

12

Si esta función está en un módulo/clase, puede simplemente escribirlos fuera de la función, por lo que tiene Global Scope. Alcance Global significa que la variable se puede acceder por otra función en el mismo módulo/clase (si se utiliza dim como establecimiento de declaraciones, utilice public si desea que las variables se puede acceder a todas las funciones en todos los módulos):

Dim iRaw As Integer 
Dim iColumn As Integer 

Function find_results_idle() 
    iRaw = 1 
    iColumn = 1 
End Function 

Function this_can_access_global() 
    iRaw = 2 
    iColumn = 2 
End Function 
1

Crea un número entero público en la Declaración general.

Luego en su función puede aumentar su valor cada vez. Ver ejemplo (función para guardar adjuntos de un correo electrónico como CSV).

Public Numerator As Integer 

Public Sub saveAttachtoDisk(itm As Outlook.MailItem) 
Dim objAtt As Outlook.Attachment 
Dim saveFolder As String 
Dim FileName As String 

saveFolder = "c:\temp\" 

    For Each objAtt In itm.Attachments 
      FileName = objAtt.DisplayName & "_" & Numerator & "_" & Format(Now, "yyyy-mm-dd H-mm-ss") & ".CSV" 
         objAtt.SaveAsFile saveFolder & "\" & FileName 
         Numerator = Numerator + 1 

      Set objAtt = Nothing 
    Next 
End Sub 
9

La pregunta es realmente sobre el alcance, como el otro hombre lo expresó.

En resumen, considerar este "módulo":

Public Var1 As variant  'Var1 can be used in all 
          'modules, class modules and userforms of 
          'thisworkbook and will preserve any values 
          'assigned to it until either the workbook 
          'is closed or the project is reset. 

Dim Var2 As Variant  'Var2 and Var3 can be used anywhere on the 
Private Var3 As Variant ''current module and will preserve any values 
          ''they're assigned until either the workbook 
          ''is closed or the project is reset. 

Sub MySub()    'Var4 can only be used within the procedure MySub 
    Dim Var4 as Variant ''and will only store values until the procedure 
End Sub     ''ends. 

Sub MyOtherSub()   'You can even declare another Var4 within a 
    Dim Var4 as Variant ''different procedure without generating an 
End Sub     ''error (only possible confusion). 

Se puede extraer de este MSDN reference para más información sobre la declaración de variables y este otro Stack Overflow Question para más información sobre cómo las variables salir de su ámbito. otros

Dos cosas rápidas:

  1. se organizarán al utilizar variables de nivel de libro de trabajo, por lo que su código no prestarse a confusión. Prefiera Funciones (con los tipos de datos adecuados) o pase de argumentos ByRef.
  2. Si desea que una variable preserve su valor entre llamadas, puede usar la declaración Static.
+0

¿Estás seguro de que una variable global se puede usar en diferentes libros? No funciona para mí – Seb

+0

¡Buen punto! Noté que no agregué una referencia de dónde obtuve esa información ... Tampoco la encontré de nuevo. Es mejor editar la respuesta ...:/Ah, y gracias Seb. – FCastro

Cuestiones relacionadas