# Copia de valores uno por uno



## ColdGeorge (Nov 14, 2016)

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:


```
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


----------



## Greg Truby (Nov 15, 2016)

```
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
```


----------



## ColdGeorge (Nov 15, 2016)

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




Greg Truby said:


> ```
> Sub foo()
> 
> Const c_strAddresses As String = "C1,C3,C5"
> ...


----------



## Greg Truby (Nov 16, 2016)

```
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
```


----------



## ColdGeorge (Nov 16, 2016)

Hola Greg

Muchas gracias por tu gran ayuda, saludos.

ColdGeorge



Greg Truby said:


> ```
> Sub foo()
> 
> '// un listado de direcciones donde deseamos copiar
> ...


----------



## Greg Truby (Nov 16, 2016)

Con mucho gusto.  Buena suerte con su proyecto.


----------



## ColdGeorge (Nov 22, 2016)

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:


```
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


Greg Truby said:


> ```
> Sub foo()
> 
> Const c_strAddresses As String = "C1,C3,C5"
> ...


----------



## Greg Truby (Nov 23, 2016)

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


----------



## ColdGeorge (Nov 23, 2016)

Greg Truby said:


> ¿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


----------



## Greg Truby (Nov 23, 2016)

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?


----------



## ColdGeorge (Nov 14, 2016)

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:


```
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


----------



## ColdGeorge (Nov 23, 2016)

Hola Greg
Inicialmente, iba a seleccionar valores de una columna y copiarlos a otra, la misma acción se realizaría un total de tres veces, las columnas de destino son B, C y D, hasta pensé en que tenía que emplear tres instrucciones, pero creo que con UNA sola instrucción que ofrezca tres opciones debería ser suficiente, ya que el proceso de realiza uno a la vez, empezando a pegar valores en la columna B.
ColdGeorge


----------

