Recorrer objetos de uno o varios Userform
fabien25000
Mensajes publicados
697
Estado
Miembro
-
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención -
yg_be Mensajes publicados 23437 Fecha de registro Estado Colaborador Última intervención -
Hola a todos,
Gracias de antemano a todos los que se tomen el tiempo de leerme y ayudarme a encontrar pistas de trabajo.
Tengo un archivo de Excel que funciona únicamente a través de formularios.
Todo funciona relativamente bien, pero a veces tengo "caprichos", errores que se manifiestan sin razón aparente. El código funciona, pero de vez en cuando se pone en depuración y a menudo basta con volver a colocar la línea amarilla al principio del sub para que todo vuelva a desarrollarse correctamente.
Aclaró que todas mis hojas de código tienen la clave "option explicit" y que el proyecto está compilado, por lo tanto, a priori, no hay variables salvajes que estén por ahí.
Mi idea para intentar entender estos "caprichos" sería hacer un módulo de informe de errores, hacer un bucle sobre los uf activos y recuperar los valores y el estado de cada objeto. Pero cada uf es diferente, puede haber desde 3 objetos hasta más de un centenar.
¿Hay algún método para hacer que este bucle sea genérico independiente del número de objetos, de su tipo (textbox, combobox, checkbox, optionbutton... etc.) y de su nombre? Un tipo de código en esta idea, pero no consigo encontrar cómo escribirlo.
Siendo una herramienta de venta que cuenta con un centenar de hojas, una veintena de userforms y tantos módulos, me es imposible compartirlo aquí sin datos confidenciales.
--
Cuando solo se dispone de un martillo, todos los problemas parecen un clavo.
Gracias de antemano a todos los que se tomen el tiempo de leerme y ayudarme a encontrar pistas de trabajo.
Tengo un archivo de Excel que funciona únicamente a través de formularios.
Todo funciona relativamente bien, pero a veces tengo "caprichos", errores que se manifiestan sin razón aparente. El código funciona, pero de vez en cuando se pone en depuración y a menudo basta con volver a colocar la línea amarilla al principio del sub para que todo vuelva a desarrollarse correctamente.
Aclaró que todas mis hojas de código tienen la clave "option explicit" y que el proyecto está compilado, por lo tanto, a priori, no hay variables salvajes que estén por ahí.
Mi idea para intentar entender estos "caprichos" sería hacer un módulo de informe de errores, hacer un bucle sobre los uf activos y recuperar los valores y el estado de cada objeto. Pero cada uf es diferente, puede haber desde 3 objetos hasta más de un centenar.
¿Hay algún método para hacer que este bucle sea genérico independiente del número de objetos, de su tipo (textbox, combobox, checkbox, optionbutton... etc.) y de su nombre? Un tipo de código en esta idea, pero no consigo encontrar cómo escribirlo.
For Each ufactif In thisproject For Each objet In ufactif If objet Like Label Then Next objet Worksheets("toto").Range("tata") = objet.Name Worksheets("toto").Range("tutu") = objet.Value Next objet Next ufactif Siendo una herramienta de venta que cuenta con un centenar de hojas, una veintena de userforms y tantos módulos, me es imposible compartirlo aquí sin datos confidenciales.
--
Cuando solo se dispone de un martillo, todos los problemas parecen un clavo.
Enlaces relacionados:
- suma vba y valor en un label del userform
- Alimentar varios combobox (userform) a partir de una pestaña vba
- CREACIÓN DE UN USERFORM EN EXCEL PARA MAC
- Variable de objeto o variable de bloque no definida: Error de ejecución 91
- copiar los datos de un Userform en una hoja de Excel
- Creación de un directorio fotográfico mediante un userform de Excel
13 respuestas
Hola,
un ejemplo de código para listar los objetos de varios Userform si no hay una etiqueta con un solo procedimiento
https://www.cjoint.com/c/LFljK6JB7ig
un ejemplo de código para listar los objetos de varios Userform si no hay una etiqueta con un solo procedimiento
https://www.cjoint.com/c/LFljK6JB7ig
Hola
Un ejemplo para obtener la lista de los nombres de controles de un userform
https://www.cjoint.com/c/LFljRgDtwYB
Atentamente
Un ejemplo para obtener la lista de los nombres de controles de un userform
Private Sub btok_Click() Dim s As String Dim OObj s = "" For Each OObj In Me.Controls s = s & OObj.Name & vbLf Next OObj MsgBox s End Sub
https://www.cjoint.com/c/LFljRgDtwYB
Atentamente
Hola ccm81 y gracias por tu respuesta,
tu código es bastante similar al código de f894009
declara
misma pregunta que a f894009: al no saber de dónde viene el error, ¿hay que prever la llamada de tu ejemplo en cada sub de cada uf?
tu código es bastante similar al código de f894009
declara
dim OObj: cuando no se especifica el As algo, una variable se declara automáticamente como variante, ¿verdad? en tu ejemplo podríamos declarar
dim OObj As MSForms.Control?
misma pregunta que a f894009: al no saber de dónde viene el error, ¿hay que prever la llamada de tu ejemplo en cada sub de cada uf?
yg_be
Mensajes publicados
23437
Fecha de registro
Estado
Colaborador
Última intervención
Ambassadeur
1 588
hola,
quizás:
quizás:
Dim comp, ct As Control, s As String Debug.Print Now() For Each comp In ThisWorkbook.VBProject.VBComponents If comp.Type = 3 Then Debug.Print comp.Name For Each ct In comp.designer.Controls s = TypeName(ct) Select Case s: Case "Label": Case "TextBox", "CheckBox": Debug.Print ct.Name, ct.Value Case Else: Debug.Print ct.Name, s End Select Next ct End If Next comp
Hola yg_be y gracias por tu respuesta
tu ejemplo, si he entendido bien, analiza la totalidad del libro, todas las hojas y todos los uf?
ya he leído
También intenté llamar a tu procedimiento desde un uf (hice un botón con un evento de clic que llama al procedimiento) pero fallaba en la línea
tu ejemplo, si he entendido bien, analiza la totalidad del libro, todas las hojas y todos los uf?
s = TypeName(ct)¿da el tipo del objeto (combobox, textbox, etc.)?
ya he leído
Debug.Print(a menudo en los códigos que compartes, por cierto) pero no sé cómo usarlo y no veo nada en la pantalla cuando paso la línea paso a paso, ¿qué hace exactamente?
También intenté llamar a tu procedimiento desde un uf (hice un botón con un evento de clic que llama al procedimiento) pero fallaba en la línea
For Each ct In comp.designer.Controlscon el mensaje "variable objeto o variable de bloque with no definida", pero al ponerlo en un sub que disparo con F5, el bucle funciona correctamente. Si quiero usarlo al aparecer un bug con los uf abiertos, ¿eso devolverá el mensaje de error o me he manejado mal?
```html
variante:
Dim comp As UserForm, ct As Control, s As String Load UserForm1 Load UserForm2 Debug.Print Now() For Each comp In UserForms 'Debug.Print comp.Parent.Name For Each ct In comp.Controls s = TypeName(ct) Select Case s: Case "Label": Case "TextBox", "CheckBox": Debug.Print ct.Name, ct.Value Case Else: Debug.Print ct.Name, s End Select Next ct Next comp```
esto permite tener también el nombre del userform:
Dim comp As UserForm, ct As Control, s As String Debug.Print Now() For Each comp In UserForms For Each ct In comp.Controls s = TypeName(ct) Select Case s: Case "Label", "CommandButton": Case "TextBox", "CheckBox": Debug.Print ct.Parent.Name, ct.Name, ct.Value Case Else: Debug.Print ct.Parent.Name, ct.Name, s End Select Next ct Next comp
efectivamente, tu nuevo código solo trata las UF activas (y está genial)
es
El objetivo es recuperar los valores en un informe de errores y, como no sé dónde ni cuándo va a aparecer un error, ¿debería hacer una llamada a tu código en cada sub de todas las UF y de todos los módulos o existe otro método? Tal vez estoy pensando en un public sub declarado al inicio del archivo. (intentos escribir
Edit: No estoy pidiendo una aclaración sobre ct.Parent.Name para que hagas una modificación a tu código, ustedes ya me han enseñado suficiente como para que pueda manejar eso por mí mismo ;)
es
For Each comp In ThisWorkbook.VBProject.VBComponentsel que trata todo el libro excepto las UF activas, ¿verdad?
ct.Parent.NameEste comando devuelve el "lugar" (no sé cómo decirlo) donde se encuentra el objeto: si el objeto está en la UF, devuelve el nombre de la UF, pero si el objeto está en un frame, entonces es el nombre del frame el que se devuelve, ¿correcto?
El objetivo es recuperar los valores en un informe de errores y, como no sé dónde ni cuándo va a aparecer un error, ¿debería hacer una llamada a tu código en cada sub de todas las UF y de todos los módulos o existe otro método? Tal vez estoy pensando en un public sub declarado al inicio del archivo. (intentos escribir
on error goto informe_de_erroren público justo después de la línea option explicit, pero eso habría sido demasiado fácil).
Edit: No estoy pidiendo una aclaración sobre ct.Parent.Name para que hagas una modificación a tu código, ustedes ya me han enseñado suficiente como para que pueda manejar eso por mí mismo ;)
Hola y gracias a ustedes tres por sus respuestas instructivas y extremadamente interesantes
les contestaré a cada uno en un comentario en sus publicaciones respectivas ;)
--
Cuando solo se dispone de un martillo, todos los problemas parecen clavos.
les contestaré a cada uno en un comentario en sus publicaciones respectivas ;)
--
Cuando solo se dispone de un martillo, todos los problemas parecen clavos.
yg_be
Mensajes publicados
23437
Fecha de registro
Estado
Colaborador
Última intervención
Ambassadeur
1 588
No estoy convencido de que tu enfoque (para intentar entender esos "caprichos") vaya a dar resultado.
Lo más importante es obtener el tipo de error. Es posible conseguirlo a través de "on error".
Escribes "a menudo basta con volver a la línea amarilla al principio del sub": ¿has intentado simplemente hacer F8 y eso no es suficiente?
Si funciona volviendo al principio del script, ¿no significa eso que no son los datos (de los userforms) los que causan el problema?
EDIT:
después de un error (cuando estás en el código que trata un
Lo más importante es obtener el tipo de error. Es posible conseguirlo a través de "on error".
Escribes "a menudo basta con volver a la línea amarilla al principio del sub": ¿has intentado simplemente hacer F8 y eso no es suficiente?
Si funciona volviendo al principio del script, ¿no significa eso que no son los datos (de los userforms) los que causan el problema?
EDIT:
después de un error (cuando estás en el código que trata un
on error,
Err.Numbery
Err.Descriptionte dan el número y el mensaje de error.
Escribes "basta (a menudo) con devolver la línea amarilla al principio del sub": ¿has intentado simplemente hacer F8, y eso no es suficiente? sí, F8 repite el mensaje de error y me pasó una vez por desesperación, sin entender de dónde venía el problema, regresar al principio del sub y funcionó
¿no significa eso que no son los datos (de los userforms) los que causan el problema? sí, pienso como tú, pero como cuando mis comerciales tienen un error son incapaces de decir qué estaban haciendo y dónde hicieron clic cuando ocurrió, pensé que el informe de error podría al menos solucionar eso y si además me permitiera entender esos "caprichos" sería todo beneficio
algunos comerciales consiguen hacer que el archivo falle en rutinas escritas que funcionan desde hace 2 años, pero logran venir a mi oficina con la ventana de depuración y son incapaces de decirme cómo lo hicieron y, incluso yo, no soy completamente incapaz de reproducir el problema (volvió a suceder hace una hora en el uf donde solo hay una lista desplegable para elegir su nombre y un botón validar para pasar al siguiente uf)
¿no significa eso que no son los datos (de los userforms) los que causan el problema? sí, pienso como tú, pero como cuando mis comerciales tienen un error son incapaces de decir qué estaban haciendo y dónde hicieron clic cuando ocurrió, pensé que el informe de error podría al menos solucionar eso y si además me permitiera entender esos "caprichos" sería todo beneficio
algunos comerciales consiguen hacer que el archivo falle en rutinas escritas que funcionan desde hace 2 años, pero logran venir a mi oficina con la ventana de depuración y son incapaces de decirme cómo lo hicieron y, incluso yo, no soy completamente incapaz de reproducir el problema (volvió a suceder hace una hora en el uf donde solo hay una lista desplegable para elegir su nombre y un botón validar para pasar al siguiente uf)
Hola y disculpa por la respuesta tardía, he tenido un fin de semana bastante ocupado... Sin embargo, tuve tiempo para pensar en nuestras conversaciones.
No conozco necesariamente el número ni el mensaje de error, y por eso también me dirigí a un sistema de informe de errores:
por un lado, los comerciales están con clientes en la tienda, y si vienen a mi oficina con un error, mi prioridad es hacer lo necesario para "desbloquear" el script y hacer que el archivo funcione hasta la emisión del presupuesto para no hacer fracasar la venta. En ese caso, debo admitir que apenas miro el mensaje de error, estoy más en modo "contra reloj"..
por otro lado, los comerciales están en casa de los clientes y al día siguiente me entero de que "han perdido una firma debido a que mi software falla", pero sin ninguna indicación sobre qué estaban haciendo, dónde hicieron clic, etc.
Así que, aunque estoy completamente de acuerdo contigo en que el informe puede no ser suficiente para solucionar este problema de "capricho", sigo pensando que podría seguir siendo útil para permitirme recopilar información en caso de un problema.
De hecho, tras el error que tuvo mi comercial el sábado en un formulario que teóricamente es imposible que falle (una lista y un botón), pensé que en lugar de recuperar los valores de los objetos de manera un poco brusca, podría haber más interés en obtener un "diario de clics"... es decir, alimentar una tabla con cada clic del tipo "clic1-userform1-listbox1-valor"toto"" que se escribiría en una hoja dedicada del libro si se solicita un error.
Al menos tendría el mérito de reproducir exactamente la situación del problema.
VBA permite hacer muchas cosas en depuración: examinar variables, por ejemplo.
No conozco este aspecto de VBA, pero efectivamente me parece indudablemente una herramienta que hay que dominar. Al menos sé cómo ejecutar un código paso a paso, usar los espías para controlar los valores de las variables en tiempo real (debug.print también ahora que me aplicaré a usarlo), pero estoy ansioso por aprender y mejorar en VBA.
No conozco necesariamente el número ni el mensaje de error, y por eso también me dirigí a un sistema de informe de errores:
por un lado, los comerciales están con clientes en la tienda, y si vienen a mi oficina con un error, mi prioridad es hacer lo necesario para "desbloquear" el script y hacer que el archivo funcione hasta la emisión del presupuesto para no hacer fracasar la venta. En ese caso, debo admitir que apenas miro el mensaje de error, estoy más en modo "contra reloj"..
por otro lado, los comerciales están en casa de los clientes y al día siguiente me entero de que "han perdido una firma debido a que mi software falla", pero sin ninguna indicación sobre qué estaban haciendo, dónde hicieron clic, etc.
Así que, aunque estoy completamente de acuerdo contigo en que el informe puede no ser suficiente para solucionar este problema de "capricho", sigo pensando que podría seguir siendo útil para permitirme recopilar información en caso de un problema.
De hecho, tras el error que tuvo mi comercial el sábado en un formulario que teóricamente es imposible que falle (una lista y un botón), pensé que en lugar de recuperar los valores de los objetos de manera un poco brusca, podría haber más interés en obtener un "diario de clics"... es decir, alimentar una tabla con cada clic del tipo "clic1-userform1-listbox1-valor"toto"" que se escribiría en una hoja dedicada del libro si se solicita un error.
Al menos tendría el mérito de reproducir exactamente la situación del problema.
VBA permite hacer muchas cosas en depuración: examinar variables, por ejemplo.
No conozco este aspecto de VBA, pero efectivamente me parece indudablemente una herramienta que hay que dominar. Al menos sé cómo ejecutar un código paso a paso, usar los espías para controlar los valores de las variables en tiempo real (debug.print también ahora que me aplicaré a usarlo), pero estoy ansioso por aprender y mejorar en VBA.
Hola a los dos,
Solo para avanzar el Schmilblik
¿Su error está solo en un Userform?
Cuando hacen pruebas en casa (supongo que lo hacen), pueden memorizar las acciones que realizaron en el momento del error. Dado que ustedes hicieron esta "Aplicación", debería ser pan comido
Cuando tienen el error, hagan clic en depurar y pasen el cursor del ratón sobre las variables de esa línea para ver su contenido
antes de volver al principio del procedimiento
Pongan un punto de interrupción en la línea debajo de aquella donde tienen el error
vuelvan al principio
relancen y verifiquen las variables cuando la ejecución del código se detenga
Si persiste y les hace perder firmas, deberían considerar mostrar su archivo con datos no confidenciales. Ustedes deciden
Solo para avanzar el Schmilblik
¿Su error está solo en un Userform?
Cuando hacen pruebas en casa (supongo que lo hacen), pueden memorizar las acciones que realizaron en el momento del error. Dado que ustedes hicieron esta "Aplicación", debería ser pan comido
Cuando tienen el error, hagan clic en depurar y pasen el cursor del ratón sobre las variables de esa línea para ver su contenido
antes de volver al principio del procedimiento
Pongan un punto de interrupción en la línea debajo de aquella donde tienen el error
vuelvan al principio
relancen y verifiquen las variables cuando la ejecución del código se detenga
Si persiste y les hace perder firmas, deberían considerar mostrar su archivo con datos no confidenciales. Ustedes deciden
Hola f894009
¿Tu error solo está en un Userform? No, logran hacer que el archivo se bloquee en cualquier parte y en cualquier momento: un uf con un listbox donde hay que escribir su nombre (para recuperar el nombre del comercial para la edición del presupuesto) y el botón validar que pasa
Cuando haces pruebas en casa (creo que lo haces), puedes memorizar las maniobras que realizaste en el momento del error. Dado que tú eres quien hizo esta "Aplicación", debería ser dos dedos en la nariz Sí, yo pruebo personalmente al máximo el nuevo contenido antes de hacerlo disponible y como dije antes, efectivamente uso el paso a paso y las herramientas de control de variables con el paso del cursor y espías para verificar que todo ocurre como lo he previsto, pero visiblemente son salvajes los que hacen clic por todos lados.
Cuando se trata de un error debido a una mala instrucción, la localizo y la corrijo rápidamente
En general los "caprichos" ocurren más bien en la mail merge, a veces se atasca al abrir Word, a veces al guardar Word en pdf después de la mail merge, pero no hay una constante en la línea que se bloquea, en el Word utilizado, en la hoja del libro que alimenta la mail merge, etc.
Deberías considerar mostrar tu archivo con datos no confidenciales. Tú decides No te imaginas cuánto me gustaría poder compartir mi trabajo y recibir comentarios constructivos al respecto... más allá de las tarifas e información confidencial, mi archivo busca varias centenas de fotos (al menos 600 en total) que ilustran dinámicamente las opciones que se clican en tiempo real, elige qué Word utilizar entre una veintena de archivos para la mail merge y, por lo tanto, todos los caminos están escritos en "duro" en mi programa y confieso que me cuesta ver cómo hacer que el código sea neutro y utilizable por una persona externa, pero Dios sabe que me gustaría que eso fuera posible!
¿Tu error solo está en un Userform? No, logran hacer que el archivo se bloquee en cualquier parte y en cualquier momento: un uf con un listbox donde hay que escribir su nombre (para recuperar el nombre del comercial para la edición del presupuesto) y el botón validar que pasa
.enabled=trueen
_afterupdatedel listbox si el nombre está bien con la lista propuesta... (hace casi 4 años que escribí esta rutina, así que está ampliamente probada)
Cuando haces pruebas en casa (creo que lo haces), puedes memorizar las maniobras que realizaste en el momento del error. Dado que tú eres quien hizo esta "Aplicación", debería ser dos dedos en la nariz Sí, yo pruebo personalmente al máximo el nuevo contenido antes de hacerlo disponible y como dije antes, efectivamente uso el paso a paso y las herramientas de control de variables con el paso del cursor y espías para verificar que todo ocurre como lo he previsto, pero visiblemente son salvajes los que hacen clic por todos lados.
Cuando se trata de un error debido a una mala instrucción, la localizo y la corrijo rápidamente
En general los "caprichos" ocurren más bien en la mail merge, a veces se atasca al abrir Word, a veces al guardar Word en pdf después de la mail merge, pero no hay una constante en la línea que se bloquea, en el Word utilizado, en la hoja del libro que alimenta la mail merge, etc.
Deberías considerar mostrar tu archivo con datos no confidenciales. Tú decides No te imaginas cuánto me gustaría poder compartir mi trabajo y recibir comentarios constructivos al respecto... más allá de las tarifas e información confidencial, mi archivo busca varias centenas de fotos (al menos 600 en total) que ilustran dinámicamente las opciones que se clican en tiempo real, elige qué Word utilizar entre una veintena de archivos para la mail merge y, por lo tanto, todos los caminos están escritos en "duro" en mi programa y confieso que me cuesta ver cómo hacer que el código sea neutro y utilizable por una persona externa, pero Dios sabe que me gustaría que eso fuera posible!
Re,
A menos que me equivoque, nunca ha precisado el número y el texto del error
¿Qué hace la línea en cuestión?
¿Puede mostrar la línea o hacer una captura de pantalla?
A menos que me equivoque, nunca ha precisado el número y el texto del error
¿Qué hace la línea en cuestión?
¿Puede mostrar la línea o hacer una captura de pantalla?
re,
no necesariamente se bloquea en la misma línea, ese es mi problema, de lo contrario habría investigado en esa dirección. como se dijo anteriormente:
no necesariamente conozco el número y el mensaje de error, a decir verdad, y es por eso que me dirigí a un sistema de reporte de errores:
o los comerciales están con clientes en la tienda, y si vienen a mi oficina con un error, mi prioridad es hacer lo necesario para "desbloquear" el script y asegurarme de que el archivo funcione hasta la edición del presupuesto para no arruinar la venta. En este caso, admito que apenas miro el mensaje de error, estoy más en modo "contra el reloj"..
o los comerciales están en casa de los clientes y ahí, aprendo al día siguiente "que han perdido una firma por culpa de mi software que se bloquea" pero sin ninguna indicación sobre lo que estaban haciendo, dónde hicieron clic, etc.
por cierto, me tomó 4 horas, pero creo que he revisado mi carpeta a fondo para permitir un envío confidencial y (normalmente) he puesto en comentario todas las líneas que contienen rutas de acceso que no funcionarían en ningún otro lugar que no sea el mío.
aunque esto es un poco límite con la política de CCM, preferiría enviarlo en un mensaje privado una vez que esté seguro de que el destinatario vive lo suficientemente lejos de mi casa y que no es propenso a cruzar la puerta de mi tienda.
lamento el procedimiento, pero valoro mi trabajo ;)
no necesariamente se bloquea en la misma línea, ese es mi problema, de lo contrario habría investigado en esa dirección. como se dijo anteriormente:
no necesariamente conozco el número y el mensaje de error, a decir verdad, y es por eso que me dirigí a un sistema de reporte de errores:
o los comerciales están con clientes en la tienda, y si vienen a mi oficina con un error, mi prioridad es hacer lo necesario para "desbloquear" el script y asegurarme de que el archivo funcione hasta la edición del presupuesto para no arruinar la venta. En este caso, admito que apenas miro el mensaje de error, estoy más en modo "contra el reloj"..
o los comerciales están en casa de los clientes y ahí, aprendo al día siguiente "que han perdido una firma por culpa de mi software que se bloquea" pero sin ninguna indicación sobre lo que estaban haciendo, dónde hicieron clic, etc.
por cierto, me tomó 4 horas, pero creo que he revisado mi carpeta a fondo para permitir un envío confidencial y (normalmente) he puesto en comentario todas las líneas que contienen rutas de acceso que no funcionarían en ningún otro lugar que no sea el mío.
aunque esto es un poco límite con la política de CCM, preferiría enviarlo en un mensaje privado una vez que esté seguro de que el destinatario vive lo suficientemente lejos de mi casa y que no es propenso a cruzar la puerta de mi tienda.
lamento el procedimiento, pero valoro mi trabajo ;)
Re,
lo siento por el procedimiento, pero valoro mi trabajo
Es obvio.
Dices que el error aparece desde cualquier Userform, pero, ¿es en un procedimiento utilizado por todas o en uno por Userform?
estoy seguro de que el destinatario vive lo suficientemente lejos de mi casa
Pasa por la mensajería personal y dime de dónde eres, yo haré lo mismo.
En cuanto a la confidencialidad, ninguna preocupación por ese lado.
lo siento por el procedimiento, pero valoro mi trabajo
Es obvio.
Dices que el error aparece desde cualquier Userform, pero, ¿es en un procedimiento utilizado por todas o en uno por Userform?
estoy seguro de que el destinatario vive lo suficientemente lejos de mi casa
Pasa por la mensajería personal y dime de dónde eres, yo haré lo mismo.
En cuanto a la confidencialidad, ninguna preocupación por ese lado.
Mis comerciales son magos que logran hacer aparecer errores literalmente en cualquier lugar, cualquier caso de uso, cualquier procedimiento, pero cuando sucede, son incapaces de explicar en qué evento/botón/clic ha ocurrido.
No son errores recurrentes y aún así logran trabajar con bastante tranquilidad (más de 1200 presupuestos el año pasado con mi archivo), pero nunca estoy a salvo de un truco de magia y de un error improbable en rutinas ampliamente comprobadas por el tiempo. Por eso tengo la idea de editar un informe de errores para entender cómo llegaron a esa situación.
Si no puedes reproducir el problema, no veo mucho sentido, por ahora, en poner a disposición un archivo que, además, puede que no contenga el "defecto" del archivo original.
Quizás pedir a los usuarios que tomen una captura de pantalla con el mensaje de error y luego con el lugar del problema en el código.
Un error intermitente también puede venir del entorno, no de tu código.
Quizás pedir a los usuarios que tomen una captura de pantalla con el mensaje de error y luego con el lugar del problema en el código.
Un error intermitente también puede venir del entorno, no de tu código.
Es el archivo original que envié, he retirado todas las tarifas, los logotipos y he puesto en comentario los caminos de guardado y búsqueda de fotos, esa es la única diferencia con el archivo que utilizan mis comerciales.
Lo que me interesa también (no estaba previsto) es tener una opinión general sobre mi trabajo
un error puede venir del entorno eso es un poco lo que temo… ¿Hay alguna manera de controlar eso?
Lo que me interesa también (no estaba previsto) es tener una opinión general sobre mi trabajo
un error puede venir del entorno eso es un poco lo que temo… ¿Hay alguna manera de controlar eso?
Hola a vosotros
estoy desesperado, no hay nada que vaya como me gustaría
utilizo
+ al hacer estas pruebas, me doy cuenta de que el on error impide que la ventana de depuración aparezca. En un error "menor" por ejemplo un set focus inaccesible, está bien ya que no interfiere con el resto del programa, pero en un "gran" error, por ejemplo, buscar un word que no existe en la ruta indicada, hace falta que el programa se detenga ya que el resto del programa no podrá ejecutarse y sobre todo el usuario debe ser advertido de la imposibilidad de continuar
¿Hay alguna manera de diferenciar un error que no afecta al resto del programa de un error que paraliza totalmente el curso de las operaciones?
--
Cuando solo tenemos un martillo todos los problemas se asemejan a un clavo
estoy desesperado, no hay nada que vaya como me gustaría
utilizo
TypeName(uf.ActiveControl)para recuperar el nombre del objeto en mi "diario de clics" salvo que si el objeto está en un frame por ejemplo, en lugar de devolver el nombre del objeto, devuelve el nombre del frame, así que no tengo trazabilidad de los clics
+ al hacer estas pruebas, me doy cuenta de que el on error impide que la ventana de depuración aparezca. En un error "menor" por ejemplo un set focus inaccesible, está bien ya que no interfiere con el resto del programa, pero en un "gran" error, por ejemplo, buscar un word que no existe en la ruta indicada, hace falta que el programa se detenga ya que el resto del programa no podrá ejecutarse y sobre todo el usuario debe ser advertido de la imposibilidad de continuar
¿Hay alguna manera de diferenciar un error que no afecta al resto del programa de un error que paraliza totalmente el curso de las operaciones?
--
Cuando solo tenemos un martillo todos los problemas se asemejan a un clavo
He intentado... y no entendí en qué pista querías que me enfocara
al escribir estas 2 líneas, va al rapportdebug que hace bien su trabajo, pero después regresa al error y por lo tanto se muestra la ventana de depuración
He probado resume next en lugar de resume: funciona bien en el error de set focus que creé en un botón en visible=false, pero en el error del word que no existe (que escribí para simbolizar un error que impide el avance del código), ahí el next no sirve para nada lo que entiendo, pero no me ayuda... A menos que rehaga otro on error goto que llamaría a un sub con un mensaje y el cierre del archivo? ¿Eso se puede hacer?
al escribir estas 2 líneas, va al rapportdebug que hace bien su trabajo, pero después regresa al error y por lo tanto se muestra la ventana de depuración
He probado resume next en lugar de resume: funciona bien en el error de set focus que creé en un botón en visible=false, pero en el error del word que no existe (que escribí para simbolizar un error que impide el avance del código), ahí el next no sirve para nada lo que entiendo, pero no me ayuda... A menos que rehaga otro on error goto que llamaría a un sub con un mensaje y el cierre del archivo? ¿Eso se puede hacer?
Hola,
ir a buscar un word que no existe en la ruta indicada
probar antes de que exista por ejemplo:
Ok=Dir(rutas & Archivo)
Si Ok<>"" entonces continuamos, de lo contrario mensaje y salida
ir a buscar un word que no existe en la ruta indicada
probar antes de que exista por ejemplo:
Ok=Dir(rutas & Archivo)
Si Ok<>"" entonces continuamos, de lo contrario mensaje y salida
Hola f894009
sí, el word que no existe era solo un ejemplo, no sabía muy bien cómo provocar un error deliberadamente para ver si lo que escribía cumplía con lo que esperaba, así que modifiqué el nombre de un word.
Lógicamente en mi archivo esos nombres están escritos en duro, así que eso no ocurre, pero si el programa encuentra un bug con las mismas consecuencias, ¿cómo diferenciarlo de un bug sin consecuencias y cómo tratarlo (todavía no he aplicado la respuesta de yg_be)?
Confieso que estoy un poco perdido con los on error, intento documentarme, pero sigue siendo muy confuso y mientras tanto me adentro en detalles
y sobre todo estoy desanimado por este
sí, el word que no existe era solo un ejemplo, no sabía muy bien cómo provocar un error deliberadamente para ver si lo que escribía cumplía con lo que esperaba, así que modifiqué el nombre de un word.
Lógicamente en mi archivo esos nombres están escritos en duro, así que eso no ocurre, pero si el programa encuentra un bug con las mismas consecuencias, ¿cómo diferenciarlo de un bug sin consecuencias y cómo tratarlo (todavía no he aplicado la respuesta de yg_be)?
Confieso que estoy un poco perdido con los on error, intento documentarme, pero sigue siendo muy confuso y mientras tanto me adentro en detalles
y sobre todo estoy desanimado por este
TypeName(uf.ActiveControl)que no devuelve lo que espero y tampoco encuentro solución.. ¡no es mi día!
Re,
diferenciar un bug sin consecuencias y cómo tratarlo
Bueno, son ustedes quienes definen en caso de error la continuación a dar a nivel del código.
Si el error compromete el desarrollo del código para llegar a un resultado "normal", deben prever una salida que permita reiniciar sin registrar nada, advirtiendo que ha habido un error grave, o continuar aceptando cierto daño.
ej:
Se necesita el nombre del Frame para obtener el nombre del control activo.
Es lo mismo para Typename.
Dado que en su aplicación prácticamente solo hay frames, e incluso frames dentro de un frame, no va a ser sencillo de atar.
Esto, obviamente, además de los errores relacionados con los objetos UF.
Hasta ahora, no he tenido ningún error de VBA relacionado con el código. Para la parte de edición no puedo probar.
Voy a ver si puedo adaptar para continuar, de lo contrario destruiré su archivo.
diferenciar un bug sin consecuencias y cómo tratarlo
Bueno, son ustedes quienes definen en caso de error la continuación a dar a nivel del código.
Si el error compromete el desarrollo del código para llegar a un resultado "normal", deben prever una salida que permita reiniciar sin registrar nada, advirtiendo que ha habido un error grave, o continuar aceptando cierto daño.
ej:
n = UserForm1.Frame1.ActiveControl.Name
Se necesita el nombre del Frame para obtener el nombre del control activo.
Es lo mismo para Typename.
Dado que en su aplicación prácticamente solo hay frames, e incluso frames dentro de un frame, no va a ser sencillo de atar.
Esto, obviamente, además de los errores relacionados con los objetos UF.
Hasta ahora, no he tenido ningún error de VBA relacionado con el código. Para la parte de edición no puedo probar.
Voy a ver si puedo adaptar para continuar, de lo contrario destruiré su archivo.
Usted es quien define en caso de error la continuación a dar a nivel de código
según en qué sub o módulo, conociendo el grado de importancia del riesgo de bug debo hacer 2 subs diferentes y llamar a uno que reporte el bug sin interrumpir el programa y el otro que avise y cierre el archivo, ¿correcto?
No va a ser fácil de atar
lo más sencillo que he encontrado hasta ahora es añadir como parámetro el nombre del objeto
Esto, evidentemente, además de los errores relacionados con los objetos UF
no entendí la frase
Voy a ver si puedo adaptar para continuar, si no destruyo su archivo
¡Genial, muchas gracias por tomarse el tiempo de mirar, manténgame informado!
según en qué sub o módulo, conociendo el grado de importancia del riesgo de bug debo hacer 2 subs diferentes y llamar a uno que reporte el bug sin interrumpir el programa y el otro que avise y cierre el archivo, ¿correcto?
No va a ser fácil de atar
lo más sencillo que he encontrado hasta ahora es añadir como parámetro el nombre del objeto
Sub JournalDeClic(uf As UserForm, Objet As String)
Esto, evidentemente, además de los errores relacionados con los objetos UF
no entendí la frase
Voy a ver si puedo adaptar para continuar, si no destruyo su archivo
¡Genial, muchas gracias por tomarse el tiempo de mirar, manténgame informado!
¡Hola!
El informe de errores está en servicio, solo hay que esperar a ver qué resulta.
Agradezco nuevamente a f894009 por tomarse el tiempo de revisar mi archivo, pero no encontró ningún error debido al código en sí, si entendí bien.
El objetivo ahora es centrarse en los problemas de entorno que yg_be mencionó la semana pasada:
¿cómo se detectan? ¿cómo se tratan?
f894009 me dijo que mis líneas de código podían ser actualizadas por instrucciones más recientes que tendrían el mérito de mejorar los tiempos de ejecución: ¿es un parámetro que puede influir en los problemas de entorno?
Gracias de antemano por las posibles pistas de trabajo que me puedan proporcionar.
--
Cuando solo se dispone de un martillo, todos los problemas parecen un clavo.
El informe de errores está en servicio, solo hay que esperar a ver qué resulta.
Agradezco nuevamente a f894009 por tomarse el tiempo de revisar mi archivo, pero no encontró ningún error debido al código en sí, si entendí bien.
El objetivo ahora es centrarse en los problemas de entorno que yg_be mencionó la semana pasada:
¿cómo se detectan? ¿cómo se tratan?
f894009 me dijo que mis líneas de código podían ser actualizadas por instrucciones más recientes que tendrían el mérito de mejorar los tiempos de ejecución: ¿es un parámetro que puede influir en los problemas de entorno?
Gracias de antemano por las posibles pistas de trabajo que me puedan proporcionar.
--
Cuando solo se dispone de un martillo, todos los problemas parecen un clavo.
en el sub declaras pero en el código utilizas una variable declarada Ctl y luego encontramos Ctrl. Estamos de acuerdo en que no es intencionado, sino más bien un error tipográfico?
Para utilizar tu ejemplo, hay que llamar al procedimiento dando como argumento el nombre de la uf que queremos analizar, así que, no sabiendo de dónde proviene el bug, ¿hay que prever la llamada en cada sub de cada uf?