Macro que dispara otra

9 envíos / 0 nuevos
Último envío
Jose Antonio
Imagen de Jose Antonio
Offline
última acción: Hace 3 años 11 meses
alta: 25/11/2018 - 21:47
Puntos: 65
Macro que dispara otra

Hola a todos

Estoy creando un libro con varias hojas para la gestión de facturación, una de las hojas es para realizar la factura. Hay otra con la BD de clientes, otra donde se guardan los datos de las facturas etc…


En la hoja factura, en la celda donde se pone el tipo de IVA he hecho una validación para que solo pueda poner el 10% o el 21%. He creado una macro en la que al seleccionar el tipo 10% añada en la descripción o concepto de la factura un texto explicativo del tipo de IVA reducido. Después he creado una macro en la propia hoja factura para que cuando cambie la celda a 10% dispare la macro que pone la explicación del IVA en la factura. Hasta aquí funciona correctamente.

Otra de las cosas que se hace en el libro es guardar la hoja FACTURA en un directorio establecido como un libro normal (sin macros) y aquí tengo el problema, cuando ejecuto la macro que hace todas las operaciones para generar la factura y llega a las líneas de guardar la hoja FACTURA como nuevo libro en la ubicación, la macro hace algún cambio (sustituir formulas por valores) en la hoja nueva y se dispara la acción que verifica si hay cambio de tipo de IVA, como en la hoja nueva no encuentra la macro que añade la descripción del IVA salta un error: “Error de compilación: No se ha definido sub o función”  (supongo que no encuentra la macro).

He probado con On Error Resume Next

He probado a cambiar la hoja nueva de nombre y validar antes de llamar la macro.

Se que puedo disparar la macro manualmente con un botón pero me gustaría que fuera automático.

La macro que escribí para disparar la explicación del IVA es esta:

-------------------------------

Private Sub Worksheet_Change(ByVal Target As Range)

On Error Resume Next

If Not Intersect(Target, Range("valTIPOIVA")) Is Nothing Then

    If Range("valTIPOIVA") > 9 And Range("valTIPOIVA") < 11 And  ThisWorkbook.Sheets("FACTURA").Name <> ("FATURA") Then

        Call ExplicacionIVA

    End If

End If

End Sub

-------------------------------

Con este trozo de linea (And  ThisWorkbook.Sheets("FACTURA").Name <> ("FATURA") Then) pretendo que valide el nombre de la hoja para que solo se dispare la macro si el nombre de la hoja es FACTURA pero creo que no hace nada.

El problema me pasa en el libro que crea nuevo, en el inicial funciona correctamente.

Estoy iniciándome en las macros, las construyo ayudándome del grabador adaptándolas a mis necesidades, leyendo y viendo muchos video tutoriales.

Cualquier ayuda que me pudieran ofrecer se lo agradecería.

Perdón por tremenda chapa espero que se entienda.

Saludos.

Etiquetas: 

Cron
Imagen de Cron
Offline
última acción: Hace 7 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
No hace nada tu comprobación

No hace nada tu comprobación porque el nombre de la hoja

ThisWorkbook.Sheets("FACTURA") siempre será "FACTURA". ¡Lo estás poniendo dentro del paréntesis!

Imagino que lo que tú quieres hacer es algo como:

ActiveSheet.Name <> "FACTURA"

Un saludo

Jose Antonio
Imagen de Jose Antonio
Offline
última acción: Hace 3 años 11 meses
alta: 25/11/2018 - 21:47
Puntos: 65
SIGUE IGUAL

Gracias por tu ayuda Cron.

La linea que tu me propones parece mas lógica que lo que yo ponía, pero me sigue diparando la macro que en la hoja nueva no existe. Así que sigo atascado.

En el libro tengo los datos reales, voy a poner otros y subo la hoja a ver si viendolo en vivo me podeís ayudar.

Cuando tenga un rato la modifico y la subo.

No obstante muchas gracias.

Saludos,

 

Cron
Imagen de Cron
Offline
última acción: Hace 7 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Si la macro la tienes en un

Si la macro la tienes en un módulo (entiendo que sí, porque la has creado con el grabador de macros), debería funcionar en cualquier hoja. Creo que será mejor lo que comentas: intenta subir un libro con datos fake para que podamos ver cuál es el problema.

 

Un saludo

Jose Antonio
Imagen de Jose Antonio
Offline
última acción: Hace 3 años 11 meses
alta: 25/11/2018 - 21:47
Puntos: 65
Subiendo Archivo

Buenas,

Vaya por delante mi mas sincero agradecimiento por la ayuda prestada.

Si, tiene un modulo el 3.

Te paso copia del archivo en zip, en el incluyo las carpetas donde se van a guardar los archivos que genera.

Saludos

AdjuntoTamaño
Package icon Macro que dispara otra635.02 KB
Cron
Imagen de Cron
Offline
última acción: Hace 7 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Visto. Tu código funciona

Visto. Tu código funciona correctamente, salvo por una cosa. Cuando quieres comprobar si se cumplen varias condiciones, las separas con AND. Lo que ocurre es que AND tiene prioridad sobre los signos de igualdad o desigualdad. Es decir, si no utilizas paréntesis, te pongo debajo lo que escribes y lo que Excel está entendiendo:

If Range("valTIPOIVA") > 9 And Range("valTIPOIVA") < 11 And ActiveSheet.Name = "FACTURA" Then    --> Tu código

If ((Range("valTIPOIVA") > (9 And Range("valTIPOIVA"))) < (11 And ActiveSheet.Name)) = "FACTURA" Then    --> Lo que Excel interpreta

If (Range("valTIPOIVA") > 9) And (Range("valTIPOIVA") < 11) And (ActiveSheet.Name = "FACTURA") Then    --> Lo que tú quieres hacer


En la función del IVA también te pasa lo mismo en la línea:

If Range("AF29") >= 2 And uFilaDescrip < 53 Then

que debería ser

If (Range("AF29") >= 2) And (uFilaDescrip < 53) Then


Un saludo

 

Jose Antonio
Imagen de Jose Antonio
Offline
última acción: Hace 3 años 11 meses
alta: 25/11/2018 - 21:47
Puntos: 65
Creo que me he explicado mal...

Gracias por tu ayuda Cron

Creo que me he explicado mal...

Ya he hecho las modificaciones propuestas y si, funciona, cuando me posiciono en rango "valTIPOIVA" y se cumplen los criterios se dispara la macro: "ExplicacionIVA".

 

El problema es cuando genero la factura (mediante el botón en la hoja "FACTURA").

En ésta macro, entre otras, una de las cosas hace es copiar la hoja factura, le cambia el nombre a la hoja siendo el nombre de la nueva hoja el número de la factura que va a generar (por ej.: 09/2018). Crea la nueva hoja y le sigue haciendo modificaciones antes de guardar solo esa hoja en una carpeta.

 

Cuando va a comenzar las modificaciones me salta el error: "error de compilación: no se ha definido Sub o función" dentro de la macro que dispara a “ExplicacionIVA” y señala la siguiente línea: Call ExplicacionIVA.

 

Creo que una solución sería poder decirle que cuando copia la hoja "FACTURA" no incluya en la nueva hoja que genera la macro que va a disparar “ExplicacionIVA” pero no sé cómo podría hacerlo, lo he intentado con el grabador y nada.

Prueba a generar una factura y verás más claro esto que te explico.

 

Saludos, gracias y disculpa por el rollo que te estoy dando.

Cron
Imagen de Cron
Offline
última acción: Hace 7 meses 3 semanas
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Puedes hacer varias cosas. De

Puedes hacer varias cosas. De lo que se trata es de que no casque el error cuando haces la copia del libro.

Análisis: como copias la hoja, pero no el libro entero, pues se copian las funciones y subs que hay en la hoja, pero no las de los módulos. Al empezar a modificar cosas en el libro nuevo, salta la rutina Worksheet_Change, que llama a la función del IVA que está en un módulo. Como ese módulo ya no existe en este libro, pues te dice que de qué vas.

Se pueden hacer varias cosas.

1ª- Como el archivo lo vas a guardar de todas maneras, guárdalo sin macros primero y después modifica lo que quieras.

2ª- Antes de empezar a modificar cosas en la hoja nueva, llama a Application.EnableEvents = False

 

En cualquier caso, antes de guardar conviene que pongas la siguiente orden:

Application.DisplayAlerts = False

Y justo después de grabar, esto:

Application.DisplayAlerts = True

 

De esta manera evitas que Excel moleste al usuario preguntándole si quiere guardar el libro sin macros y bla bla bla.

Tras guardarlo, como ya no tiene macros, dejarán de saltarte los avisos.

Si optas por desactivar la opción EnableEvents, deberías volver a activarlos detrás de guardar tu libro. Por eso de ser ordenadito y de que salten las cosas que queremos que salten y tal.

 

Un saludo

Jose Antonio
Imagen de Jose Antonio
Offline
última acción: Hace 3 años 11 meses
alta: 25/11/2018 - 21:47
Puntos: 65
RESUELTO!!!

Buenas Cron,

Esa es la solución a mi problema, Application.EnableEvents=False/True.

No lo conocía asi como que AND tiene prioridad sobre el signo de = y <>.

Tampoco conocía Application.DisplayAlerts=False/True.

Me queda tanto por aprender..........

Mis macros corren ahora perfectamente sin interrupcion a no ser las progaramadas.  

GRACIAS CRON por tu inestimable ayuda, y a toda la comunidad de www.necesitomas.com por estar ahi.

Saludos,