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

  1. #1
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    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 éminent
    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
    Points : 7 001
    Points
    7 001
    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
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  3. #3
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    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 éminent
    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
    Points : 7 001
    Points
    7 001
    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
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  5. #5
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    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 éminent
    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
    Points : 7 001
    Points
    7 001
    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
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

  7. #7
    Expert éminent sénior
    Avatar de Dolphy35
    Homme Profil pro
    Responsable Systemes d'Information
    Inscrit en
    Octobre 2004
    Messages
    4 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable Systemes d'Information
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2004
    Messages : 4 373
    Points : 11 218
    Points
    11 218
    Par défaut
    Bonjour,

    pour mieux comprendre le développement sous Access 64 bits je te conseil ce tutoriel Développer avec Office 64 bits

    @+

  8. #8
    Nouveau membre du Club
    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
    Points : 35
    Points
    35
    Par défaut
    Bonjour,

    Un grand merci pour ces aides vraiment vraiment salutaires.

    @jimbolion
    En fait, si j'ai bien compris, il suffisait de déplacer la déclaration de fonction au début de la page de code du formulaire ?
    En fait je n'ai pour l'instant codé qu'en utilisant l'enregistreur de macro sur excel et fais des petites modifs, c'est pour ça que je suis pas bien au top sur le code et ses règles.

    @Dolphy35
    Merci beaucoup pour ce lien, je crois que je vais lire tout ça avant de continuer plus loin mon tuto.
    Par contre une question, il est écris dans cet article juste avant la partie sur les API :
    Si on compile sur une version antérieure, ce qui est compris entre le #If VBA7 et le #End If est ignoré.
    Comment se fait-il dans ce cas qu'une version comme XL2003 puisse lire ce code ? Et pourquoi le code qui suit (qui n'a aucun sens sans la déclaration) ne crée pas une erreur ?

    Thomas

  9. #9
    Expert éminent
    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
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut win64
    Tomtomtvn,

    Justement parce que la condition #If Win64 Then permet de contrôler avant le passage du code quelle version d'Office est utilisée. Donc pour une déclaration 32 sur un office 64 la condition n'est pas réalisée et cette partie du code sera ignorée tout simplement.

    Lors de la compilation, j'ai vu que tu avais un certain nombre d'erreurs à corriger.

    N'oublie pas

    Bonne Journée
    N'oubliez pas le Tag si la réponse donnée vous a été utile et pour une réponse pertinente.
    Retrouvez-moi sur le chat en salon base de données

+ 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