XL 2016 Macro ne fonctionne plus sur Excel 2016

pad01

XLDnaute Occasionnel
Bonjour le Forum,
J'ai récupéré sur le forum un fichier de kjin sur un QCM.
Sur Excel 2010, il fonctionne à merveille mais sur Excel 2016, les liaisons avec les userforms ne se font plus (les écritures n'apparaissent plus).
Pouvez-vous m'apporter de l'aider et m'expliquer ce dysfonctionnement car je crains rencontrer cette difficulté sur d'autre fichier.
Merci de votre aide
Bien à vous
 

Fichiers joints

Staple1600

XLDnaute Barbatruc
Bonjour le fil, pad01, riton00

pad01
Tu n'auras pas un Excel 2016 64 bits par hasard?

Avec Excel 2016, il ne fonctionne pas, mais est-ce que des messages d'erreur s'affichent?
Si oui, lesquels?
 

pad01

XLDnaute Occasionnel
Bonjour Le Forum
Bonjour riton00, Bonjour Staple1600
Merci à tous ceux qui m'ont lu
Pour riton00, non je ne l'ai pas encore fait et je vais le faire. Merci de ton aide
Pour Staple1600, j'ai résolu mon problème car la couleur de fond du Userform est plus foncée sur la version 2016 que celle 2010. Donc l'écriture en noire n'est pas visible.
Par contre, j'ai un nouveau problème compatibilité avec la version 2019. J'ai effectivement un message d'erreur concernant le module 2 et plus particulièrement sur le 64 bits. Je te poste l'image d'erreur. Est-ce que cela te parles ?
Ce fichier est une aide pour un groupe de personnes qui vont passer un examen en fin d'année. C'est pour cela que je me retrouve avec plusieurs version d'excel...
Merci de ton aide
A+
 

Fichiers joints

Staple1600

XLDnaute Barbatruc
Be

Oui, c'est le coup classique
Voir du côte de PtrSafe (à ajouter dans les déclarations)
Je te laisse faire les recherches sur G..gle avec ces mots-clés: VBA excel PtrSafe 64bits
 

Roland_M

XLDnaute Barbatruc
Bonjour tout le monde !
EDIT: Salut à toi Staple !

essais comme ceci:
rem: ne t'inquiètes pas si tu as des lignes rouges par exemple avec 2007 ça fonctionne tout de même

Code:
#If VBA7 Then 'VBA7 depuis office 2010
    Dim handle As LongPtr '#####
    #If Win64 Then 'avec PtrSafe avec LongPtr
        Private Declare PtrSafe Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
        Private Declare PtrSafe Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As LongPtr
    #Else 'sans PtrSafe avec LongPtr
        Private Declare Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As LongPtr) As LongPtr
        Private Declare Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As LongPtr
    #End If
#Else '< VBA7 donc 32 As Long
    Dim handle As Long '#####
    Private Declare Function SetTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long
    Private Declare Function KillTimer Lib "User32" (ByVal hwnd As Long, ByVal nIDEvent As Long) As Long
#End If
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour Roland_M
Il faut …lpTimerFunc As LongPtr avec PtrSafe. C'est une adresse ! Avec Long, AdressOf TimerProc plantera.
 
Dernière édition:

Roland_M

XLDnaute Barbatruc
re

Salut Dranreb !
je vois pas !? je n'ai fais que rajouter les tests VBA7 et Win64 à ses deux fonctions !?
ce sont des exemples que je garde sous la main ! s'il y a erreur je suis preneur, merci d'avance de corriger !
 

Dranreb

XLDnaute Barbatruc
Oui, il y aura un plantage si on tente de passez au SetTimer un AdressOf NomDeProcédure en guise de ByVal lpTimerFunc As Long. Il faut l'y déclarer ByVal lpTimerFunc As LongPtr.
 

Roland_M

XLDnaute Barbatruc
d'accord ! pas évident d'assimiler ça !?
comment savoir ou mettre As Long ou LongPtr entre les paranthèses ?
 

Dranreb

XLDnaute Barbatruc
Il faut LongPtr si c'est une adresse. Pas de raison à priori si c'est autre chose.
Mais il peut y avoir des exceptions :
Private Declare PtrSafe Sub MoveMemory Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Destination As Any, ByRef Source As Any, ByVal Length As LongPtr)
Length n'est pas une adresse, mais, s'il travaille sur système 64 bits il peut en théorie aussi être amené à déplacer une zone de mémoire dont la taille en octets peut dépasser la capacité d'adressage sur 32 bits.
 

Dranreb

XLDnaute Barbatruc
je ne vois pas l'utilité des api
application .ontime conviendrait très bien
Je ne sais pas dans ce cas, je n'ai pas étudié le contexte. Mais Application.OnTime ne permet qu'une planification à la seconde près, y compris 0 si on veut, ce qui peut être trop fréquent. Mais c'est mieux toléré par Excel si la procédure périodique invoque ses méthodes (danger de plantage sévère et silencieux avec un Timer Windows). Les Timer sont surtout utiles pour des actions périodiques purement VBA. J'ai d'ailleurs écrit du code pour pouvoir les utiliser dans un UserForm.
 

pad01

XLDnaute Occasionnel
Bonjour le Forum,
Bonjour Drnreb,
Si je comprends bien, c'est le timer qui pose problème ?
Merci de ton aide
Merci à Staple1600, Roland_M et patricktoulon pour vos aide.
A+
 

Staple1600

XLDnaute Barbatruc
Re,

Tu ne m'as dit si tu avais été lire la doc de Microsoft?
(voir le lien que je t'ai mis dans le message#17)
Car on y trouve l'exemple d'écriture à utiliser
VB:
#if Vba7 then 
'  Code is running in the new VBA7 editor 
     #if Win64 then 
     '  Code is running in 64-bit version of Microsoft Office 
     #else 
     '  Code is running in 32-bit version of Microsoft Office 
     #end if 
#else 
' Code is running in VBA version 6 or earlier 
#end if 
 
#If Vba7 Then 
Declare PtrSafe Sub... 
#Else 
Declare Sub... 
#EndIf
 

Discussions similaires


Haut Bas