Copia de valores uno por uno

ColdGeorge

Active Member
Joined
Aug 21, 2012
Messages
407
Office Version
  1. 2016
Platform
  1. Windows
Hola amigos

Tengo una lista de valores digamos en A1:A10, busco seleccionar tres valores y copiarlos, el primer valor seleccionado a digamos C1, el segundo valor a C3 y el tercer valor a C5, pensé que sería sencillo, utilicé este código:

Code:
For Each cell In Selection
    Sheets("pruebas").Range("C1, C3, C5") = cell.Value
Next cell

Pero únicamente copia el último valor a las celdas c1, c3 y c5, definitivamente que For/Next no me es útil, ¿cuál es la mejor manera de alcanzar mi objetivo? gracias por su ayuda, saludos.

ColdGeorge
 
Last edited:

Excel Facts

Why does 9 mean SUM in SUBTOTAL?
It is because Sum is the 9th alphabetically in Average, Count, CountA, Max, Min, Product, StDev.S, StDev.P, Sum, VAR.S, VAR.P.
Code:
Sub foo()

    Const c_strAddresses As String = "C1,C3,C5"
    
    Dim celSource   As Excel.Range, _
        vntTargAddr As Variant, _
        i%
    
    
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Let vntTargAddr = Split(c_strAddresses, ",")
    
    For i = LBound(vntTargAddr) To UBound(vntTargAddr)
        Sheets("Pruebas").Range(vntTargAddr(i)).ClearContents
    Next i
    
    Let i = LBound(vntTargAddr)
    
    
    For Each celSource In Selection.Cells
    
        If i <= UBound(vntTargAddr) Then
            Sheets("Pruebas").Range(vntTargAddr(i)) = celSource.Value
            Let i = i + 1
        End If
        
    Next celSource


End Sub
 
Upvote 0
Hola Greg

Tu código funciona perfectamente y ha sido de gran ayuda, muchas gracias. Sólo una cosa, ¿podrías comentar cómo es que funciona? saludos.

ColdGeorge


Code:
Sub foo()

    Const c_strAddresses As String = "C1,C3,C5"
    
    Dim celSource   As Excel.Range, _
        vntTargAddr As Variant, _
        i%
    
    
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Let vntTargAddr = Split(c_strAddresses, ",")
    
    For i = LBound(vntTargAddr) To UBound(vntTargAddr)
        Sheets("Pruebas").Range(vntTargAddr(i)).ClearContents
    Next i
    
    Let i = LBound(vntTargAddr)
    
    
    For Each celSource In Selection.Cells
    
        If i <= UBound(vntTargAddr) Then
            Sheets("Pruebas").Range(vntTargAddr(i)) = celSource.Value
            Let i = i + 1
        End If
        
    Next celSource


End Sub
 
Upvote 0
Code:
Sub foo()

    '// un listado de direcciones donde deseamos copiar
    '// delimitado por coma.
    Const c_strAddresses As String = "C1,C3,C5"
    
    Dim celSource   As Excel.Range, _
        vntTargAddr As Variant, _
        i%
    
    '// por si acaso el usario haya seleccionado un objeto como
    '// un gráfico u otro cosa que no sea una celda o rango de
    '// celdas
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    '// creamos una matriz de las direcciones que
    '// están listados en nuestra constante arriba
    Let vntTargAddr = Split(c_strAddresses, ",")
    
    '// hacemos un bucle y suprimimos el contenido de
    '// cada celda donde vamos a copiar valores (fíjese que
    '// suprimimos el contenido, no los formatos).
    For i = LBound(vntTargAddr) To UBound(vntTargAddr)
        Sheets("Pruebas").Range(vntTargAddr(i)).ClearContents
    Next i
    
    '// el bucle dejó «i» con un valor mayor que el
    '// el contenido de la matriz, hay que igualarlo
    '// al indice menor otra vez.
    Let i = LBound(vntTargAddr)
    
    '// hacemos un bucle que corre una vez por cada
    '// celda seleccionado
    For Each celSource In Selection.Cells
    
        '// en nuestro ejemplo aquí pusimos un listado de tres
        '// direcciones, aseguramos que el usuario no seleccionó
        '// más celdas que elementos en nuestra matriz.
        If i <= UBound(vntTargAddr) Then
            '// usamos el indice para sacar la direccion de
            '// la celda «i» de la matriz de direcciones y copiamos el valor
            '// de la celda seleccionado
            Sheets("Pruebas").Range(vntTargAddr(i)) = celSource.Value
            '// aumentamos el indice
            Let i = i + 1
        End If
        
    Next celSource
    
End Sub
 
Upvote 0
Hola Greg

Muchas gracias por tu gran ayuda, saludos.

ColdGeorge

Code:
Sub foo()

    '// un listado de direcciones donde deseamos copiar
    '// delimitado por coma.
    Const c_strAddresses As String = "C1,C3,C5"
    
    Dim celSource   As Excel.Range, _
        vntTargAddr As Variant, _
        i%
    
    '// por si acaso el usario haya seleccionado un objeto como
    '// un gráfico u otro cosa que no sea una celda o rango de
    '// celdas
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    '// creamos una matriz de las direcciones que
    '// están listados en nuestra constante arriba
    Let vntTargAddr = Split(c_strAddresses, ",")
    
    '// hacemos un bucle y suprimimos el contenido de
    '// cada celda donde vamos a copiar valores (fíjese que
    '// suprimimos el contenido, no los formatos).
    For i = LBound(vntTargAddr) To UBound(vntTargAddr)
        Sheets("Pruebas").Range(vntTargAddr(i)).ClearContents
    Next i
    
    '// el bucle dejó «i» con un valor mayor que el
    '// el contenido de la matriz, hay que igualarlo
    '// al indice menor otra vez.
    Let i = LBound(vntTargAddr)
    
    '// hacemos un bucle que corre una vez por cada
    '// celda seleccionado
    For Each celSource In Selection.Cells
    
        '// en nuestro ejemplo aquí pusimos un listado de tres
        '// direcciones, aseguramos que el usuario no seleccionó
        '// más celdas que elementos en nuestra matriz.
        If i <= UBound(vntTargAddr) Then
            '// usamos el indice para sacar la direccion de
            '// la celda «i» de la matriz de direcciones y copiamos el valor
            '// de la celda seleccionado
            Sheets("Pruebas").Range(vntTargAddr(i)) = celSource.Value
            '// aumentamos el indice
            Let i = i + 1
        End If
        
    Next celSource
    
End Sub
 
Upvote 0
Hola de nuevo Greg

Tu código me resulta muy interesante, aunque a decir verdad no lo comprendo del todo, una pregunta, ¿cómo habría que editarlo para que procesara un rango de tres diferentes opciones? por ejemplo:

Code:
Const c_strAddresses As String = "B7, B17, B27, B37, B47" 'presidentes
Const c_strAddresses As String = "C7, C17, C27, C37, C47" 'oradores
Const c_strAddresses As String = "D7, D12, D17, D22, D27, D32, D37, D47" 'lectores

Gracias y saludos de ColdGeorge
Code:
Sub foo()

    Const c_strAddresses As String = "C1,C3,C5"
    
    Dim celSource   As Excel.Range, _
        vntTargAddr As Variant, _
        i%
    
    
    If TypeName(Selection) <> "Range" Then Exit Sub
    
    Let vntTargAddr = Split(c_strAddresses, ",")
    
    For i = LBound(vntTargAddr) To UBound(vntTargAddr)
        Sheets("Pruebas").Range(vntTargAddr(i)).ClearContents
    Next i
    
    Let i = LBound(vntTargAddr)
    
    
    For Each celSource In Selection.Cells
    
        If i <= UBound(vntTargAddr) Then
            Sheets("Pruebas").Range(vntTargAddr(i)) = celSource.Value
            Let i = i + 1
        End If
        
    Next celSource


End Sub
 
Upvote 0
¿Cómo sabemos cuál de los tres vamos a utilizar? ¿Depende de la columna seleccionada? ¿U otra cosa?
 
Upvote 0
¿Cómo sabemos cuál de los tres vamos a utilizar? ¿Depende de la columna seleccionada? ¿U otra cosa?

Hola Greg

Lo que busco es poder cambiar a voluntad las celdas de destino, en este momento los datos a copiar se hallan en grupos en una sola columna, pero puedo emplear tres columnas para facilitar las cosas.

Espero haber provisto el dato necesario, saludos.

ColdGeorge
 
Upvote 0
Lo que pregunto es ¿cómo sabemos que vamos a poner el valor en columna B o C o D? ¿Es porque el usario ha seleccionado celdas en las columnas B o C o D en la hoja de fuente antes de correr el macro? ¿O nos damos cuenta por otra manera? ¿Si es así, entonces qué pasa si el usuario ha seleccionado celdas en dos o tres de tales columnas?
 
Upvote 0

Forum statistics

Threads
1,215,046
Messages
6,122,854
Members
449,096
Latest member
Erald

We've detected that you are using an adblocker.

We have a great community of people providing Excel help here, but the hosting costs are enormous. You can help keep this site running by allowing ads on MrExcel.com.
Allow Ads at MrExcel

Which adblocker are you using?

Disable AdBlock

Follow these easy steps to disable AdBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the icon in the browser’s toolbar.
2)Click on the "Pause on this site" option.
Go back

Disable AdBlock Plus

Follow these easy steps to disable AdBlock Plus

1)Click on the icon in the browser’s toolbar.
2)Click on the toggle to disable it for "mrexcel.com".
Go back

Disable uBlock Origin

Follow these easy steps to disable uBlock Origin

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back

Disable uBlock

Follow these easy steps to disable uBlock

1)Click on the icon in the browser’s toolbar.
2)Click on the "Power" button.
3)Click on the "Refresh" button.
Go back
Back
Top