Hola que tal compañeros, bien lo que necesito hacer es una macro que cada vez que se ejecute filtre segun el dato principal de una columna, por ejemplo tengo una columna que se llama clase, esa columna divide todos los datos en clases, ya sea en 10, 20 o cualquier cantidad de clases, hacer aqui una macro que filtre de uno por uno no se me hizo tan complicado ya que las clases avanzan de uno en uno, pero por ejemplo si tengo otra columna con datos diferentes y no corridos, como le hago para caturar los datos que contiene esa columna y asi cada vez que ejecute la macro se vaya filtrando el siguiente valor.
se que se escucha muy confuso asi que pondre el codigo de lo que les comento de las clases, esta macro va filtrando de valor en valor cada vez que se ejecuta:
Public rng, val, fin, Lcol, paq1 As Integer
Sub ClassChangeNext()
'
' ClassOrganizer Macro
'
' Keyboard Shortcut: Ctrl+Shift+L
'
Dim classNo, valorbuscado As String
Dim res As Range
cond = "class"
val = 1
'Esta linea es solo para identificar la ultima columna con datos
Lcol = Range("XFD1").End(xlToLeft).Cells.Row
'Aqui busca la columna que contiene el valor class
Set res = Range("A1:XFD1").Find(cond, , xlValues, xlWhole, xlByColumns, xlNext, False, , False)
If res Is Nothing Then
MsgBox "No se encontraro la columna class!"
Else
' esta linea hace el match con la columna class y la guarda en una variable para despues hacer el filtro
paq1 = Evaluate("match(""class"",1:1,0)")
Call check
Call ContadorClass
'esta variable guarda el valor de la clase que se va a filtrar
classNo = rng
'y aqui se filtra el valor de la clase
ActiveSheet.Range("A1" & Lcol).AutoFilter Field:=paq1, Criteria1:=classNo
'returns variables to 0 when it's over
If rng > fin Then
rng = 0
fin = 0
ActiveSheet.Range("A1" & Lcol).AutoFilter Field:=paq1
MsgBox "Se terminaron las clases"
End If
End If
End Sub
Private Sub ContadorClass()
'Update
'este sub, checa el numero de la clase en la que va, si es 0 le asigna un uno y asi se filtra la primera clase
If rng = 0 Then
rng = val
Else
rng = rng + 1
End If
End Sub
Private Sub check()
'Este sub checa cual es el ultimo numero de clase, para asi poder detener la macro cuando se hayan terminado las clases que existen
'Si la variable ya esta inicializada se salta al siguiente paso
If fin = 0 Then
ending = Range("B" & ActiveSheet.Rows.CountLarge).End(xlUp).Cells.Row
fin = Range("B" & ending).value
End If
End Sub
Como ven pues aqui con esta macro, cada vez que la ejecutas se filtra por el numero de clase, primero 1, la ejecutas y luego el 2, y luego 3 y asi sucesivamente, a mi lo que me gustaria es, en caso de que no sean los numeros continuos como le haria?, porque si lo dejo asi y el numero no se encuentra en la columna digamos un 5 pero si se encuentra un 6, en el 5 se filtra nada y eso podria ser confuso para el usuario, entonces me gustaria saber si hay alguna manera de evaluar los valores de la columna y asi saber por cual numero debe filtrar enseguida, espero se entienda a que quiero llegar y sobre todo puedan ayudarme.
muchas gracias de antemano!
Featured Replies
Archivado
Este tema está ahora archivado y está cerrado a más respuestas.
Hola que tal compañeros, bien lo que necesito hacer es una macro que cada vez que se ejecute filtre segun el dato principal de una columna, por ejemplo tengo una columna que se llama clase, esa columna divide todos los datos en clases, ya sea en 10, 20 o cualquier cantidad de clases, hacer aqui una macro que filtre de uno por uno no se me hizo tan complicado ya que las clases avanzan de uno en uno, pero por ejemplo si tengo otra columna con datos diferentes y no corridos, como le hago para caturar los datos que contiene esa columna y asi cada vez que ejecute la macro se vaya filtrando el siguiente valor.
se que se escucha muy confuso asi que pondre el codigo de lo que les comento de las clases, esta macro va filtrando de valor en valor cada vez que se ejecuta:
Public rng, val, fin, Lcol, paq1 As Integer Sub ClassChangeNext() ' ' ClassOrganizer Macro ' ' Keyboard Shortcut: Ctrl+Shift+L ' Dim classNo, valorbuscado As String Dim res As Range cond = "class" val = 1 'Esta linea es solo para identificar la ultima columna con datos Lcol = Range("XFD1").End(xlToLeft).Cells.Row 'Aqui busca la columna que contiene el valor class Set res = Range("A1:XFD1").Find(cond, , xlValues, xlWhole, xlByColumns, xlNext, False, , False) If res Is Nothing Then MsgBox "No se encontraro la columna class!" Else ' esta linea hace el match con la columna class y la guarda en una variable para despues hacer el filtro paq1 = Evaluate("match(""class"",1:1,0)") Call check Call ContadorClass 'esta variable guarda el valor de la clase que se va a filtrar classNo = rng 'y aqui se filtra el valor de la clase ActiveSheet.Range("A1" & Lcol).AutoFilter Field:=paq1, Criteria1:=classNo 'returns variables to 0 when it's over If rng > fin Then rng = 0 fin = 0 ActiveSheet.Range("A1" & Lcol).AutoFilter Field:=paq1 MsgBox "Se terminaron las clases" End If End If End Sub Private Sub ContadorClass() 'Update 'este sub, checa el numero de la clase en la que va, si es 0 le asigna un uno y asi se filtra la primera clase If rng = 0 Then rng = val Else rng = rng + 1 End If End Sub Private Sub check() 'Este sub checa cual es el ultimo numero de clase, para asi poder detener la macro cuando se hayan terminado las clases que existen 'Si la variable ya esta inicializada se salta al siguiente paso If fin = 0 Then ending = Range("B" & ActiveSheet.Rows.CountLarge).End(xlUp).Cells.Row fin = Range("B" & ending).value End If End Sub
Como ven pues aqui con esta macro, cada vez que la ejecutas se filtra por el numero de clase, primero 1, la ejecutas y luego el 2, y luego 3 y asi sucesivamente, a mi lo que me gustaria es, en caso de que no sean los numeros continuos como le haria?, porque si lo dejo asi y el numero no se encuentra en la columna digamos un 5 pero si se encuentra un 6, en el 5 se filtra nada y eso podria ser confuso para el usuario, entonces me gustaria saber si hay alguna manera de evaluar los valores de la columna y asi saber por cual numero debe filtrar enseguida, espero se entienda a que quiero llegar y sobre todo puedan ayudarme.
muchas gracias de antemano!