Copiar en el portapapeles con Visual Basic

Tengo un código que utilizo en otro libro para copiar una celda al portapapeles de Windows, de forma que esté disponible aún cuando ya haya cerrado la hoja de cálculo. Mi problema es que, al adaptarla al libro donde quiero usarla, seleccionando en este caso un rango dinámico, me da el error de que no se ha definido el tipo definido por el usuario. Aquí está el código:

Option Explicit

Sub Copiar_portapapeles()

Dim PP As DataObject
Dim S As String
S = Range(Cells(10, "I"), Cells(Range("U1") + 9, "I")).Value

Set PP = New DataObject
PP.SetText S
PP.PutInClipboard
End Sub

He buscado información por la red, y no sé si será que tenga que activar algún módulo de Excel. Espero que me puedan ayudar a resolver esto. Muchas gracias. Un saludo.

1 Respuesta

Respuesta
1

Revisa lo siguiente:

  • No te recomiendo utilizar "Option Explicit", es recomendable cuando tienes un programa o varios programas muy extensos.
  • En VBA no es necesario declarar variables, más sobre variables Según su función ¿Cómo declarar variables?
  • Revisa en el menú de VBA, Herramientas, Referencias, que tengas estas referencias:

  • En esta sentencia: 
        s = Range(Cells(10, "I"), Cells(Range("U1") + 9, "I")).Value
  • El resultado en la variable "s" NO es un string, es un arreglo de datos. Por eso la declaro como Variant. Cuando subes a memoria una sola celda no tienes problemas, porque toma el texto de esa celda, pero cuando quieres poner varias celdas, entonces tienes un arreglo de celdas.
  • En ese arreglo de datos puedes tener varias filas y una sola columna ("I").
  • En el clipboard se puede almacenar solamente un texto  

The MSForms library contains an object called the DataObject that provides support for working with text strings on the Windows clipboard. VBA does not support the data type required for other, non-text, values on the clipboard. To use the DataObject in your code, you must set a reference to the Microsoft Forms 2.0 Object Library.

  • http://www.cpearson.com/excel/clipboard.aspx
  • Lo que podemos hacer es llevar ese arreglo de datos a una cadena de texto, cada dato separado por coma ","
  • Ya colocados los datos en la cadena, entonces se pone en el portapapeles.
Sub Copiar_portapapeles()
'Act.Por.Dante Amor
    Dim PP As DataObject
    Dim s As Variant
    Dim cad As String
    '
    s = Range(Cells(10, "I"), Cells(Range("U1") + 9, "I")).Value
    For i = LBound(s) To UBound(s)
        cad = cad & s(i, 1) & ", "
    Next
    If cad <> "" Then
        cad = Left(cad, Len(cad) - 2)
    End If
    '
    Set PP = New DataObject
    PP.SetText cad
    PP.PutInClipboard
End Sub


  • Cuando ocupes el dato de la memoria, tendrás que separar cada dato por la coma. Por ejemplo:
  • Sub DescargarMemoria()
    'Por.Dante Amor
        'Por ejemplos, si estás en la celda B2
        'en la celda C2 y hacia abajo te va a poner cada dato
        ActiveSheet.Paste
        datos = Split(ActiveCell.Value, ",")
        For i = LBound(datos) To UBound(datos)
            ActiveCell.Offset(i, 1) = datos(i)
        Next
    End Sub

De esa forma es como podrías resolverlo.


.

'S aludos. Dante Amor. Recuerda valorar la respuesta. G racias

.

Avísame cualquier duda

.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas