IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

declaration des fonctions dans diverses versions de EXCEL [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut declaration des fonctions dans diverses versions de EXCEL
    Bonjour, bonne année à tous, santé et bonheur,

    J'utilise un bouton copier coller grâce à une fonction que j'ai récupéré sur le net.
    Je me débrouille avec le VBA mais là je ne comprends pas mon message d'erreur.
    Mon bouton appelle la fonction COPY1 ci dessous et fonctionne jusqu'à la version 64 bits.
    Je viens de lire sur internet que la formulation des déclarations de variable avait changé et qu'il fallait le prévoir dans notre code.

    J'ai donc corrigé mon code comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    Option Explicit
     
    #If VBA7 Then
     
            Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
            Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
            Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
            Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
            Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
            Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
            Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
            Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
    #Else
        #If Win64 Then
            Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Longlong) As Longlong
            Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Longlong) As Longlong
            Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Longlong, ByVal dwBytes As Longlong) As Longlong
            Declare PtrSafe Function CloseClipboard Lib "User32" () As Longlong
            Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Longlong) As Longlong
            Declare PtrSafe Function EmptyClipboard Lib "User32" () As Longlong
            Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
            Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As Longlong, ByVal hMem As Longlong) As Longlong
        #Else
            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
        #End If
    #End If
     
    Public Const GHND = &H42
    Public Const CF_TEXT = 1
    Public Const MAXSIZE = 4096
     
     
    Function Copy1(mystring As String)
       Dim hGlobalMemory As Long, lpGlobalMemory As Long
       Dim hClipMemory As Long, x As Long
     
       ' Allocate moveable global memory.
       '-------------------------------------------
       hGlobalMemory = GlobalAlloc(GHND, Len(mystring) + 1)
     
       ' Lock the block to get a far pointer
       ' to this memory.
       lpGlobalMemory = GlobalLock(hGlobalMemory)
     
       ' Copy the string to this global memory.
       lpGlobalMemory = lstrcpy(lpGlobalMemory, mystring)
     
       ' Unlock the memory.
       If GlobalUnlock(hGlobalMemory) <> 0 Then
          MsgBox "Impossible de déverrouiller emplacement de mémoire. Copie abandonnée."
          GoTo OutOfHere2
       End If
     
       ' Open the Clipboard to copy data to.
       If OpenClipboard(0&) = 0 Then
          MsgBox "Impossible d'ouvrir le Presse-papiers. Copie avorté"
          Exit Function
       End If
     
       ' Clear the Clipboard.
       x = EmptyClipboard()
     
       ' Copy the data to the Clipboard.
       hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
     
    OutOfHere2:
     
       If CloseClipboard() = 0 Then
          MsgBox "Impossible de fermer le Presse-papiers."
       End If
     
       End Function
    Malheureusement j'obtient le message "impossible de déverouiller emplacement de mémoire copie abandonnée" qui est le message lorsque la variable GlobalUnlock est différent de 0 sur la version 64 bits uniquement.
    Mon PC fonctionnant avec la version 32 bits fonctionne très bien.

    J'ai remplacé mes variables longlong par longptr sans succès, même erreur !

    D'où viens le problème maintenant ?

    Merci pour votre aide,

  2. #2
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut mes avancées
    Ci dessous mes modifs sur les variables manquantes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
     
    Option Explicit
     
    #If VBA7 Then
     
            Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
            Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
            Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As Long, ByVal dwBytes As Long) As Long
            Declare PtrSafe Function CloseClipboard Lib "User32" () As Long
            Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As Long) As Long
            Declare PtrSafe Function EmptyClipboard Lib "User32" () As Long
            Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
            Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As Long, ByVal hMem As Long) As Long
            Dim hGlobalMemory As Long
            Dim lpGlobalMemory As Long
            Dim hClipMemory As Long
            Dim x As Long
     
    #Else
        #If Win64 Then
            Declare PtrSafe Function GlobalUnlock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
            Declare PtrSafe Function GlobalLock Lib "kernel32" (ByVal hMem As LongPtr) As LongPtr
            Declare PtrSafe Function GlobalAlloc Lib "kernel32" (ByVal wFlags As LongPtr, ByVal dwBytes As LongPtr) As LongPtr
            Declare PtrSafe Function CloseClipboard Lib "User32" () As LongPtr
            Declare PtrSafe Function OpenClipboard Lib "User32" (ByVal hwnd As LongPtr) As LongPtr
            Declare PtrSafe Function EmptyClipboard Lib "User32" () As LongPtr
            Declare PtrSafe Function lstrcpy Lib "kernel32" (ByVal lpString1 As Any, ByVal lpString2 As Any) As Long
            Declare PtrSafe Function SetClipboardData Lib "User32" (ByVal wFormat As LongPtr, ByVal hMem As LongPtr) As LongPtr
            Dim hGlobalMemory As LongPtr
            Dim lpGlobalMemory As LongPtr
            Dim hClipMemory As LongPtr
            Dim x As LongPtr
     
        #Else
            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
            Dim hGlobalMemory As Long
            Dim lpGlobalMemory As Long
            Dim hClipMemory As Long
            Dim x As Long
     
        #End If
    #End If
     
    Public Const GHND = &H42
    Public Const CF_TEXT = 1
    Public Const MAXSIZE = 4096
     
     
    Function Copy1(mystring As String)
     
       ' Allocate moveable global memory.
       '-------------------------------------------
       hGlobalMemory = GlobalAlloc(GHND, Len(mystring) + 1)
     
       ' Lock the block to get a far pointer
       ' to this memory.
       lpGlobalMemory = GlobalLock(hGlobalMemory)
     
       ' Copy the string to this global memory.
       lpGlobalMemory = lstrcpy(lpGlobalMemory, mystring)
     
       ' Unlock the memory.
       If GlobalUnlock(hGlobalMemory) <> 0 Then
          MsgBox "Impossible de déverrouiller emplacement de mémoire. Copie abandonnée."
          GoTo OutOfHere2
       End If
     
       ' Open the Clipboard to copy data to.
       If OpenClipboard(0&) = 0 Then
          MsgBox "Impossible d'ouvrir le Presse-papiers. Copie avorté"
          Exit Function
       End If
     
       ' Clear the Clipboard.
       x = EmptyClipboard()
     
       ' Copy the data to the Clipboard.
       hClipMemory = SetClipboardData(CF_TEXT, hGlobalMemory)
     
    OutOfHere2:
     
       If CloseClipboard() = 0 Then
          MsgBox "Impossible de fermer le Presse-papiers."
       End If
     
       End Function
    Mais toujours le même problème

  3. #3
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Personne ne peut m'aider ?

  4. #4
    Membre émérite Avatar de Valtrase
    Homme Profil pro
    Jeune retraité...
    Inscrit en
    Janvier 2016
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Jeune retraité...
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Janvier 2016
    Messages : 509
    Par défaut
    Salut,
    J'ai pas vérifié mais peut-être des réponses dans la référence fournie par Microsoft.

  5. #5
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Salut,
    J'ai pas vérifié mais peut-être des réponses dans la référence fournie par Microsoft.
    Bonjour, je n'arrive pas à ouvrir ton fichier.
    C'est quoi le format ".7z"?

  6. #6
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Citation Envoyé par Valtrase Voir le message
    Salut,
    J'ai pas vérifié mais peut-être des réponses dans la référence fournie par Microsoft.
    C'est bon j'ai trouvé la page et télécharger mais impossible de trouver les pages installées

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 508
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 508
    Par défaut
    Tes déclarations ont l'air bonnes,
    par contre tu ne vérifies pas le retour de toutes les API.

    Sur mon système (Office 2013, 4 bits), GlobalLock retourne zéro (la fonction à échoué), donc son inverse ne peut qu'échouer.
    Tu devrais appeler l'API GetLastError pour obtenir les détails de cet échec (doc: https://learn.microsoft.com/en-us/wi...ase-globallock).

    Et toujours d'après la documentation, Micrrosoft ne recommende pas l'utilisation de GlobalLock.

    Quel est le but de ton code ?
    Manipuler le presse papier ? Tu peux passer par une cellule, c'est autrement plus facile (méthode Copy de l'objet Range), ou au pire, un fichier temporaire.

  8. #8
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Tes déclarations ont l'air bonnes,
    par contre tu ne vérifies pas le retour de toutes les API.

    Sur mon système (Office 2013, 4 bits), GlobalLock retourne zéro (la fonction à échoué), donc son inverse ne peut qu'échouer.
    Tu devrais appeler l'API GetLastError pour obtenir les détails de cet échec (doc: https://learn.microsoft.com/en-us/wi...ase-globallock).

    Et toujours d'après la documentation, Micrrosoft ne recommende pas l'utilisation de GlobalLock.

    Quel est le but de ton code ?
    Manipuler le presse papier ? Tu peux passer par une cellule, c'est autrement plus facile (méthode Copy de l'objet Range), ou au pire, un fichier temporaire.
    Bonjour Deedolith,

    oui mon but est de coller dans le presse papier un texte contenu dans une variable et dont le contenu est créé en vba (saisi dans formulaire, cellule et prédéfinis en vba).
    J'appelle cette fonction pour coller le contenu de ma variable dans le presse papier.
    je veux éviter le copier coller de excel qui m'a posé de nombreux problème dans le passé (contenu, forme modifié par excel et parfois pas copié) mais si je n'ai pas le chois j'y reviendrai.
    Cette API est très bien pour coller tout sans modification.
    je vais me pencher sur l'api GETLASTERROR pour comprendre l'erreur mais tes premiers éléments me laisse penser que je ne peu plus l'utiliser cette fonction.

    Y a t'il un autre moyen que d'éviter de remplir une cellule et copier dans le presse papier ?

  9. #9
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut j'ai trouvé une fonction qui me semble pas mal
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    Function Clipboard(Optional StoreText As String) As String
    'Pour copier Clipboard ActiveCell
    'Pour coller MsgBox Clipboard
    Dim x As Variant
        x = StoreText 'Stocker comme variante pour la prise en charge de VBA 64 bits
        'Créer un objet HTMLFile
        With CreateObject("htmlfile")
            With .parentWindow.clipboardData
                Select Case True
                    Case Len(StoreText)
                    'Écrire dans le presse-papiers
                        .setData "text", x
                    Case Else
                    'Lire depuis le presse-papiers (aucune variable transmise)
                    Clipboard = .GetData("text")
                End Select
            End With
        End With
    End Function
    je la trouve pas mal et sans api.
    Par contre pourquoi une fonction, je ne vois pas de renvoie ?.

    Je viens d'essayer de la transformer en sub mais pas possible ? Clipboard est un appel particulier ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Février 2008
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Chargé d'affaire
    Secteur : Service public

    Informations forums :
    Inscription : Février 2008
    Messages : 144
    Par défaut test nouvelle fonction positif
    Bonjour,

    cette fonction marche pour toute les versions et plus d'API.

    Par contre je ne comprends pas pourquoi il faut une fonction là ?
    On ne renvoie pas de données !

    Si quelqu'un a une réponse je veux bien analyser

    merci pour vos aides

  11. #11
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 242
    Par défaut
    Hello
    et ça alors ce n'est pas l'affectation de la valeur que la fonction renvoie ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Clipboard = .GetData("text")
    Ami calmant, J.P

  12. #12
    Expert confirmé
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    Décembre 2008
    Messages
    4 242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2008
    Messages : 4 242
    Par défaut
    En pièce jointe un classeur qui contient un module de classe (vbaClipboard) qui permet de faire pas mal de chose avec le presse-papier ( voir dans le module ModTestPP) en utilisant les API windows.
    Fichiers attachés Fichiers attachés

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA-E]Insérer des autotext dans Word à partir d'excel
    Par noordman dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 25/04/2006, 15h34
  2. Réponses: 4
    Dernier message: 13/04/2006, 22h11
  3. Réponses: 1
    Dernier message: 05/11/2004, 17h15
  4. Enchainer des fonctions dans un onclick d'un bouton
    Par jpg dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 26/10/2004, 16h51
  5. [VBA-E] Ajouter des fonctions dans Excel
    Par Clezio dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2004, 01h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo