Macro en excel no guarda valores de variables

En septiembre escribí algo parecido y di con la solución yo solo (un error de deletreo de la variable al nombrarla publica, una tontería). En este caso sigo sin encontrar dónde está el problema.

Tengo un formulario que me muestra ciertos datos de la facturación de un cliente (número de factura, cliente, fecha, importe...). Está hecho de forma que si la factura es del tipo "azul" me dice que no puede mostrar los datos y si es del tipo "roja" sí. Lo hago así:

Private Sub CommandButton1_Click()

Application.ScreenUpdating = False

num_factura = TextBox1.Value
Sheets("albaranes").Select
ultima_fila_albaranes = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
i = ultima_fila_albaranes
''' BUSCAMOS SI EL NUMERO DE FACTURA ESTÁ EN LA HOJA DE FACTURAS ROJAS
Do While i > 3
If Range("I" & i).Value = num_factura Then
mensaje = MsgBox("Factura ROJA. Elija otra.", vbOKOnly + vbInformation, "ERROR EN NÚMERO DE FACTURA")
TextBox2.Value = "" ' Cliente
TextBox3.Value = "" ' Restaurante
TextBox4.Value = "" ' Fecha
TextBox5.Value = "" ' Importe
Exit Sub
End If
i = i - 1
Loop
''' LOCALIZAMOS LA FACTURA EN LA HOJA DE FACTURAS AZULES Y MOSTRAMOS SUS DATOS

Sheets("facturas").Select
ultima_fila_facturas = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
i = ultima_fila_facturas
salir_bucle = 0
Do While i > 3 And salir_bucle = 0
If Range("A" & i).Value = num_factura Then
TextBox2.Value = Range("C" & i).Value ' Cliente
TextBox3.Value = Range("D" & i).Value ' Restaurante
TextBox4.Value = Range("B" & i).Value ' Fecha
TextBox5.Value = Range("E" & i).Value ' Importe
salir_bucle = 1
End If
i = i - 1
Loop
factura = TextBox1.Value
cliente = TextBox2.Value
restaurante = TextBox3.Value
fecha = TextBox4.Value
importe = TextBox5.Value
End Sub

Como veis, al final todo le doy valor a ciertas variables. Variables que dentro del propio formulario están declaradas públicas de la siguiente manera:

Public factura, cliente, restaurante As Integer
Public fecha As Date
Public importe As Currency

El caso es que al darle a un segundo botón, me abre un segundo formulario en el que me añade un Textbox extra para modificar el texto que aparece en la factura. Además, me mantiene los datos anteriores para asegurarme de que estoy modificando la factura correcta. Lo hago así (recordad que es un formulario distinto):

Private Sub UserForm_Initialize()

TextBox1.Value = factura

TextBox2.Value = cliente
TextBox3.Value = restaurante
TextBox4.Value = fecha
TextBox5.Value = importe
End Sub

Hay poco que rascar en ese código. El caso es que las variables "factura" y "cliente" no las guarda. Cuando se está ejecutando la macro, al pasar al segundo informe, si me pongo encima de ellas con el ratón aparecen "Vacío", en lugar del valor. Las otras tres sí que las coge.

He comprobado y no estoy usando esas variables en ninguna otra parte de todo el código ni las declaro en ningún otro sitio.

¿Qué está pasando?

2 respuestas

Respuesta
1

[Hola

Al parecer "algo" estás omitiendo comentare o quizá no te percataste. Es mejor que compartas tu archivo, lo mejor es hacerlo a través de algún Drive y enviando por aquí el enlace.

Gracias Abraham pero el archivo no puedo compartirlo por motivos de LOPD española. Y editarlo para proteger esos datos sería demasiado complicado.

Respuesta
1

La recuperación de las variables depende del ámbito donde se esté llamando al procedimiento, las variables se mantienen hasta que el procedimiento termina en el Ámbito actual, prueba con declararlas con Static, ejemplo: "Static factura as string", verifica que la declaración de la variable no se haya efectuado dentro de un procedimiento (dentro de un Sub) y lo otro que observo es que al cambiar de formulario se cambia de Ámbito y se pierden los valores de las variables aunque las public deberían mantenerse, revísate este articulo:

https://docs.microsoft.com/es-es/office/vba/language/concepts/getting-started/understanding-scope-and-visibility 

Puedes revisar en que momento se pierde el valor de la variable: en el editor de Vb le das ejecutar paso a paso o le colocas un punto de interrupción al código haciendo un clic en la barra gris al lado izquierdo del código, le das clic derecho encima de la variable, le das Agregar Inspección, clic en Aceptar y recorres el código paso a paso usando la tecla "F8" verificando el valor de la variable durante la ejecución del procedimiento, si llegas a un "End sub" y al empezar el otro Sub la variable inicia con "Nothing" entonces es porque la variable se declaró dentro de un procedimiento, en ese caso debes declarar la variable en la parte superior del código encima de la primera definición de procedimiento.

Buenas Alex:

Perdona la tardanza, pero he estado de viaje.

He estado revisando lo que me comentas y no consigo dar con la tecla. Para asegurarme de que no tengo esas variables por ninguna otra parte del archivo, les he cambiado el nombre a uno que jamás usaría. Igualmente he usado la herramienta "buscar" para asegurarme de que no aparecen por ninguna parte.

Tras eso, he hecho como dices y las he declarado en la parte superior del procedimiento, antes del primer "Private Sub".

Y finalmente, les he añadido un "Agregar inspección" a cada una (no conocía esta función, muchas gracias por mostrármela).

Y el resultado es demasiado raro para mi: en la ventana de inspección las variables mantienen su valor pero en el siguiente Userform en el cual las uso para que aparezcan en los cuadros de texto correspondientes, no tienen valor. Te pego algunas capturas para explicarme mejor:

Como ves, las variables no pasan a "locales" cuando cambio de Formulario/Userform, a pesar de que en la última imagen ves que las tengo definidas como "públicas" en el primero de los Userform, antes de cualquier procedimiento interno en él.

Estoy convencido de que el problema está en eso, como bien has indicado. Que en "contexto" en la ventana de "Agregar inspección" debo conseguir que sea para "todo el archivo" y no solo para Commonbutton2clik, pero es que no veo manera de hacerlo.

Tengo hecho este tipo de declaración por todo el archivo excel, decenas de veces, y siempre me ha funcionado.

Gracias de nuevo por la ayuda y perdona por la chapa.

Un saludo,

Kirchhoff.

ya probaste con declararlas Static?, prueba poner los valores de esas variables en una hoja al salir del formulario y que cuando llames el otro formulario las recupere de la hoja que previamente hiciste.

Buenas Alex. Al declararlas como "Static" me da un error al intentar ejecutar la macro: "Error de compilación. El procedimiento externo no es válido".

Al final voy a tener que hacer eso, sacarlas a una hoja extra. Pero lo quería evitar. Es lo que mi profesor llamaba (hablando de otras cosas) "una solución poco ingenieril". Una chapuza, vamos.

Estoy seguro que el procedimiento no lo estás haciendo bien ya que el valor de la variable no tiene por que perderse, he hecho un ejemplo de enviar variables de un formulario a otro y no he tenido problema, asegúrate de asignar el valor a las variables desde el formulario origen (mosulo contexto), por ejemplo:

En el modulo del Userform1

Public valor As Integer

Private Sub CommandButton1_Click(), 'botón de comando dentro del userform1
valor = txt_enviar.Value 'textbox de userform1
UserForm2.TXT_RECIBIR.Value = valor ' textbox de userform2
UserForm2.Show ' muestra el userform2 con el valor de la variable
End Sub

Y no estoy de acuerdo con tu profesor; pregunto ¿Quién es mas ingeniero?, ¿Uno qué no pudo obtener el resultado correcto porque no superó una dificultad en el procedimiento? ¿U otro que obtuvo los resultados correctos a pesar que no sabia el procedimiento correcto?, yo me quedo con el segundo.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas