XL 2016 VBA - Comment passer une structure Private en argument d'une fonction ?

Dudu2

XLDnaute Barbatruc
Bonjour,

On peut passer en argument d'une fonction une structure Public ByRef.
Excel refuse de le faire avec une structure Private.

1734968809644.png


Y a-t-il un moyen détourné de le faire en la mappant sur son adresse ou autre ?
 

Pièces jointes

  • Classeur1.xlsm
    22 KB · Affichages: 8

Dudu2

XLDnaute Barbatruc
Sinon, est-ce normal qu'il y ait une erreur de compilation avec #39 ?
J'ai reposté le fichier avec des #if VBA7 en supposant que c'est la cause de l'erreur vu que tu ne la précises pas.

Je n'ai toujours pas compris l'intérêt de se forcer à limiter la portée des variables et de pondre une usine à gaz pour contourner le problème engendré
@TooFatBoy, tu veux vraiment que je te repose le problème tel qu'énoncé en privé ?

Tu as 3 modules pré-construits: Module_A, Module_B, Module_C. (c'est précisément le cas ici)
Dans un classeur, tu peux utiliser les combinaisons suivantes:
Classeur1 -> Module_A et Module_B
Classeur2 -> Module_A et Module_C
Classeur3 -> Module_B et Module_C
Classeur4 -> Module_A et Module_B et Module_C

Explique-moi dans quel Module tu places la déclaration Public de la structure ? Sachant que tu peux n'avoir qu'une seule fois cette déclaration Public dans un classeur.
 

TooFatBoy

XLDnaute Barbatruc
@TooFatBoy, tu veux vraiment que je te repose le problème tel qu'énoncé en privé ?
Non, en français correct comme ci-dessous c'est mieux car ça devient compréhensible. ;)


Tu as 3 modules pré-construits: Module_A, Module_B, Module_C. (c'est précisément le cas ici)
Dans un classeur, tu peux utiliser les combinaisons suivantes:
Classeur1 -> Module_A et Module_B
Classeur2 -> Module_A et Module_C
Classeur3 -> Module_B et Module_C
Classeur4 -> Module_A et Module_B et Module_C

Explique-moi dans quel Module tu places la déclaration Public de la structure ? Sachant que tu peux n'avoir qu'une seule fois cette déclaration Public dans un classeur.
Comme dit précédemment : dans le module que tu veux.
Autrement dit tu mets la déclaration dans les trois modules et selon les modules que tu mets dans ton classeur tu mets en commentaire dans le(s) module(s) ad hoc.

Sinon, le plus simple est que tu crées un quatrième module dans lequel tu définis ta variable. ;)
 

Dudu2

XLDnaute Barbatruc
@TooFatBoy
Autrement dit tu mets la déclaration dans les trois modules et selon les modules que tu mets dans ton classeur tu mets en commentaire dans le(s) module(s) ad hoc.
Non car les modules sont pré-construits (à utiliser tels quels) pour qu'on n'ait précisément pas de question à se poser sur une modification obligatoire à faire ici ou là pour rendre une déclaration Public.

Sinon, le plus simple est que tu crées un quatrième module dans lequel tu définis ta variable. ;)
Oui, je l'aurais peut-être fait si le passage par adresse n'avait pas fonctionné. Mais c'est un truc en plus à gérer/trimbaler.

et de pondre une usine à gaz pour contourner le problème engendré
Justement, le passage par adresse, une fois le copymemory maîtrisé (c'est le plus délicat), est d'une extrême simplicité.
 

patricktoulon

XLDnaute Barbatruc
re
Bonjour à tous
oui moi aussi comme toofatboy je me pose des questions sur l'utilité d'un tel stratagème
les blocs type sont bien pratiques pour attribuer des membres a une variable
en public utilisable partout ,d'ailleurs je l'utilise de cette manière dans mon ScreenCatalog
même si j'ai apprécié le fait de travailler sur l'idée(c'est toujours intéressant de travailler en dehors des sentiers battus)
avec chatGPT qui pour une fois m'a donné la bonne voie
après certainement que @Dudu2 a ces raisons d'un tel besoin
 

patricktoulon

XLDnaute Barbatruc
@patricktoulon,

Tu veux dire qu'on aurait pu utiliser le pointeur ?
BOOL GetMonitorInfoW(
[in] HMONITOR hMonitor,
[out] LPMONITORINFO lpmi
);

Mais alors comment baser MONITORINFO sur ce pointeur ? En utilisation les copymemory ?
non je veux dire qu'il faut utiliser celle ci a la place de getmonitorinfoA
getmonitorinfo en dessous XP
au dessus GetmonitorinfoW ilest plus stable et d'autres membre dans le type monitorinfo peuvent être mis en place notamment le displayname qui ne fonctionne pas sur W10 avec getmonitorinfoA
du coup j'ai supprimé les api displaydevice de mon module
 

Dudu2

XLDnaute Barbatruc

Discussions similaires

Statistiques des forums

Discussions
315 123
Messages
2 116 457
Membres
112 752
dernier inscrit
PUARAI29