Bonjour,
Dans un développement Excel VBA, j'enregistre l'adresse mémoire d'un objet avec ObjPtr, pour retrouver plus tard une référence à l'objet avec RtlMoveMemory. Le problème est que dans certains cas, l'adresse enregistrée n'est plus valable au moment où j'essaie de l'utiliser. Du coup, la création d'objet fonctionne (ou en tout cas elle ne provoque pas d'erreur), mais quand j'invoque une méthode de cet objet, ça plante Excel.
Je cherche donc un moyen de tester que le numéro de pointeur est toujours valable, ou que l'objet renvoyé est correct, du bon type, etc., pour abandonner la création d'objet et éviter le plantage.
Je ne m'y connais pas trop en programmation système, donc toute piste sera la bienvenue !
Les infos détaillées : je suis en Excel 2010 sur du Windows 7 SP1 64 bit. J'utilise le CustomUI, et l'objet que je référence est le ruban personnalisé (classe IRibbonUI).
Voici les lignes pertinentes de mon code :
Code VBA : 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 ' déclarations Private iRuban As IRibbonUI Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (lpDest As Any, lpSource As Any, ByVal cBytes&) ' enregistrement de l'adresse mémoire de l'objet ribbon dans un name du fichier Excel Sub ruban_chg(ribbon As IRibbonUI) ' événement qui se produit au chargement du ruban Set iRuban = ribbon ThisWorkbook.Names(NOMRUBAN_REVLIST).RefersTo = ObjPtr(ribbon) End Sub ' récupération de l'objet ruban Function Ruban() As IRibbonUI Dim ribbonPointer As Long If iRuban Is Nothing Then ribbonPointer = Mid(ThisWorkbook.Names(NOMRUBAN_REVLIST).Value, 2) ' le premier caractère est un = généré par Excel If ribbonPointer <> 0 Then Call CopyMemory(iRuban, ribbonPointer, 4) Set Ruban = iRuban End Function ' ça plante ensuite quand je fais par exemple ça : Ruban.Invalidate
En vous remerciant,
Partager