Macro para que se cumpla una condición copiando y pegando columna por columna a una columna específica.

Tengo muchas columnas con datos las cuales deben evaluarse en la columna "A", de cumplirse la condición debe abrir una hoja nueva copiar y pegar en columna "A" dicha columna, seguir buscando y cada vez que vuelva a cumplir la condición copiar y pegar en la siguiente columna de la hoja nueva, así hasta que ya no queden más columnas por leer.

1 Respuesta

Respuesta
1

Bienvenido a TodoExpertos.

¿Cuál es la condición?

Podrías poner una imagen con un ejemplo de tus datos, sin son datos confidenciales puedes remplazar con datos genéricos. De acuerdo a la imagen que pongas, explica cuáles columnas deberás ser copiadas a la nueva hoja.

Ejemplo de una imagen:

Gracias por responder, aquí un pequeño resumen de lo que necesito todas las columnas datos que están situadas originalmente en la F fila 9910 con hasta 120 filas las copio a la columna A en la fila 9897, esta es evaluada donde la condición debe ser ¨mayor que¨, cuando es mayor que copio y pego esa columna incluyendo el resultado de la condición en otra hoja.

La cantidad de columna son infinitas, es por ello que necesito una macro que copie y pegue cada columna en donde debe ser evaluada y cuando cumpla la condición abrir una nueva hoja y que cada ves que se cumpla copie esa columna en la la hoja nueva o ya preestablecida en la columna de la derecha que se encuentre vacía.

Podrías explicarlo pero siguiendo tus datos de ejemplo de la imagen.

1. Supongo que empiezas en la hoja2.

2. Copias las celdas del rango F9910:F10030

3. Pegas en la celda A9897

4. Supongo que en la celda A13 tienes una fórmula. ¿Si el resultado de la fórmula es? ¿Mayor qué? (Podrías ser más específico), entre más claros sean tus ejemplos, más fácil podré entender y ayudarte con la macro.

5. Si la condición se cumple, entonces copiar el rango F9910:¿F10030 y pegar en dónde? Ddbes decir, en dónde pegar, hoja, fila, columna, recuerda ser específico, no conocemos tus datos, así que no obvies ninguna información, es obvio para ti, ya que conoces tus datos y los estás viendo, pero nosotros solamente nos guiamos con lo que tú muestres.

6. La columna inicial para empezar a copiar es la F o la C. En tu imagen es la columna C, pero en tu explicación pusiste la F. También tu imagen debe ser coherente con tus explicaciones.

En la hoja2, en la fila 9910 empiezan los datos, ¿cómo sabré cuándo detener las copias? Reviso la celda G9910 si tiene dato copio la columna, repito los pasos, paso a la celda H9910, ¿si la celda está vacía entonces ya no copio la columna?

Cometí un error en el ejemplo donde lo puse en la hoja 1 cuando en realidad es hoja 2.

Primero te explico según el ejemplo que envié y luego te doy los datos reales a sustituir por el del ejemplo ya que el real no me cabe en la foto.

Tengo datos en la hoja2 a partir de C14:23 que quiero copiar en A14:23 de cumplirse la condición A13 "mayor que" copiar A13:23 donde incluyo el valor de la condición en la hoja 1 a partir de la columna A en fila 1, luego seguir copiando la siguiente columna de datos de la hoja2 D14:23 en A14:23, y así sucesivamente hasta que la columna H,I,J...BB se encuentre vacía entonces dejar de copiar y cada vez que se haya cumplido la condición copiar en la hoja1 en la primera columna vacía que encuentre a partir de fila 1 A13:23 de la hoja2.

Los datos de ejemplo a sustituir por reales

*La condición A13 por B9896 (el valor de la condición la puedo variar así que entraría en la macro y le doy un nuevo valor, por el momento es mayor que 399. 

*A14:23 por B9897:10017

*C14:23 por F9910:10030    D14:23 por G9910:10030  H9910:10030........

Espero lo puedas entender.

Gracias.

B9897:10017

*C14:23 por F9910:

En cuál fila están los datos en 9897 o en 9910, por eso es importante la imagen.

Obviamente no espero una imagen de toda la hoja, solamente de los datos relevantes:

Como puedes apreciar en la imagen se ven las columnas y las filas. Claramente puedo ver que los datos en la columna B empiezan en la fila 9897.

¿Cada columna tiene un inicio diferente de fila? Podrías ser más claro en esta parte.


El proceso ya me quedó claro, copio datos, los pego, verifico el resultado en una celda, si se cumple entonces copio y pego.

Pero lo importante es saber en dónde están los datos que voy a copiar.


Esperando que sea un error en la captura y que todos los datos empiezan en la fila 9897.

Prueba la siguiente macro:

Sub CopiarColumna()
'Por Dante Amor
  Dim sh1 As Worksheet, sh2 As Worksheet
  Dim i As Long, lc1 As Long, lc2 As Long
  '
  Set sh1 = Sheets("Hoja1")
  Set sh2 = Sheets("Hoja2")
  '
  lc1 = 1
  lc2 = sh2.Cells.Find("*", , xlValues, xlPart, xlByColumns, xlPrevious).Column
  For i = 2 To lc2
    sh2.Range("A9897").Resize(120).Value = sh2.Cells(9897, i).Resize(120).Value
    If sh2.Range("A9896").Value > 399 Then
      sh1.Cells(1, lc1).Resize(121).Value = sh2.Range("A9896").Resize(121).Value
      lc1 = lc1 + 1
    End If
  Next
  MsgBox "Fin"
End Sub

He probado la macro y no me ha funcionado, los datos a copiar en la columna  B9897:10017 están a partir de la columna F9910:10030 en adelante y de ser B9896 mayor que 399 copiar y pegar los valores B9896:10017 en la hoja1 en la primera columna vacía que encuentre en este caso seria la A1, cuando se cumpla otra condición copiar y pegar en la hoja 1 en B1 y así sucesivamente hasta encontrar una columna de datos vacía.

Habías puesto esto:

Tengo datos en la hoja2 a partir de C14:23

Y ahora esto:

F9910:10030

Es difícil seguirte; y por supuesto, la macro no va a funcionar, como te comenté anteriormente:

Pero lo importante es saber en dónde están los datos que voy a copiar.


Prueba esto:

Sub CopiarColumna()
'Por Dante Amor
  Dim sh1 As Worksheet, sh2 As Worksheet
  Dim i As Long, lc1 As Long, lc2 As Long, lr As Long
  '
  Application.ScreenUpdating = False
  Set sh1 = Sheets("Hoja1")
  Set sh2 = Sheets("Hoja2")
  '
  lc1 = 1
  For i = 6 To sh2.Cells(9910, Columns.Count).End(1).Column
    lr = sh2.Cells(Rows.Count, i).End(3).Row
    sh2.Range(sh2.Cells(9910, i), sh2.Cells(lr, i)).Copy
    sh2.Range("B9897").PasteSpecial xlPasteValues
    If sh2.Range("B9896").Value > 399 Then
      sh2.Range("B9896", sh2.Range("B" & Rows.Count).End(3)).Copy
      sh1.Cells(1, lc1).PasteSpecial xlPasteValues
      lc1 = lc1 + 1
    End If
  Next
  Application.ScreenUpdating = False
  Application.CutCopyMode = False
  MsgBox "Fin"
End Sub

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas