Enviar información al Portapapeles usando macros en Excel
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