¿Cómo copiar al portapapeles usando Access / VBA?

Usando VBA dentro de Access2003 / 2007.

¿Cómo copiar el contenido de una variable de cadena al portapapeles?

Este sitio recomienda crear un TextBox de longitud cero, copiar la cadena al TextBox y luego ejecutar DoCmd.RunCommand acCmdCopy . Ugh. Quiero decir, podemos ir por la ruta. Pero aún. Ugh.

Mientras que el artículo de la base de conocimiento de MS nos muestra cómo hacerlo, pero implica una serie de llamadas a la API de Windows. Yuk.

¿Son esas las únicas dos opciones?

VB 6 proporciona un objeto de Clipboard que hace que todo esto sea extremadamente simple y conveniente, pero desafortunadamente eso no está disponible desde VBA.

Si fuera yo, iría a la ruta API. No hay razón para temer llamar API nativas; el idioma te proporciona la capacidad de hacerlo por una razón.

Sin embargo, una alternativa más simple es usar la clase DataObject , que es parte de la biblioteca Forms. Solo recomendaría seguir esta ruta si ya está utilizando la funcionalidad de la biblioteca de formularios en su aplicación. Agregar una referencia a esta biblioteca solo para usar el portapapeles parece un poco tonto.

Por ejemplo, para colocar texto en el portapapeles, puede usar el siguiente código:

 Dim clipboard As MSForms.DataObject Set clipboard = New MSForms.DataObject clipboard.SetText "A string value" clipboard.PutInClipboard 

O bien, para copiar texto del portapapeles en una variable de cadena:

 Dim clipboard As MSForms.DataObject Dim strContents As String Set clipboard = New MSForms.DataObject clipboard.GetFromClipboard strContents = clipboard.GetText 

No pude averiguar cómo usar la API usando los primeros resultados de Google. Afortunadamente, un hilo en alguna parte me indicó este enlace: http://access.mvps.org/access/api/api0049.htm

Que funciona bien 🙂

El usuario Leigh Webber en el sitio social.msdn.microsoft.com publicó código VBA implementando una interfaz portapapeles fácil de usar que usa la API de Windows:

http://social.msdn.microsoft.com/Forums/en/worddev/thread/ee9e0d28-0f1e-467f-8d1d-1a86b2db2878

Puedes obtener el código fuente de Leigh Webber aquí

Si este enlace no se procesa, busque “Un objeto del portapapeles para VBA” en el Centro de desarrollo de Office> Microsoft Office for Developers Forums> Word for Developers section.

Creé las dos clases, ejecuté sus casos de prueba y funcionó perfectamente dentro de Outlook 2007 SP3 32-bit VBA bajo Windows 7 de 64 bits. Lo más probable es que funcione para Access. Consejo: Para cambiar el nombre de las clases, seleccione la clase en la ventana ‘Proyecto’ de VBA, luego haga clic en ‘Ver’ en la barra de menú y haga clic en ‘Ventana Propiedades’ (o simplemente presione F4).

Con sus clases, esto es lo que se necesita para copiar hacia / desde el portapapeles:

 Dim myClipboard As New vbaClipboard ' Create clipboard ' Copy text to clipboard as ClipboardFormat TEXT (CF_TEXT) myClipboard.SetClipboardText "Text to put in clipboard", "CF_TEXT" ' Retrieve clipboard text in CF_TEXT format (CF_TEXT = 1) mytxt = myClipboard.GetClipboardText(1) 

También proporciona otras funciones para manipular el portapapeles.

También supera la limitación de 32KB MSForms_DataObject.SetText , la razón principal por la que SetText falla a menudo. Sin embargo, tenga en cuenta que, desafortunadamente, no he encontrado una referencia en Microsoft que reconozca esta limitación.

-Jim