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

VBA Access Discussion :

Problème déclaration fonction VBA 64bits [AC-2010]


Sujet :

VBA Access

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2011
    Messages : 40
    Par défaut Problème déclaration fonction VBA 64bits
    Bonjour à tous,

    je suis en train de réaliser le tutorial qui se trouve à cette page ( ici )

    Au chapitre "III-C-3-d Propriétés : Événements" il est fourni du code VBA pour déclarer la fonction de choix de couleur ; ce code :
    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
    Private Declare Function CHOOSECOLOR Lib "comdlg32.dll" Alias _
    "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As Long
    Private Type CHOOSECOLOR
        lStructSize As Long
        hwndOwner As Long
        hInstance As Long
        rgbResult As Long
        lpCustColors As String
        flags As Long
        lCustData As Long
        lpfnHook As Long
        lpTemplateName As String
    End Type
     
    Public Function ShowColor(Handle As Long) As Long
        Dim cc As CHOOSECOLOR
        Dim Custcolor(16) As Long
        Dim lReturn As Long
        Dim CustomColors
     
        'set the structure size
        cc.lStructSize = Len(cc)
        'Set the owner
        cc.hwndOwner = Handle
        'set the custom colors (converted to Unicode)
        cc.lpCustColors = StrConv(CustomColors, vbUnicode)
        'no extra flags
        cc.flags = 0
     
        'Show the 'Select Color'-dialog
        If CHOOSECOLOR(cc) <> 0 Then
            ShowColor = cc.rgbResult
            CustomColors = StrConv(cc.lpCustColors, vbFromUnicode)
        Else
            ShowColor = -1
        End If
    End Function
    Malheureusement pour moi je suis sous office2010 64bits et la déclaration de la fonction ne fonctionne pas ; il me dit : "Erreur de compilation: Le code contenu dans ce projet doit être mis à jour pour pouvoir être utilisé sur les systèmes 64 bits. Vérifiez et mettes à jour les instructions Declare, puis marquez-les avec l'attribut PtrSafe".

    J'ai donc fouillé un peu sur Google et j'ai essayé ça sur la première partie :
    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
     
    Private Declare PtrSafe Function CHOOSECOLOR Lib "comdlg32.dll" Alias _
        "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr
    Private Type CHOOSECOLOR
        lStructSize As LongPtr
        hwndOwner As LongPtr
        hInstance As LongPtr
        rgbResult As LongPtr
        lpCustColors As String
        flags As LongPtr
        lCustData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As String
    End Type
    End Function
    Du coup j'obtiens le message d'erreur access : "L'expression Avant MAJ entrée comme paramètre de la propriété de type événement est l'origine d'une erreur. Seuls des commentaires peuvent apparaitre après End SUb, End Function, ou End Property.

    *Le résultat de l'expression n'est pas le nom d'une macro, le nom d'une fonction définie par l'utilisateur ou [Event Procedure].
    *Une erreur a peut-être été commise lors de l'évaluation d'une fonction, d'une évènement ou d'une macro."

    J'ai bien mis des LongPtr pour toutes les fonctions systèmes qui ont un rapport à la mémoire comme indiqué dans l'aide MS.
    Et j'ai bien ajouté le PtrSafe à la suite de "Declare".

    Est-ce que cela pourrait venir de la librairie comdlg32.dll qui n'est pas lue par un système 64bits ?

    En vous remerciant par avance
    Thomas

  2. #2
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut Declaration
    Tomtomtvn bonjour,

    Il te faut mettre la déclaration 64 et 32 dans une condition (Le ptrsafe ne s'applique qu'à la déclaration 64 )

    L'exemple suivant est avec une déclaration

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #If Win64 Then
    Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    #Else
    Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    #End If
    Bonne journée

    JimBoLion

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2011
    Messages : 40
    Par défaut
    Bonjour Jimbolion et merci pour cette réponse.

    Je viens de tester ce morceau de code mais cela ne résout pas le problème, il me dis toujours la même chose à propos de "L'expression avant MAJ...".

    J'ai testé avec et sans les # (à quoi servent-ils d'ailleurs ?) du si-alors-sinon.

    Dois-je mettre cette expression dans un endroit particulier ?

    Pour info le code après modif :
    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
     
    #If Win64 Then
        Private Declare PtrSafe Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr
        #Else
        Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
    #End If
    Private Type CHOOSECOLOR
        lStructSize As LongPtr
        hwndOwner As LongPtr
        hInstance As LongPtr
        rgbResult As LongPtr
        lpCustColors As String
        flags As LongPtr
        lCustData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As String
    End Type
    End Function

  4. #4
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut
    Tomtomvn,

    Première partie à corriger

    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
    #If Win64 Then
        Private Declare PtrSafe Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr
    #Else
        Private Declare Function CHOOSECOLOR Lib "comdlg32.dll" Alias "ChooseColorA" (pChoosecolor As CHOOSECOLOR) As LongPtr
    #End If
    Private Type CHOOSECOLOR
        lStructSize As LongPtr
        hwndOwner As LongPtr
        hInstance As LongPtr
        rgbResult As LongPtr
        lpCustColors As String
        flags As LongPtr
        lCustData As LongPtr
        lpfnHook As LongPtr
        lpTemplateName As String
    End Type

    Pour le reste tu ne devrais pas avoir un End function derrière cette partie là. Il s'agit d'une déclaration qui ne peut être englobé dans une fonction.

    Bonne soirée

    JimboLion

  5. #5
    Membre averti
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Octobre 2011
    Messages : 40
    Par défaut
    Bonjour,

    Je viens de tester mais j'ai toujours le retour "L'expression avant MAJ...".
    Je ne comprends vraiment pas et je n'ai même pas de machine 32bits pour essayer dessus.

    Pouvez vous regarder directement dans mon fichier si vous voyez ce qui cloche svp ?

    planning.zip

    Le code se trouve dans le formulaire F_SaisieCatalogue

    Encore merci pour votre aide.
    Thomas

  6. #6
    Expert confirmé
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Billets dans le blog
    2
    Par défaut Planning
    Thomas,

    J'ai modifié l'appel de tes dll !

    les fonctions communes ont été déplacées dans un module et il te reste quelques erreurs à corriger.

    Bonne journée

    JimBolion
    Fichiers attachés Fichiers attachés

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

Discussions similaires

  1. [XL-2010] Problème avec fonction VBA pour extraire un numéro de téléphone
    Par Kanigui dans le forum Macros et VBA Excel
    Réponses: 33
    Dernier message: 15/11/2014, 16h38
  2. [XL-2007] Problème avec fonction VBA
    Par BarryLyndon57 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 28/01/2012, 17h23
  3. [XL-2010] Problème avec les fonctions VBA String
    Par JOHN14 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2011, 22h07
  4. [XL-2007] fonction vba excel problème avec hh:mm:ss
    Par chantalina dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/01/2010, 15h47
  5. [JS] Problème déclaration de fonction
    Par glloq8 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 23/09/2005, 10h22

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