Copiar celdas de una hoja a otra dependiendo de valores

Hoy me he levantado y he seguido con mi rutina diaria: desayunar, café y mirar estadísticas de la web, últimos suscriptores y comentarios y dudas… y me ha llamado una especialmente la atención y es por eso que escribo esto.

La duda es relativamente sencilla: copiar ciertos valores de una hoja, dependiendo de una serie de parámetros, a otra hoja. Para poder explicar esta duda de manera sencilla vamos a poner un ejemplo de como copiar celdas de una hoja a otra dependiendo de valores.

copiar celdas de una hoja a otra

Ejemplo

En la hoja “Datos” de un libro tenemos tres parámetros en la columna B y tres columnas de datos: Col_A, Col_B y Col_D. Cuando se cumpla un escenario con los parámetros copiaremos una de las columnas, en otro escenario otra y así sucesivamente. La hoja donde vamos a copiar los datos será la hoja resultados y siempre lo copiaremos en la columna A.

Esquema de la solución

En programación en VBA hay que ser muy ordenado y para ello merece la pena escribirse en un papel los “pedacitos” de código de los que se compone el problema. En este caso, los pasos son los siguientes:

  • Guardar los parámetros en variables
  • Analizar las variables para saber en qué escenario nos encontramos
  • Desarrollar el evento resultante de cada escenario
  • Unir todas las partes.

Como la macro que queremos hacer en este caso no es muy compleja ni larga, la resolveremos toda en una misma macro sin utilizar otras macros auxiliares ni funciones.

Solución a copiar celdas de una hoja a otra dependiendo de valores

En la siguiente bloque de código vemos como se capturan los diferentes parámetros del ejemplo.

[codesyntax lang=”vb” lines=”no” container=”div” capitalize=”no” strict=”yes” blockstate=”expanded” doclinks=”0″]

param1 = Sheets("datos").Range("b1")
param2 = Sheets("datos").Range("b2")
param3 = Sheets("datos").Range("b3")

[/codesyntax]

Hacemos esto para poder trabajar más cómodamente con estos parámetros sin tener que hacer referencia constantemente a las celdas.

Después de esto, he construido el esqueleto de lo que quiero que haga. Es una condicional del tipo IF (ver más) que usamos para dirigir el código al lugar al que queramos una vez que hemos evaluado las condiciones.

[codesyntax lang=”vb” lines=”no” container=”div” capitalize=”no” strict=”yes” blockstate=”expanded” doclinks=”0″]

    If param1 = "OK" And param2 < 10 And param3 > 100 Then
        col = 6 'valor columna A
        N_columna = "A"
    ElseIf param1 = "OK" And param2 < 10 And param3 < 100 Then
        col = 7 'valor columna B
        N_columna = "B"
    Else
        col = 8 'valor columna C
        N_columna = "C"
    End If

[/codesyntax]

Finalmente, lo que tengo que hacer es crear un pequeño código para copiar los valores de cada columna en la columna A de la hoja “Resultados”. Esto lo haremos traspasando los valores de las celdas como en el cuadro siguiente donde el ejemplo seleccionado ha sido Col_C.

[codesyntax lang=”vb” lines=”no” container=”div” capitalize=”no” strict=”yes” blockstate=”expanded” doclinks=”0″]

Sheets("resultados").Range("A1:A11").Value = _
     Sheets("Datos").Range(Cells(1, col), Cells(11, col)).Value

[/codesyntax]

Finalmente uniendo todo esto y añadiendo un mensaje al final tendremos el siguiente código:

[codesyntax lang=”vb” lines=”no” container=”div” capitalize=”no” strict=”yes” blockstate=”expanded” doclinks=”0″]

Sub Copiar_Datos_con_parámetros()

Dim col, param2, param3 As Integer
Dim param1, N_columna As String

param1 = Sheets("datos").Range("b1")
param2 = Sheets("datos").Range("b2")
param3 = Sheets("datos").Range("b3")

    If param1 = "OK" And param2 < 10 And param3 > 100 Then
        col = 6 'valor columna A
        N_columna = "A"
    ElseIf param1 = "OK" And param2 < 10 And param3 < 100 Then
        col = 7 'valor columna B
        N_columna = "B"
    Else
        col = 8 'valor columna C
        N_columna = "C"
    End If
    
    'una vez que conozco la columna objetivo traspaso los valores a esta columna
        Sheets("resultados").Range("A1:A11").Value = _
            Sheets("Datos").Range(Cells(1, col), Cells(11, col)).Value


MsgBox "Hemos copiado la columna " & N_columna

End Sub

[/codesyntax]

Espero que te haya sido útil! Y ya sabes, no dudes en comentar si tienes dudas o necesitas alguna aclaración.

(Visited 36.137 times, 1 visits today)
Categorías VBA

Uso de cookies

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información ACEPTAR

Aviso de cookies