¿Como hago para seleccionar rango de celdas y filtrar?

Esta es la macro que tengo hecha, pero necesita unos pequeños cambios(eso creo).

'aquí selecciono las columnas que no me interesan para borrarlas y configuro el tamaño de las celdas para que se vea el contenido de las mismas.

Range("A:H,J:K,M:P,R:R,T:U,X:Z").Select
Range("X1").Activate
Selection.Delete Shift:=xlToLeft
Cells.Select
Cells. EntireColumn. AutoFit

'aquí necesito eliminar los datos duplicados según el criterio de la columna 3 pero el problema es que el rango es variable y no llega hasta la fila 65 siempre ¿cómo puedo cambiar eso? He pensado con .End(xlUp) pero no se como ponerlo

ActiveSheet.Range("$A$1:$Y$65").RemoveDuplicates Columns:=3, Header:=xlNo

'aquí me ocurre lo mismo que en el anterior, quiero filtrar pero el rango no es hasta e65 o f65 sino que es hasta que ya no existan filas con más datos

ActiveWorkbook. Worksheets("f170210192537-2310"). Sort. SortFields. Clear
ActiveWorkbook.Worksheets("f170210192537-2310").Sort.SortFields.Add Key:= _
Range("E1:E65"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Worksheets("f170210192537-2310").Sort.SortFields.Add Key:= _
Range("F1:F65"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Worksheets("f170210192537-2310").Sort
.SetRange Range("A1:Y65")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
. Apply

En resumidas cuentas, lo que estoy haciendo es coger sólo las columnas que me interesan, luego selecciono el rango de filas que tengan datos, aplico un filtro por la columna 3 y 4 y por último(en este código no esta porque me he centrado en la selección y filtro) añado una formula que al arrastrar debe copiarse hasta la ultima fila que contenga datos.

Muchas gracias y disculpen por todo lo pedido pero me estoy volviendo loca con eso.

3 respuestas

Respuesta
1

Puedes adjuntar tu archivo a [email protected]

Para fihjar la ultima celd a con informacion es con una variable

Ejemplo

Fin=Range("D"& Rows.count).End(XlUp).row

En este caso quiero que determine la ultima celda con datos de la columna D, pero tu lo puedes adaptar según tus necesidades y en las partes donde usas la celda 65 lo puedes sustituir por ejemplo en lugar de

Range("F1:F65"),, puedes usar Range("F1:F"&Fin)

¡Gracias! Lo probaré,tendré que crear varias variables para guardar el final de cada columna.por ejemplo.

fecha=Range("E"& Rows.count).End(xlup).row

Hacer lo mismo con la columna f y luego sustituir las variables en la línea de código correspondiente

Basta con uno, no tienes por que crear para cada columna, si gustas enviame tu archivo a mi correo,

lo que hace Range("E"& Rows.count).End(xlup).row

Es determinar la ultima celda con información, de abajo hacia arriba, por ejemplo son 7 la celdas que tienes en la columna "E", el dato 7, lo puedes ocupar para cuando vayas a indicarle alguna otra instrucción en otra columna diferente, por ejemplo veo que en tu primera linea ocupas ActiveSheet.Range("$A$1:$Y$65")

En lugar de ello puedes hacer esto ActiveSheet.Range("A1:Y" & fin)

Respuesta
1

H o l a : Te anexo el código actualizado:

Sub Macro_Ordenar()
    'eliminar columnas
    Range("A:H,J:K,M:P,R:R,T:U,X:Z").Delete Shift:=xlToLeft
    Cells.EntireColumn.AutoFit
    '
    'Obtener la última fila con datos
    u = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
    'eliminar los datos duplicados según el criterio de la columna 3
    ActiveSheet.Range("A1:Y" & u).RemoveDuplicates Columns:=3, Header:=xlNo
    '
    'Obtener nuevamente la última fila, porque se eliminaron los duplicados
    u = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
    'Ordenar
    With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("E1:E" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("F1:F" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A1:Y" & u)
        .Header = xlGuess
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Avísame si necesitas ayuda con el filtro y poner la fórmula.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

¡Gracias! hace lo que necesito pero el problema es que los títulos de las columnas quedan a lo último, es decir después de la ultima fila con datos.

Desaparecen las flechas de los desplegables del filtro.No sé por qué.

La ultima columna"diferencia horaria" es donde va la formula, que hace la resta de la 3 celda de la columna "hora" con la celda 2 de la misma columna, luego restar la 4 con la 3 y así sucesivamente hasta que no existan más celdas con datos.

Adjunto una captura de como debe ser el resultado final.

Un saludo y muchas gracias.

En tu macro aparecen estas instrucciones:

Header:=xlNo
.Header = xlGuess

Significa que no tienes títulos.

Entonces, si tienes títulos, tienes que ponerlo de esta forma:

Sub Macro_Ordenar()
'Act.Por.Dante Amor
    'eliminar columnas
    Range("A:H,J:K,M:P,R:R,T:U,X:Z").Delete Shift:=xlToLeft
    Cells.EntireColumn.AutoFit
    '
    'Obtener la última fila con datos
    u = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
    'eliminar los datos duplicados según el criterio de la columna 3
    ActiveSheet.Range("A1:Y" & u).RemoveDuplicates Columns:=3, Header:=xlYes
    '
    'Obtener nuevamente la última fila, porque se eliminaron los duplicados
    u = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
    'Ordenar
    With ActiveSheet.Sort
        .SortFields.Clear
        .SortFields.Add Key:=Range("E2:E" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SortFields.Add Key:=Range("F2:F" & u), SortOn:=xlSortOnValues, _
            Order:=xlAscending, DataOption:=xlSortNormal
        .SetRange Range("A1:Y" & u)
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    With Range("G2:G" & u)
        .FormulaR1C1 = "=R[1]C[-1]-RC[-1]"
        '.Value = .Value
    End With
End Sub

La última parte de la macro es para poner las fórmulas.

sal u dos

¡Gracias! doy por solucionado el tema ;),pego el código con lo que he añadido por si a alguien le interesa.

Lo nuevo que añadí es colorear las filas según la condición expuesta en una celda.

'eliminar columnas
Range("A:H,J:K,M:P,R:R,T:U,X:Z").Delete Shift:=xlToLeft
Cells.EntireColumn.AutoFit
'
'Obtener la última fila con datos
u = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
'eliminar los datos duplicados según el criterio de la columna 3
ActiveSheet.Range("A1:Y" & u).RemoveDuplicates Columns:=3, Header:=xlYes
'
'Obtener nuevamente la última fila, porque se eliminaron los duplicados
u = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).Row
'Ordenar
With ActiveSheet.Sort
.SortFields.Clear
.SortFields.Add Key:=Range("E2:E" & u), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SortFields.Add Key:=Range("F2:F" & u), SortOn:=xlSortOnValues, _
Order:=xlAscending, DataOption:=xlSortNormal
.SetRange Range("A1:Y" & u)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
With Range("G2:G" & u)
.FormulaR1C1 = "=R[1]C[-1]-RC[-1]"
'.Value = .Value
End With
'agrego flechas de filtro y coloreado
'ActiveCell.FormulaR1C1 = "diferencia horaria"
Range("I3").Select
ActiveCell.FormulaR1C1 = "limite"
Range("I4").Select
ActiveCell.FormulaR1C1 = "0:25:00"
Range("A1:G1").Select
Selection.AutoFilter
Range("A2:G" & u).Select
'ActiveWindow.SmallScroll Down:=-33
Cells.FormatConditions.Delete
Range("A2:G" & u).Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=$G2>$I$4"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False
Range("G2").Select

Respuesta
1

Este ejemplo que busca en base de datos mientra se escribe en textbox. Utiliza un filtrado de hoja

http://www.programarexcel.com/2015/08/buscar-datos-medida-que-se-escribe-en.html?m=1 

¡Gracias! Realmente lo que busco es automatizar todo, pues imagínate que tenga que mirar más de 20 archivos con diferentes datos.

No es lo mismo escribir para filtrar, que con un atajo de teclado dejarlo todo hecho.

Aun así, te agradezco el darme otra solución😉

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas