Utilisation de VBA dans Access2003/2007.
Comment copier le contenu d'une variable chaîne dans le presse-papier?
Ce site recommande de créer une zone de texte de longueur zéro, de copier la chaîne dans la zone de texte, puis d’exécuter DoCmd.RunCommand acCmdCopy
. Pouah. Je veux dire, nous pouvons suivre la route. Mais reste. Pouah.
While article de la base de connaissances MS nous montre comment procéder, mais il implique un certain nombre d'appels API Windows. Yuk.
Est-ce que ce sont les deux seules options?
VB 6 fournit un objet Clipboard
qui rend tout cela extrêmement simple et pratique, mais qui n’est malheureusement pas disponible chez VBA.
Si c'était moi, je choisirais l'API. Il n'y a aucune raison d'avoir peur d'appeler des API natives; la langue vous donne la possibilité de le faire pour une raison.
Cependant, une alternative plus simple consiste à utiliser la classe DataObject
, qui fait partie de la bibliothèque Forms. Je ne recommanderais cet itinéraire que si vous utilisez déjà les fonctionnalités de la bibliothèque de formulaires de votre application. Ajouter une référence à cette bibliothèque niquement utiliser le presse-papier semble un peu ridicule.
Par exemple, pour placer du texte dans le presse-papiers, vous pouvez utiliser le code suivant:
Dim clipboard As MSForms.DataObject
Set clipboard = New MSForms.DataObject
clipboard.SetText "A string value"
clipboard.PutInClipboard
Ou, pour copier du texte du presse-papiers dans une variable chaîne:
Dim clipboard As MSForms.DataObject
Dim strContents As String
Set clipboard = New MSForms.DataObject
clipboard.GetFromClipboard
strContents = clipboard.GetText
Je ne comprenais pas comment utiliser l'API en utilisant les premiers résultats de Google. Heureusement, un fil de discussion m'a dirigé quelque part vers ce lien: http://access.mvps.org/access/api/api0049.htm
Ce qui fonctionne bien. :)
L'utilisateur Leigh Webber sur le site social.msdn.Microsoft.com a publié du code VBA mettant en œuvre une interface de presse-papiers conviviale utilisant l'API Windows:
http://social.msdn.Microsoft.com/Forums/en/worddev/thread/ee9e0d28-0f1e-467f-8d1d-1a86b2db2878
Vous pouvez obtenir le code source de Leigh Webber ici
Si ce lien ne passe pas, recherchez "Un objet Presse-papiers pour VBA" dans la section Centre de développement Office> Forums Microsoft Office pour les développeurs> Word pour les développeurs.
J'ai créé les deux classes, exécuté ses cas de test et cela fonctionnait parfaitement dans VBA Outlook 2007 SP3 32 bits sous Windows 7 64 bits. Cela fonctionnera très probablement pour Access. Conseil: pour renommer des classes, sélectionnez-la dans la fenêtre "Projet" de VBA, puis cliquez sur "Affichage" dans la barre de menus, puis sur "Fenêtre Propriétés" (ou appuyez simplement sur F4).
Avec ses classes, voici ce qu'il faut pour copier vers/depuis le presse-papiers:
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)
Il fournit également d'autres fonctions pour manipuler le presse-papiers.
Il surmonte également 32 Ko MSForms_DataObject.SetText limitation - la principale raison pour laquelle SetText échoue souvent. Cependant, gardez à l'esprit que, malheureusement, je n'ai trouvé aucune référence à Microsoft reconnaissant cette limitation.
-Jim