Necesito reorganizar y modificar macro para un botón activex de excel
Estoy pegado con la siguiente situación. Grabe una macro para filtrar datos de una tabla a otra pero resulta que quiero poner esa macro en un botón activex y no me la ejecuta de ninguna manera. Necesito ayuda para organizarla aquí les dejo el código que capto la grabadora de macros.
Range("DATOS").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "B7:T8"), CopyToRange:=Range("B14:T14"), Unique:=False Range("B8:T8").Select Selection.ClearContents Range("C8").Select
.15/11/16
Buenas tardes, Darwing
Si tienes activa la pestaña de DESARROLLADOR de donde creaste el botón ActiveX:
Verás que al elegir el elemento te deja en la barra de fórmulas una leyenda como la siguiente:
=INCRUSTAR("Forms.CommandButton.1";"")
Luego, si dás botón derecho del mouse sobre ese botón, podrás elegir la opción "Ver código" que te llevará al Editor de Visual Basic, donde te habrá dejado estas dos líneas:
Private Sub CommandButton1_Click() End Sub
Entre ellas puedes insertar tu código, quedando algo así como esto:
Private Sub CommandButton1_Click() Range("DATOS").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "B7:T8"), CopyToRange:=Range("B14:T14"), Unique:=False Range("B8:T8").ClearContents Range("C8").Select End Sub
Y debería funcionar.
Personalmente prefiero el otro tipo de botón donde le puedo asignar la rutina que desee.
Espero que funcione para ti.
Abrazo
Fer
.
Hola Fer!
Antes que nada gracias por la ayuda! Pues realice los pasos que mencionaste pero no me da resultado. Sigue dándome error de ejecución.
.
Entonces no es un problema del botón sino de la rutina.
Ayudaría saber qué mensaje de error te arroja, pero -sin saberlo- yo revisaría los rangos, en particular el que llamaste "DATOS",. Recuerda que debe iniciar en la fila de títulos, que todas las columnas tengan uno y que estos coinciden con los que usaste en los rangos de criterios y de extracción.
Fijate si está allí el problema.
Caso contrario, comparte el mensaje de error (y la línea) que arroja.
Abrazo
Fer
.
Hola Fer!
El error que arroja es el siguiente:
Se ha producido el error "1004" en tiempo de ejecución
ERROR EN EL MÉTODO 'RANGE' DE OBJETO '_WORKSHEETS'
Y esta es la linera de código
Range("DATOS").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _ "B7:T8"), CopyToRange:=Range("B14:T14"), Unique:=False
Otra cosa que mencionó es que cuando la ejecuto con botones de control de formulario corre de lo norma pero al pasarla a activex se da ese error que arriba cito.
Gracias de nuevo Fer.
.
Buenas, de nuevo
Dado que al insertar ese botón la rutina se aloja en el módulo de la hoja donde lo incrustaste es necesario indicarle que se trata de una rutina que se ejecuta en ella.
Para ello usa esta variante en la instrucción:
Private Sub CommandButton1_Click() With ActiveSheet .Range("DATOS").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range( _ "B7:T8"), CopyToRange:=.Range("B14:T14"), Unique:=False .Range("B8:T8").ClearContents .Range("C8").Select End With End Sub
o esta otra:
Private Sub CommandButton1_Click() With Me .Range("DATOS").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range( _ "B7:T8"), CopyToRange:=.Range("B14:T14"), Unique:=False .Range("B8:T8").ClearContents .Range("C8").Select End With End Sub
Si, aún así, se mantuviera el error -y supuesto que estuvieran correcto los rangos que usas- coloca tu rutina en un módulo y llamala desde este botón.
Private Sub CommandButton1_Click() Call <tu rutina> End Sub
Espero que alguna de estas resuelva el problema.
Un abrazo
Fer
.
Hola Fer!
Bueno te comento que no eh podido lograr el objetivo que quiero. Algo creo yo importantisimo que deje de mencionar es que esta macro la tengo en una hoja donde extraigo este filtro de otra hoja es decir, la macro esta en una hoja diferente al filtro avanzado.
La base de datos de donde saco el filtro se llama HOJA1 y donde los quiero plasmar se llama HOJA2.
Saludos!
.
Hola, Darwing
Pues sí: es un dato importante el que omitiste.
Es más, si lees el manual de MS Excel te dirá que no es posible. Las extracciones deben hacerse en la misma hoja de la base.
Pero le he encontrado una vuelta para hacerlo como solicitas.
Con los datos de tu rutina anterior, armé la siguiente variante.
Puedes probarla con tu botón ActiveX o colocarla en un módulo nuevo y llamarla desde ese botón:
Sub SacaDatos() '---- Variables modificables ---- '=== DARWING, modifica estos datos de acuerdo a tu proyecto: OutpAreaH = "B14:T14" 'Rango de la hoja actual, donde se extraen los datos CritAreaH = "B7:T8" 'Rango de criterios (en hoja actual, donde se extraen los datos) HojaSource = "Hoja1" 'Hoja donde está la base SourceAreaH = "DATOS" 'rango de la base de datos '---- fin Variables ' '---- Inicio de rutina ' HojaExtr = ActiveSheet.Name Sheets(HojaSource).Range(SourceAreaH).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range(CritAreaH), CopyToRange:=Range(OutpAreaH), Unique _ :=False Sheets(HojaExtr).Select Range(CritAreaH).ClearContents Range(OutpAreaH).Select End Sub
Como verás las direcciones están colocadas en variables al inicio del código por si necesitas modificarlas.
El rango de criterios y el de extracción deben, sí, estar en la hoja desde donde disparas la rutina.
Espero que esto resuelva tu problema.
Un abrazo
Fer
.
¡Gracias Fer!
Precisamente lo buscaba eres un genio. Te agradezco infinitamente tus ganas de ayudar a los que aprendemos día a día del inmenso mundo de Excel.
Saludos y bendiciones!
.
Me alegro, Darwing
Una pequeña corrección para que no te borre todo el rango de criterios sino sólo la línea de abajo de los títulos:
Sub SacaDatos() '---- Variables modificables ---- '=== DARWING, modifica estos datos de acuerdo a tu proyecto: OutpAreaH = "B14:T14" 'Rango de la hoja actual, donde se extraen los datos CritAreaH = "B7:T8" 'Rango de criterios (en hoja actual, donde se extraen los datos) HojaSource = "Hoja1" 'Hoja donde está la base SourceAreaH = "DATOS" 'rango de la base de datos '---- fin Variables ' '---- Inicio de rutina ' HojaExtr = ActiveSheet.Name Sheets(HojaSource).Range(SourceAreaH).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range(CritAreaH), CopyToRange:=Range(OutpAreaH), Unique _ :=False Sheets(HojaExtr).Select Range(B8:T8).ClearContents Range(OutpAreaH).Select End Sub
Abrazo
Fer
.
Usa esta variante:
Sub SacaDatos() '---- Variables modificables ---- '=== DARWING, modifica estos datos de acuerdo a tu proyecto: OutpAreaH = "B14:T14" 'Rango de la hoja actual, donde se extraen los datos CritAreaH = "B7:T8" 'Rango de criterios (en hoja actual, donde se extraen los datos) HojaSource = "Hoja1" 'Hoja donde está la base SourceAreaH = "DATOS" 'rango de la base de datos '---- fin Variables ' '---- Inicio de rutina ' HojaExtr = ActiveSheet.Name Sheets(HojaSource).Range(SourceAreaH).AdvancedFilter Action:=xlFilterCopy, _ CriteriaRange:=Range(CritAreaH), CopyToRange:=Range(OutpAreaH), Unique _ :=False Sheets(HojaExtr).Select Range("B8:T8").ClearContents Range(OutpAreaH).Select End Sub
- Compartir respuesta