Macro para copiar valores en rango dinámico según selector

Tengo la siguiente hoja de excel

Y necesito que los datos que están en la columna valor se copien según el selector. Es decir si en el selector esta el 2018 entonces los datos se deben copiar de enero a diciembre de 2018, si el selector esta en 2019 entonces en enero a diciembre de 2019.

1 respuesta

Respuesta
1

1. ¿El selector es un combobox de control activeX?

2. ¿En la fila 19 tienes fechas o textos?

3. ¿Los valores están en una tabla? ¿O es un rango de datos?

4. ¿En las filas inferiores tienes totales?

5. También hay que copiar la columna de Total 2018

6. Copio los datos y dime exactamente en dónde los quieres pegar: libro, hoja, celda.

Podrías responder brevemente cada duda en ese orden.

1. Si es un combobox de control activex

2. La fila 19 tiene meses con su año

3. Los valores se copiaran a partir de lo que se escriba en la columna valor

4. ¿A qué te refieres con filas interiores?

5. No, no hay que copiar datos de la columna de total

6. Los datos los quiero pegar en enero, febrero, marzo de cada año según el selector.

Ahora bien he conseguido copiar los datos sin problemas con este código:

Sub Copiar1()
'Macro para copiar desde la columna valor.
Application.ScreenUpdating = False
Dim año As Variant
año = Range("MO2").Value
Range("AN20").Select
If Range("AN19") <> "" Then
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 27
i = 20
If Range("AN19") <> "" Then
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 27
i = 20
If Range("MO2") = "Todos" Then
Do While Cells(i, "K") <> ""
For j = col To Cells(19, Columns.Count).End(xlToLeft).Column
If Cells(19, j) <> "Resultado" Then
If Cells(i, "N") <> "" Then
Cells(i, j) = Cells(i, "N")
End If
End If
Next
i = i + 1
Loop
End If
i = 20
' Do While Cells(i, "K") <> ""
' If Cells(i, "N") <> "" Then
' Cells(i, "N") = ""
' End If
' i = i + 1
' Loop
End If
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 27
i = 20
If Range("MO2") = "2018" Then
Do While Cells(i, "K") <> ""
For j = col To Cells(19, Columns.Count).End(xlToLeft).Column
If Cells(19, j) = "Resultado" Then
Exit For
End If
If Cells(i, "N") <> "" Then
Cells(i, j) = Cells(i, "N")
End If
'End If
Next
i = i + 1
Loop
End If
End If
' i = 20
' Do While Cells(i, "K") <> ""
' If Cells(i, "N") <> "" Then
' Cells(i, "N") = ""
' End If
' If i = 112 Then Stop
' i = i + 1
' Loop
If Range("MO2") = "2019" Then
Range("AN20").Select
If Range("AN19") <> "" Then
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 40
i = 20
If Range("MO2") = "2019" Then
Do While Cells(i, "K") <> ""
For j = col To Cells(19, Columns.Count).End(xlToLeft).Column
If Cells(19, j) = "Resultado" Then
Exit For
End If
If Cells(i, "N") <> "" Then
Cells(i, j) = Cells(i, "N")
End If
'End If
Next
i = i + 1
Loop
End If
End If
' i = 20
' Do While Cells(i, "K") <> ""
' If Cells(i, "N") <> "" Then
' Cells(i, "N") = ""
' End If
' i = i + 1
' Loop
End If
If Range("MO2") = "2020" Then
Range("AN20").Select
If Range("AN19") <> "" Then
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 53
i = 20
If Range("MO2") = "2020" Then
Do While Cells(i, "K") <> ""
For j = col To Cells(19, Columns.Count).End(xlToLeft).Column
If Cells(19, j) = "Resultado" Then
Exit For
End If
If Cells(i, "N") <> "" Then
Cells(i, j) = Cells(i, "N")
End If
'End If
Next
i = i + 1
Loop
End If
End If
' i = 20
' Do While Cells(i, "K") <> ""
' If Cells(i, "N") <> "" Then
' Cells(i, "N") = ""
' End If
' i = i + 1
' Loop
End If
If Range("MO2") = "2021" Then
Range("AN20").Select
If Range("AN19") <> "" Then
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 66
i = 20
If Range("MO2") = "2021" Then
Do While Cells(i, "K") <> ""
For j = col To Cells(19, Columns.Count).End(xlToLeft).Column
If Cells(19, j) = "Resultado" Then
Exit For
End If
If Cells(i, "N") <> "" Then
Cells(i, j) = Cells(i, "N")
End If
'End If
Next
i = i + 1
Loop
End If
End If
' i = 20
' Do While Cells(i, "K") <> ""
' If Cells(i, "N") <> "" Then
' Cells(i, "N") = ""
' End If
' i = i + 1
' Loop
End If
If Range("MO2") = "2022" Then
Range("AN20").Select
If Range("AN19") <> "" Then
Set b = Rows(19).Find("Valor", lookat:=xlWhole)
col = b.Column + 79
i = 20
If Range("MO2") = "2022" Then
Do While Cells(i, "K") <> ""
For j = col To Cells(19, Columns.Count).End(xlToLeft).Column
If Cells(19, j) = "Resultado" Then
Exit For
End If
If Cells(i, "N") <> "" Then
Cells(i, j) = Cells(i, "N")
End If
'End If
Next
i = i + 1
Loop
End If
End If
i = 20
Do While Cells(i, "K") <> ""
If Cells(i, "N") <> "" Then
Cells(i, "N") = ""
End If
i = i + 1
Loop
End If
Application.ScreenUpdating = True
End Sub

Este código lo que hace es copiar los datos de la columna valor según el año que se seleccione en el combobox.

El problema es que por ejemplo yo he hecho condiciones que dice If Range("MO2") = "2022" Then, esto porque tengo lincada en la celda MO2 el valor que eligen en el selector. Pero cuando ya no se necesite más el año 2022 es cuando viene el problema. Había pensado alguna forma de asignar algún numero a cada año así en lugar de colocar If Range("MO2") = "2022" Then colocaría If Range("MO2") = 1 Then y seria más dinámico, de la otra forma tendría que ir a cambiar las macros cada vez que vayan pasando los años. Hay alguna forma de decir por ejemplo IF combobox es = 1 entonces copia aquí.

Gracias

No entendí dónde pegar los datos.

Sigamos con tu ejemplo, en el combobox, seleccionas el año 2018, presionas el botón "Copiar"

En tu imagen de ejemplo veo que en la celda AO20 tienes el número 10, ese 10 se copia, ¿Y en dónde se pega?

O es al revés, en la celda N20 tienes un número 12, ese 12 se copia, ¿Y pega en la celda AO20?

Mejor explícame con imágenes y con colores; me dices qué dato vas a copiar y en dónde lo quieres pegar. Describe un par de ejemplos enero y febrero, procura que en las imágenes se vean las filas y las columnas de excel.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas