[VBA-WRD] Appel de fonction selon version. (Compitibilitée Office 2003 sur Offic
billybond
Messages postés14Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention18 mai 2007
-
15 mai 2007 à 14:56
billybond
Messages postés14Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention18 mai 2007
-
18 mai 2007 à 13:17
Bonjour a tous, je recrée un nouveau message pour que cela soit plus clair.
J'ai besoin d'appeller deux methode differente selon que je soit sous un Office 2000 ou un Office 2003.
Ma macro s'execute depuis word.
Il faut qeu si je suis sous 2000 j'appelle la methode Selection.Paste et si je suis sous 2003 Selection.PasteExcelTab.
J'ai essayer de mettre dans le code :
Private Sub Paste_Excel_Tab()
If Application.Version = "11.0" Then
MsgBox ("Past 2003")
Application.Selection.PasteExcelTable False, False, True
Else
MsgBox ("Past 2000")
Application.Selection.Paste
End If
End Sub
Cependant lors de l'execution sous Office 2000 j'ai une erreur : "Erreur de compilation dans le module. Cette erreur est du au fait qu'il ne connais pas PasteExcelTable et que lors de la compilation de la methode il teste le cas ou le If est vrai.
J'ai essayer de passer par la compilation conditionel cependant, ne pouvans utiliser qu'une constante pour la condition je ne peux pas faire un choix dynamique selon la version.
Si vous voyer une idée cela m'aiderai fortement.
A voir également:
[VBA-WRD] Appel de fonction selon version. (Compitibilitée Office 2003 sur Offic
jmfmarques
Messages postés7666Date d'inscriptionsamedi 5 novembre 2005StatutMembreDernière intervention22 août 201427 15 mai 2007 à 16:06
Bonjour,
Je m'affranchirais à ta place de ce genre de problèmes entre une version et l'autre (et qui si demain une nouvelle version apparait, hein ?... et qu'elle ne reconnait ni la syntaxe du Paste de la version 2003 ni celle de la version 2000 ...?)
Comment je m'en affranchirais ? par utilisation de l'objet ClipBooard, ma foi...
Reste à sabvoir si VBA (que je ne connais pas) gère ou non cet objet ...
Bof, ... dans le cas contraire, j'en créerais un... (ce devrait être assez facile) et, du coup, c'est lui que j'utiliserais directement...
Je vais faire un petit tour pour voir ce qu'il en est et reviens...
billybond
Messages postés14Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention18 mai 2007 15 mai 2007 à 16:35
Salut.
Merci de ta reponse mais cela ne corespond pas a mon besoin.
En effet mon appli tournera sous Office 2000 et 2003 seulement.
De plus j'ai besoin d'utiliser les methodes Paste de Word car je recupère l'element copier est un ensemble de cellule d'un document Word. La methode de copie est dans un macro du document Excel. Il ne faut pas que je modifie ce document Excel et donc la methode de copie. Pour le transfer de Excel a Word j'utilise le presspapier office donc obligatoirement les methodes d'acces Office.
Cependant je vais re-regarder ton idee peut etre je pourrais l'adapter.
billybond
Messages postés14Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention18 mai 2007 15 mai 2007 à 16:40
Precision :
La methode selection.paste fonctionne sur 2003 cependant elle ne s'effetue pas au mieux et cause des pb contrairement a la version 2000.
Je doit pouvoir recopier les cellules dans un tableau pour pouvoir le mettre en page.
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 18 mai 2007 à 03:36
Salut BillyBond,
je pense que tu ne risques pas grand chose à essayer la technique de JMF.
J'ai eu un peu le même problème avec Excel et Outlook. Pas tellement à cause des versions mais surtout à cause du presse-papier d'Office... qui semble de ne pas être vraiment cohérent entre les différentes applications Office. Et l'aide en ligne n'est vraiment pas explicite
J'ai fini par m'en sortir à l'aide des APIs ClipBoard et quelques autres.
Ça m'a permis de pouvoir faire un copier/coller d'un Range et de le coller dans le "body" d'un courriel, ce que je cherchais à faire.
Mais comme je ne connais pas la programmation sous Word, je ne sais pas comment ça réagira. Je ne sais pas non plus si la méthode Paste a complètement disparu ou non (?)
billybond
Messages postés14Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention18 mai 2007 18 mai 2007 à 09:49
As tu toujours ton code? si oui cela m'interesserai de voir comme tu as procedé.
Mon probleme est que je doit recuperer un tableau et le copier en temps que tableau et non pas d'image, je doit travailler dessus apres.
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201823 18 mai 2007 à 11:42
Voici la partie de code que j'ai trouvé... qui ne vient donc pas de moi, et qui est commentée en anglais. Déclaration des API et Fonction ClipBoard_GetData()
À mettre dans un module Declare Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
Declare Function CloseClipboard Lib "User32" () As Long
Declare Function GetClipboardData Lib "User32" (ByVal wFormat As Long) As Long
Declare Function GlobalAlloc Lib "kernel32" (ByVal wFlags&, ByVal dwBytes As Long) As Long
Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function GlobalSize Lib "kernel32" (ByVal hMem As Long) As Long
Declare Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
Public Const GHND = &H42
Public Const CF_TEXT = 1
Public Const MAXSIZE = 4096
Function ClipBoard_GetData()
Dim hClipMemory As Long
Dim lpClipMemory As Long
Dim MyString As String
Dim RetVal As Long
If OpenClipboard(0&) = 0 Then
MsgBox "Cannot open Clipboard. Another app. may have it open"
Exit Function
End If
' Obtain the handle to the global memory block that is referencing the text.
hClipMemory = GetClipboardData(CF_TEXT)
If IsNull(hClipMemory) Then
MsgBox "Could not allocate memory"
GoTo OutOfHere
End If
' Lock Clipboard memory so we can reference the actual data string.
lpClipMemory = GlobalLock(hClipMemory)
If Not IsNull(lpClipMemory) Then
MyString = Space$(MAXSIZE)
RetVal = lstrcpy(MyString, lpClipMemory)
RetVal = GlobalUnlock(hClipMemory)
' Peel off the null terminating character.
' MyString = Mid(MyString, 1, InStr(1, MyString, Chr$(0), vbBinaryCompare) - 1)
MyString = Left(MyString, Len(MyString) - 1)
Else
MsgBox "Could not lock memory to copy string from."
End If
OutOfHere:
RetVal = CloseClipboard()
ClipBoard_GetData = MyString
End Function
Ensuite, c'est assez simple.
Copie de sélection
Range("A1:E" & nbLignes).Copy
Collage de cette sélection
strBody = ClipBoard_GetData() 'récupérer le presse-papier
NewMail.HTMLBody = "<HTML>" & strBody & "
</HTML>"
Dans le cas de Outlook, je devais passer par du HTML afin de changer la police en Courrier New () et pouvoir mettre du gras..... La police Courrier à espacement fixe me permet de créer une position des données variables en colonnes. J'ai donc un bout de code qui précède et qui utilise Space$ pour ajouter des espaces où c'est nécessaire.
Dans ton cas, il faudra adapter la sortie de manière différente, mais strBody devrait contenir ce que tu souhaites, je pense.
Et comme je disais, je ne connais pas VBA Word et encore moins PasteExcelTable
Et tu ne dis pas vraiment ce que tu fais... Tu colles dans un tableau Word existant ? Est-ce que seulement des données organisées en colonnes est suffisant ? .....
billybond
Messages postés14Date d'inscriptionmardi 13 avril 2004StatutMembreDernière intervention18 mai 2007 18 mai 2007 à 13:17
justement non je ne colle pas dans un tableau word. c'est la copie qui me cree le tableau.
Et il me faut absolument un tableau car je retravaille dessus apres. Si je le passe en HTML (j'ai essayer avec pasteExcelTable de mettre l'option HTML, le rendu n'est pas correcte.
Merci de tes indications je vais tester cela.