Enviar información al Portapapeles usando macros en Excel

image

De acuerdo a la definición de Microsoft “El Portapapeles es un área de almacenamiento temporal para la información que se ha copiado o movido de un lugar y tiene previsto usar en otra ubicación. Puede seleccionar texto o gráficos y usar los comandos Cortar o Copiar para mover la selección al Portapapeles, donde se almacenará hasta que ejecute el comando Pegar para insertar el contenido en otro lugar. Por ejemplo, puede copiar una parte del texto de un sitio web para copiarlo en un mensaje de correo electrónico. El Portapapeles está disponible en la mayoría de programas de Windows.”

En otras palabras, cada que Copiamos o Cortamos información, ésta se va de manera temporal al Portapapeles.

Cómo enviamos información al Portapapeles

Para este artículo, hacemos uso de la función ClipBoard_SetData publicada en Office Dev Center para enviar datos diversos al portapapeles. Aquí unos ejemplos:

Copiar fórmula de una celda:

ClipBoard_SetData (Range(“A1”).FormulaLocal)

Copiar etiqueta de un botón de formulario:

ClipBoard_SetData (UserForm1.CommandButton1.Caption)

Copiar nombre de primera hoja:

ClipBoard_SetData (ActiveWorkbook.Sheets(1).Name)

Al ejecutar cualquiera de las 3 macros anteriores, basta con presionar [Ctrl] + [V] para pegar los datos.

Código vba de la función ClipBoard_SetData

El siguiente código deberá ir en un Módulo normal.

'Declaración de variables
'
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Declare Function EmptyClipboard Lib "User32" () As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Declare Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
'
'Declaración de constantes
'
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
'
'FUNCIÓN
Function ClipBoard_SetData(MyString As String)
'
Dim hGlobalMemory As Long, lpGlobalMemory As Long
Dim hClipMemory As Long, X As Long
'
' Asignar memoria global
'-------------------------------------------
hGlobalMemory = GlobalAlloc(GHND, Len(MyString) + 1)
'
' Bloquear el bloque para obtener un puntero lejos a esta memoria.
lpGlobalMemory = GlobalLock(hGlobalMemory)
'
' Copiar la cadena a la memoria global.
lpGlobalMemory = lstrcpy(lpGlobalMemory, MyString)
'
' Desbloquear la memoria.
If GlobalUnlock(hGlobalMemory) <> 0 Then
    MsgBox "No pudo desbloquear la posición de la memoria."
    GoTo OutOfHere2
End If
'
' Abri el Portapapeles para copiar datos.
If OpenClipboard(0&) = 0 Then
    MsgBox "No se puede abrir el Portapapeles."
    Exit Function
End If
'
' Limpiar el Portapapeles
X = EmptyClipboard()
'
' Copiar los datos al Portapapeles
hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
'
OutOfHere2:
'
If CloseClipboard() = 0 Then
    MsgBox "No se pudo cerrar el Porpapapeles."
End If
'
End Function

You may also like...