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

1 respuesta

Respuesta
1

.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

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas