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

Excel Discussion :

Excel VBA erreur 49 : Convention d'appel de DLL incorrecte


Sujet :

Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 11
    Points : 20
    Points
    20
    Par défaut Excel VBA erreur 49 : Convention d'appel de DLL incorrecte
    Bonjour,
    Je cherche à réaliser une conversion d'heure UTC vers heure locale. La procédure que j'ai créée ci-dessous marche bien, mais j'ai le message d'erreur après
    la conversion au moment du retour vers le programme appelant.

    erreur d'éxécution '49':
    Convention d'appel de DLL incorrecte
    Où est mon erreur?


    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
    Option Explicit
     
    Type SystemTime
        iYear As Integer
        iMonth As Integer
        iDayOfWeek As Integer
        iDay As Integer
        iHour As Integer
        iMinute As Integer
        iSecond As Integer
        iMilliseconds As Integer
    End Type
     
    Public Type TimeZoneInfo
      Bias As Long
      StandardName(31) As Integer
      StandardDate As Date
      StandardBias As Long
      DaylightName(31) As Integer
      DaylightDate As SystemTime
      DaylightBias As Long
    End Type
     
    Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TimeZoneInfo) As Long
     
    Declare Function SystemTimeToTzSpecificLocalTime Lib "kernel32" (lpTimeZoneInformation As TimeZoneInfo, lpUniversalTime As SystemTime, lpLocalTime As SystemTime) As Long
     
    ' Procedure de test
    ' -----------------
    Public Sub Test_Utc2LocalTime()
    Dim testUTC As SystemTime
    Dim testLocal As SystemTime
     
    ' Initialiser Heure UTC avec heure actuelle pour tester
    testUTC.iYear = Year(Now)
    testUTC.iMonth = Month(Now)
    testUTC.iDay = Day(Now)
    testUTC.iHour = Hour(Now)
    testUTC.iMinute = Minute(Now)
    testUTC.iSecond = Second(Now)
     
    Call Utc2LocalTime(testUTC, testLocal)
     
    End Sub
     
    ' procédure de conversion
    ' -----------------------
    Public Sub Utc2LocalTime(ByRef stUTC As SystemTime, ByRef stLocal As SystemTime)
     
    Dim iStatus As Integer
    Dim tziZoneInfo As TimeZoneInfo
     
    iStatus = GetTimeZoneInformation(tziZoneInfo)
    iStatus = SystemTimeToTzSpecificLocalTime(tziZoneInfo, stUTC, stLocal)
     
    ' En pas a pas (mode débug) , jusqu'ici tout va bien, l'heure UTC est bien convertie dans la variable stLocal (2 heures de plus)
    ' donc l'appel de la DLL est sans doute correct
    ' le message d'erreur apparait ensuite, après l'éxécution de "end sub", au retour vers le programme appelant.
     
    End Sub
    * Merci *

  2. #2
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 2 155
    Points
    2 155
    Par défaut
    Bonjour,

    Risque d'erreur 1 : la fonction GetTimeZoneInformation retourne un Long or iStatus est déclaré comme étant un integer. Je suis pas sur que ce soit exactement pareil. Pour la forme, il vaudrait mieux déclarer iStatus comme étant un long. C'est plus propre.
    N°2 : Istatus n'est pas testé en retour. Il s'agit d'un code d'erreur... Cela peut être une indication.

    Vu le message d'erreur je penche pour le 1.

    Cdt

    Citation Envoyé par Patrick.Pipet Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Declare Function GetTimeZoneInformation Lib "kernel32" (lpTimeZoneInformation As TimeZoneInfo) As Long
    
    
    Dim iStatus As Integer
    iStatus = GetTimeZoneInformation(tziZoneInfo)
    iStatus = SystemTimeToTzSpecificLocalTime(tziZoneInfo, stUTC, stLocal)

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 11
    Points : 20
    Points
    20
    Par défaut
    Merci de cette réponse si rapide.
    En fait j'avais déjà vu et même en déclarant iStatus en long ça fait pareil.

    Le problème semble être dans l'appel de la procédure (ou plutôt dans le retour vers la procédure appelante) , puisque avec le débugger j'arrive bien à voir la date convertie, la valeur du status de retour (qui vaut 1).

  4. #4
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 11
    Points : 20
    Points
    20
    Par défaut
    Bonjour Derek,

    J'ai fini par trouver le bug. C'est dans la définition du type SystemTime, j'avais défini avec des Interger et ça marche en déclarant les variables en long.
    Ce qui m'a trompé c'est que l'appel s'éxécute bien et que l'erreur est indiquée plus loin.

    donc la bonne définition du type est:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Type SystemTime
        iYear As Long
        iMonth As Long
        iDayOfWeek As Long
        iDay As Long
        iHour As Long
        iMinute As Long
        iSecond As Long
        iMilliseconds As Long
    End Type
    De toute façon j'ai compris maintenant qu'il vaut mieux déclarer les entiers en Long plutôt qu'en Integer.

    En tout cas merci d'avoir regardé mon problème.

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

Discussions similaires

  1. [XL-2007] Excel VBA Erreur lors d'une boucle --> Macro Envoi automatique PDF via Outlook
    Par Oulol dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 15/07/2014, 13h14
  2. Réponses: 1
    Dernier message: 14/04/2012, 17h43
  3. [XL-2010] Erreur convention d'appel de .DLL incorrect sur import de classe
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 03/09/2011, 12h23
  4. Erreur d'execution '49': convention d'appel de DLL incorrecte
    Par papse dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/05/2009, 09h04
  5. EXCEL/ VBA Erreur sur le code VBA : rediriger l’erreur
    Par hiline6 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 28/12/2006, 16h28

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