Es fundamental entender el código de forma correcta previamente a utilizarlo a tu trabajo si tdeseas aportar algo puedes comentarlo.
Solución:
Prueba esto llamando PRINCIPAL() :
Public myvar As Integer
Sub MAIN()
Call SetVar
Call UseVar
End Sub
Sub SetVar()
myvar = 999
End Sub
Sub UseVar()
Dim newvar As Variant
newvar = myvar * 0.5
MsgBox newvar
End Sub
Si declaras un artículo Estático , su valor se conservará dentro del procedimiento o sub.
Si declara el artículo Público , su valor se conservará y será visible para otros procedimientos también.
Aunque esta pregunta fue respondida hace más de cuatro años por @Gary’s Student, hay un matiz sutil que vale la pena mencionar, ya que la solución puede depender del tipo de datos de myvar
.
En primer lugar, como ha señalado en la pregunta, Public Static myvar as Integer
no funciona, porque Static
solo se permite dentro de un sub o función.
Como se señaló en los comentarios al OP por @Patrick Lepelletier, puede evitar esto fácilmente declarando un Constant
en su lugar (asumiendo que no necesita cambiarlo dinámicamente): Public Const myvar as Integer = 999
. (O posiblemente Private Const myvar...
)
Otra opción es declarar myvar
como un función en lugar de una variable o constante, convirtiéndolo efectivamente en un pseudo-constante:
Private Function myvar() as Integer
Static intMyvar as Integer
intMyvar = 999
myvar = intMyvar
End function
En este sencillo ejemplo donde myvar
es un número entero, el enfoque de pseudo-constante es obviamente innecesario y agrega la sobrecarga de una llamada de función. Simplemente declarando un Constant
hace el trabajo. Sin embargo, usar una constante solo funciona si el valor es static y no es un objeto. No funcionará si myvar
es un objeto, por ejemplo un Range
. En ese caso, el uso de pseudo-constantes podría ser útil:
Private Function myvar() as Range
Set myvar = Range("A1")
End Function
Otra ventaja es que puede usar código dentro de la función para verificar ciertas condiciones y asignar diferentes valores a myvar
respectivamente.
El enfoque de pseudoconstante también se puede combinar con rangos de hojas de cálculo de nombres: si la celda A1 es un rango con nombre, digamos MyRange
, entonces podrías escribir:
Dim strMyString as String
strMyString = "MyRange"
Private Function myvar() as Range
Set myvar = Range(strMyString)
End Function
Ahora es posible moverse por el contenido de la celda A1 sin romper el código, ya que el rango con nombre sigue si corta y pega la celda. Encuentro este enfoque útil en la etapa de diseño, cuando las cosas tienden a moverse mucho en una hoja de trabajo.
Las pseudoconstantes también ayudan a evitar algunos problemas generalmente asociados con variables globales (o de nivel de módulo) que pueden ser un problema en proyectos más grandes.
Te invitamos a añadir valor a nuestra información tributando tu veteranía en las críticas.