Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
Vieux 02/07/2009, 07h14   #1 (permalink)
Nouveau membre du Club
 
Date d'inscription: juillet 2002
Messages: 54
Par défaut Pb Appel fonction API Méthode de classe

Bonjour à tous

Voila, je vous explique mon Pb, Je désire créer une classe TTimer en VBA
pour se faire j'utilise les Fonctions de l'API Windows : SetTimer et KillTimer

Code :
 
 
Declare Function SetTimer Lib "user32" Alias "SetTimer" (ByVal hWnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
 
Ma question est la suivante:

Le paramètre < lpTimerFunc > attend en principe (AddresseOf: procedureName)
Est t'il possible de passer comme paramètre à lpTimerFunc une methode de ma classe
Si oui comment proceder ?

D'avance merci
__________________
C++ BUILDER & DELPHI
Laurent GAUDILLIER est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/07/2009, 10h11   #2 (permalink)
Membre Expert
 
Date d'inscription: mai 2005
Localisation: IDF - 94
Messages: 1 396
Par défaut

salut,
pour un Timer sans formulaire, voir http://access.developpez.com/sources...ev#TimerSsForm

__________________
Merci de ne pas m'envoyer de message privé pour des pb techniques
micniv est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/07/2009, 10h22   #3 (permalink)
Rédacteur/Modérateur
 
Avatar de Arkham46
 
Date d'inscription: septembre 2003
Localisation: Orléans
Messages: 3 207
Par défaut

Citation:
Envoyé par Laurent GAUDILLIER Voir le message
Est t'il possible de passer comme paramètre à lpTimerFunc une methode de ma classe
Non, il faut obligatoirement une fonction dans un module standard.
Mais tu peux passer le module de classe en paramètre en utilisant le pointeur de la classe comme identifiant de timer.
Comme ça il est tout de même possible de profiter des modules de classe pour créer des objets Timer.

Le code suivant est testé avec Excel 2002 :

Code Module de classe clTimer :
 
'***************************************************************************************
'*                             MODULE POUR TIMER                                       *
'***************************************************************************************
' Gestion de timer avec renvoi de l'événement à une instance de classe
'***************************************************************************************
' Auteur : Thierry GASPERMENT (Arkham46)
' Le code est libre pour toute utilisation
'***************************************************************************************
Option Explicit
'***************************************************************************************
'*                                 VARIABLES                                           *
'***************************************************************************************
Private gHwnd As Long
Private gTimerStarted As Boolean
'***************************************************************************************
'*                                 EVENEMENTS                                          *
'***************************************************************************************
Public Event OnTimer()
'***************************************************************************************
'*                                       API                                           *
'***************************************************************************************
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
        (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
' Déclaration d'API pour timer
Private Declare Function APISetTimer Lib "user32.dll" Alias "SetTimer" _
        (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerProc As Long) As Long
Private Declare Function APIKillTimer Lib "user32.dll" Alias "KillTimer" _
        (ByVal hwnd As Long, ByVal uIDEvent As Long) As Long
'***************************************************************************************
'*                                    FONCTIONS                                        *
'***************************************************************************************
' Démarre le timer (interval en ms)
Public Sub StartTimer(interval As Long)
    Dim lHwnd As Long
    lHwnd = FindWindow("xlMain", Application.Caption)
    If lHwnd <> 0 Then
        gTimerStarted = (APISetTimer(lHwnd, ObjPtr(Me), interval, AddressOf Callback_Timer) <> 0)
        gHwnd = lHwnd
    Else
        gTimerStarted = False
    End If
End Sub
' Arrête le timer ()
Public Sub StopTimer()
    If gTimerStarted Then APIKillTimer gHwnd, ObjPtr(Me)
End Sub
 
Public Sub TimerProc()
    On Error Resume Next
    RaiseEvent OnTimer
End Sub
 
Private Sub Class_Terminate()
    If gTimerStarted Then StopTimer
End Sub
 

Code Module standard ModTimer :
 
'***************************************************************************************
'*                             MODULE POUR TIMER                                       *
'***************************************************************************************
' Gestion de timer avec renvoi de l'événement à une instance de classe
'***************************************************************************************
' Auteur : Thierry GASPERMENT (Arkham46)
' Le code est libre pour toute utilisation
'***************************************************************************************
Option Explicit
'***************************************************************************************
'*                                    FONCTIONS                                        *
'***************************************************************************************
' Callback_Timer est appelé par les timers à intervalle régulier
' wparam contient la classe qui a initié le timer
Public Function Callback_Timer(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As clTimer, ByVal lParam As Long) As Long
' Citation de l'aide de AddressOf :
'Étant donné que l'appelant d'un rappel ne se trouve pas dans votre programme,
'il est important qu'une erreur rencontrée dans la procédure de rappel ne se propage pas
'dans l'appelant. Pour ce faire, insérez l'instruction On Error Resume Next
'au début de la procédure de rappel.
    On Error Resume Next
    ' renvoie l'événement à la classe qui a initié le timer
    wParam.TimerProc
End Function
 

Code Exécution des timers dans ThisWorkBook :
 
Option Explicit
 
' 2 timers avec événement (on doit être dans un objet de classe pour utiliser WithEvents)
Private WithEvents oTimer1 As clTimer
Private WithEvents oTimer2 As clTimer
 
' Démarre les 2 timers
Function StartTimer()
Set oTimer1 = New clTimer
Set oTimer2 = New clTimer
oTimer1.StartTimer 1000
oTimer2.StartTimer 2000
End Function
 
' Arrête les 2 timers
Function StopTimer()
oTimer1.StopTimer
oTimer2.StopTimer
End Function
 
' Sur Timer 1
Private Sub oTimer1_OnTimer()
Debug.Print "Timer1", Now
End Sub
 
' Sur Timer 2
Private Sub oTimer2_OnTimer()
Debug.Print "Timer2", Now
End Sub
 
Arkham46 est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 02/07/2009, 15h00   #4 (permalink)
Nouveau membre du Club
 
Date d'inscription: juillet 2002
Messages: 54
Par défaut

Merci à toi Arkham46 il est vrai que je n'avais pas vu les choses sous cet angle !!!

Ta classe me parait interssante, je vais d'ailleurs m'en inspirer ....

Encore une fois un grand merci à vous tous et plus particulièrement à
Arkham46

Bonne journée à tous

Sincères salutation

Laurent
__________________
C++ BUILDER & DELPHI
Laurent GAUDILLIER est déconnecté   Envoyer un message privé Réponse avec citation
NEWS EXCELF.A.Q EXCELTUTORIELS EXCELSOURCES EXCELOUTILS EXCELLIVRES EXCELOFFICE 2010

Réponse Proposer ce sujet en actualité

Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non



Fuseau horaire GMT +1. Il est actuellement 02h10.


Vos questions techniques : forum d'entraide Excel - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Hébergement - Participez - Copyright © 2000-2010 www.developpez.com - Legal informations.