[VBA-WRD] Appel de fonction selon version. (Compitibilitée Office 2003 sur Offic

Signaler
Messages postés
14
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
18 mai 2007
-
Messages postés
14
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
18 mai 2007
-
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.

8 réponses

Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
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...
Messages postés
7668
Date d'inscription
samedi 5 novembre 2005
Statut
Membre
Dernière intervention
22 août 2014
27
Ouais... C'et bien ce que je devinais ... VBA ne gère pas le clipboard (raison probable de l'existence de sa syntaxe pour coller...).

Alors ? Comment en créer un, de ClipBoard pour l'utiliser sous VBA...
Voilà le fruit d'une rapide recherche (j'espère que tu comprends l'anglais) :

http://vb.mvps.org/articles/ap200106.asp
Messages postés
14
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
18 mai 2007

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.
Messages postés
14
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
18 mai 2007

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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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 (?)

MPi
Messages postés
14
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
18 mai 2007

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.
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
19
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 ? .....

MPi
Messages postés
14
Date d'inscription
mardi 13 avril 2004
Statut
Membre
Dernière intervention
18 mai 2007

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.