VBA Excel: Mover entre pestañas filas que cumplan ciertas características

08/11/2008 - 15:47 por Alex | Informe spam
Hola:

Soy un inexperto en el manejo de VBA para Excel. Suelo grabar mis
macros con ratón y personalizarlas un poco luego con el editor de VB.

Estoy en la siguiente situación. Tengo una pestaña en la cual tengo
una matriz muy grande. Cada línea pertenece a un individuo distinto, y
en la cabecera de la matriz (esto es, en la primera fila de la matriz)
aparecen los títulos.

Imaginemos que los títulos son: Nombre, Edad, Población.

Lo que quiero es que los individuos que cumplan la condición de Edad 30 (esto es, que en la línea de dicho individuo aparezca el número 30
en la celda de la columna Edad), se borren de la matriz original y se
copien en otra pestaña que se llama Edad_30. Dicha pestaña Edad_30 ya
tiene copiada en ella el cabecero de la original (Nombre, Edad,
Población).

Para afrontar el problema de forma manual suelo aplicar filtros
automáticos en la cabecera de la matriz original, filtro los de Edad 30 y luego corto la matriz resultante y la pego en la pestaña Edad_30.
No he podido automatizar esto ya que en cada matriz de datos el primer
elemento que cumple la característica está una línea distinta.

¿Sabéis cómo se puede automatizar el proceso, ya sea con autofiltros o
con otro sistema?

Gracias de antemano

Preguntas similare

Leer las respuestas

#1 Héctor Miguel
09/11/2008 - 03:16 | Informe spam
hola, Alex !

"imaginemos" que trabajas sobre la "hoja activa" y que el listado se inicia en la celda [A1]
"imaginamos" que el cabecero de "Edad" se encuentra en la celda [B1] (esto es, el segundo elemento de filtros)

te serviria una macro +/- como la siguiente:

Sub Mover_a_Otra_hoja()
Dim Edad As Byte
Edad = 30
Application.ScreenUpdating = False
With ActiveSheet
If Application.CountIf(Range("b:b"), Edad) Then
.Range("a1").AutoFilter 2, Edad
With .AutoFilter.Range
With .Offset(1).Resize(.Rows.Count - 1)
.Copy Worksheets("edad_" & Edad).Range("a65536").End(xlUp).Offset(1)
.EntireRow.Delete
End With
End With
.AutoFilterMode = False
Else
MsgBox "No existen elementos de: " & Edad
End If
End With
End Sub

si cualquier duda (o informacion adiiconal)... comentas ?
saludos,
hector.

__ OP __
... Tengo una pestana en la cual tengo una matriz muy grande.
Cada linea pertenece a un individuo distinto, y en la cabecera de la matriz (esto es, en la primera fila de la matriz) aparecen los titulos.
Imaginemos que los titulos son: Nombre, Edad, Poblacion.
Lo que quiero es que los individuos que cumplan la condición de Edad = 30
(esto es, que en la linea de dicho individuo aparezca el numero 30 en la celda de la columna Edad)
se borren de la matriz original y se copien en otra pestana que se llama Edad_30.
Dicha pestana Edad_30 ya tiene copiada en ella el cabecero de la original (Nombre, Edad, Poblacion).
Para afrontar el problema de forma manual suelo aplicar filtros automaticos en la cabecera de la matriz original
filtro los de Edad = 30 y luego corto la matriz resultante y la pego en la pestana Edad_30.
No he podido automatizar esto ya que en cada matriz de datos el primer elemento que cumple la caracteristica esta una linea distinta.
Sabeis como se puede automatizar el proceso, ya sea con autofiltros o con otro sistema?
Respuesta Responder a este mensaje
#2 Alex
09/11/2008 - 12:32 | Informe spam
¡¡Muchas gracias Héctor, funciona perfectamente!!

Sólo hay una pregunta que me gustaría hacerte. En la hoja de datos
original, antes de extraer los individuos que cumplen Edad = 30,
dichos cabeceros ya están con el autofiltro aplicado en sus cabeceras.
Después de extraer los de Edad = 30, deberé extraer alguno más, pero
al aplictar tu macro, después de extraer los de Edad = 30, en los
datos originales ya no hay autofiltros, con lo cual debo volvera a
aplicarlos.

Se que podría volver a añadirlos con sencillo código:

Sheets("Edad_30").Select
Rows("1:1").Select
Selection.AutoFilter

pero me gustaría saber si podría hacer que al terminar tu macro los
autofiltros perdurasen, en vez de metiendo más código y por tanto
dificultando el entendimiento, quitándolo (quitar las líneas de tu
código que quitan el autofiltro de las cabeceras después de la
extracción)

Gracias una vez más y saludos.

Alex

On 9 nov, 03:16, "Héctor Miguel"
wrote:
hola, Alex !

"imaginemos" que trabajas sobre la "hoja activa" y que el listado se inicia en la celda [A1]
"imaginamos" que el cabecero de "Edad" se encuentra en la celda [B1] (esto es, el segundo elemento de filtros)

te serviria una macro +/- como la siguiente:

Sub Mover_a_Otra_hoja()
  Dim Edad As Byte
  Edad = 30
  Application.ScreenUpdating = False
  With ActiveSheet
    If Application.CountIf(Range("b:b"), Edad) Then
      .Range("a1").AutoFilter 2, Edad
      With .AutoFilter.Range
        With .Offset(1).Resize(.Rows.Count - 1)
          .Copy Worksheets("edad_" & Edad).Range("a65536").End(xlUp).Offset(1)
          .EntireRow.Delete
        End With
      End With
      .AutoFilterMode = False
    Else
      MsgBox "No existen elementos de: " & Edad
    End If
  End With
End Sub

si cualquier duda (o informacion adiiconal)... comentas ?
saludos,
hector.

__ OP __

Respuesta Responder a este mensaje
#3 Héctor Miguel
09/11/2008 - 23:25 | Informe spam
hola, Alex !

1) no se si preguntas por poner/preservar/.. autofiltros en la hoja "original" y/o tambien en la/s hoja/s de resumen -?-
- si las hojas de resumen tienen autofiltros, el codigo propuesto ni siquiera "los toca", por lo que deberan preservarse

2) los autofiltros en la hoja "original", crei entender que solo eran necesarios para la extraccion de la edad solicitada a "su resumen"
por lo que pensaba en aplicar un inputbox para que el usuario provea el numero (edad) de la que requiere su extraccion -?-
(que ademas le daria mayor "flexibilidad" al uso de una sola macro y no una por cada edad) ;)

3) si prefieres mantener los autofiltros en la hoja "original", solo cambia estas instrucciones:

de:
End With
.AutoFilterMode = False
Else

a:
End With
.Range("a1").AutoFilter 2
Else

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ OP __
... En la hoja de datos original, antes de extraer... dichos cabeceros ya estan con el autofiltro aplicado ...
... debere extraer alguno mas, pero al aplictar tu macro, despues de extraer... ya no hay autofiltros, con lo cual debo volvera a aplicarlos.
Se que podría volver a añadirlos con sencillo codigo:

Sheets("Edad_30").Select
Rows("1:1").Select
Selection.AutoFilter

pero me gustaria saber si podría hacer que al terminar tu macro los autofiltros perdurasen
en vez de metiendo mas codigo y por tanto dificultando el entendimiento
quitandolo (quitar las líneas de tu codigo que quitan el autofiltro de las cabeceras despues de la extraccion) ...
Respuesta Responder a este mensaje
#4 Alex
10/11/2008 - 19:13 | Informe spam
Hola Héctor:

La hoja "original" sí tiene los autofiltros, y deseo que los conserve
al final del proceso.

El nuevo código que me mandas funciona perfectamente, ¡¡¡muchas
gracias!!!, me has ayudado mucho.

Un abrazo,

Alex

On 9 nov, 23:25, "Héctor Miguel"
wrote:
hola, Alex !

1) no se si preguntas por poner/preservar/.. autofiltros en la hoja "original" y/o tambien en la/s hoja/s de resumen    -?-
    - si las hojas de resumen tienen autofiltros, el codigo propuesto ni siquiera "los toca", por lo que deberan preservarse

2) los autofiltros en la hoja "original", crei entender que solo eran necesarios para la extraccion de la edad solicitada a "su resumen"
    por lo que pensaba en aplicar un inputbox para que el usuario provea el numero (edad) de la que requiere su extraccion    -?-
    (que ademas le daria mayor "flexibilidad" al uso de una sola macro y no una por cada edad)    ;)

3) si prefieres mantener los autofiltros en la hoja "original", solo cambia estas instrucciones:

de:
      End With
      .AutoFilterMode = False
    Else

  a:
      End With
      .Range("a1").AutoFilter 2
    Else

si cualquier duda (o informacion adicional)... comentas ?
saludos,
hector.

__ OP __
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida