Variable de "type"

Résolu
codebleu Messages postés 30 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 6 mai 2009 - 2 avril 2007 à 14:42
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 5 avril 2007 à 18:54
Bonjour,

J'aimerais pouvoir utiliser les valeurs d'une variable déclarée "Public" de la forme "Type...End Type" dans une macro "MaMacro1.xla" en échange avec une autre macro "MaMacro2.xla".
Et bien sûr, cela ne marche pas ! Je précise bien que cela est fait en VBA.

L'idée est la suivante ;

Déclaration dans MaMacro1.xla :

Public Type MaVariable
    MaSousVar1 as Double
    MaSousVar2 as Double
    MonAutreVar as String  
End Type

J'affecte des valeurs à "MaVariable" et je souhaiterais utiliser les mêmes désignation de variables dans une autre macro "MaMacro2.xla" . Comme par exemple ;

Sub MaSubDansMaMacro2()
    MsgBox "MaSousVar1=" & MaVariable.MaSousVar1
End Sub

En fait, la variable de type "MaVariable" n'est pas reconnue dans la macro "MaMacro2.xla" alors qu'elle est déclarée en Public...

Si vous avez des solutions pour m'aider, elles sont les bienvenues,

Bleu le code...

11 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
5 avril 2007 à 18:54
Salut,

ça changera rien... Quand on dit, "on peut pas passer une variable entre projet", c'est pas pour t'embêter juste à toi, c'est qu'on peut vraiment pas.

Le coup de la DLL, beh mon module de classe, si tu le compile, sera une dll, mais il faut bien dans tous les cas stocker la variable qque part car, tu transmets une info à un Projet1, qui est récupéré par un projet2. Dans ce cas précis, elle ne servirait qu'à faire maillon pour passage d'info

@++





<hr width="100%" size="2" />

  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
2 avril 2007 à 21:00
Salut
En effet, contrairement à ce que dit l'aide, la déclaration "Public" d'un Type ne donne pas une portée à tous les projets.
La portée se limite à tous les éléments du projet en cours (feuilles, modules, ...)

Maintenant, il est très simple de dupliquer cette déclaration de type dans un des modules de l'autre projet pour pouvoir en profiter.
Par contre, c'est vrai, tu ne pourras pas lire le contenu des variables entre les Projets.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Champion du monde de boule de cristal - 2005
Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
codebleu Messages postés 30 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 6 mai 2009
2 avril 2007 à 22:54
Merci pour ta réponse.

En fait, je me doutais un peu de cela...

Et j'aimerais savoir si les modules de classes en vba seraient plus adapté à ce que je recherche.

Notamment, la communication des valeurs de variables en envoi/retour au travers de classeurs ayant des macros (xla). Mon idée est de pouvoir faire transiter des données pour le calcul d'une macro (ex: MonClasseur1.xla!MaMacro1(Arg1,1rg2...)) et de les récupérer dans d'autres classeurs (ex: MonClasseur2.xla!MaMacro2(Arg1, Arg2...)).

Je connais un peu les structures Property Set / Property Let / Property Get, mais je ne vois pas trop comment utiliser cela pour ce but de communication entre classeurs.

Il y aurait-il un intérêt dans mon cas à faire des fichiers xml car j'utilise bien sûr des bases de données sur des Feuilles Excel.

J'espères ne pas trop en demander, mais je me pose des questions...

Merci d'avance,

Patrice

Bleu le code...
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
2 avril 2007 à 22:58
Est-ce que quelque chose t'empêche de mettre tes 2 procédures (de tes 2 projets xla) ensemble dans un même projet xla ?

MPi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 avril 2007 à 00:36
Re
Judicieuse question.
Comment faire communiquer deux applications entre elles ?
Anciennement, il y avait les liens DDE (Dynamic Data Exchange) entre applications.
Cette technique dite "peu sûre" est maintenant abandonnée sous Vista mais fonctionne toujours sous XP.
Tu peux l'expérimenter, c'est assez simple à mettre en oeuvre à condition de bien respecter certaines règles.

Elle a été remplacée par d'autres techniques comme les liaisons OLE (Object Linking and Embedding).
Dans le cas d'Excel, c'est assez simple puisqu'il suffit qu'il y ait une feuille Excel dont les cellules servent de stockage pour les échanges.
Depuis l'extérieur, il te suffit de venir lire te connecter, comme à une base de données.

Consulte l'aide de Excel sur ces mots DDE et OLE et ils expliquent quels objets peuvent communiquer et comment créer ces liens.
Sous Office 2003, c'est assez bien expliqué.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
3 avril 2007 à 00:37
PS : Les Classes ont les même étendues d'action que les Modules, donc pas applicable non plus.
0
codebleu Messages postés 30 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 6 mai 2009
3 avril 2007 à 08:04
Salut,

Merci pour toutes ces infos.

Je dois donc en conclure que la solution la plus adaptée à mon besoin serait plus un logiciel type VB 2005 qui devrait permettre de créer des dll et des xml pour pouvoir communiquer entre projets.

Je ne connais que superficiellement VB2005 mais ayant vu une démo j'ai cru comprendre qu'on pouvait avoir des liens avec SDL Server. Et créer des dll pour les calculs dont j'ai besoin.

Si vous pouviez me donner votre avis...

Merci

Patrice

Bleu le code...
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
3 avril 2007 à 08:12
Pourquoi ne pas faire une petite classe d'écriture / lecture de valeur dans un *.txt ?
T'inclues cette classe dans tes 2 macros complémentaires, et quand t'as besoin, TaClass.ReadVar(tesParams), etc.. enfin un truc comme ça.
Vite fait à mettre en place.

@++

<hr width="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
codebleu Messages postés 30 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 6 mai 2009
3 avril 2007 à 10:44
Mortalino ta proposition est interressante, pourrais-tu détailler un peu le fonctionnement. Notamment, pour appeler les variables via le fichier texte...

Patrice

Bleu le code...
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
3 avril 2007 à 21:31
Oui, bien sûr,

tes types sont donc cela :

Public Type MaVariable
    MaSousVar1 as Double
    MaSousVar2 as Double
    MonAutreVar as String  
End Type

Tu peux les reprendres différemment dans une classe :

Pour l'exemple, crée un nouveau Module de Classe, nomme le MaClasse et colle ce code :

Private CheminFicherDeStockage  As String

Function ReadVar(ByRef Valeur1 As Double, ByRef Valeur2 As Double, ByRef AutreValeur As String) As Boolean
    Dim ff          As Integer
    Dim temp        As String
    Dim tempLine()  As String

On Error GoTo MyEnd
CheminFicherDeStockage =  Application.Path & "\Stockage variable.txt"
ff = FreeFile

    Open CheminFicherDeStockage For Input As #ff
        temp = Input(LOF(ff), #ff)
    Close #ff
    
tempLine = Split(temp, vbCrLf)
Valeur1 = CDbl(Mid(tempLine(0), InStr(1, tempLine(0), ";") + 1))
Valeur2 = CDbl(Mid(tempLine(1), InStr(1, tempLine(1), ";") + 1))
AutreValeur = Mid(tempLine(2), InStr(1, tempLine(2), ";") + 1)

WriteVar = True
Erase tempLine
MyEnd:
End Function

Function WriteVar(ByRef Valeur1 As Double, ByRef Valeur2 As Double, ByRef AutreValeur As String) As Boolean
    Dim ff          As Integer
    Dim temp        As String
    Dim tempLine()  As String

On Error GoTo MyEnd
CheminFicherDeStockage = Application.Path & "\Stockage variable.txt"
ff = FreeFile

    Open CheminFicherDeStockage For Output As #ff
        Print #ff, "Valeur1;" & Valeur1
        Print #ff, "Valeur2;" & Valeur2
        Print #ff, "AutreValeur;" & AutreValeur;
    Close #ff
    
WriteVar = True
MyEnd:
End Function

~ <small> Mortalino ~ Colorisation automatique </small>

Ensuite quand tu as besoins de récupérer tes valeurs, il suffit de lire (n'oublie pas aussi d'écrire dès que tes valeurs sont modifiées d'une macro ou de l'autre :

Sub test_Ecriture()
    Dim Imp_Export As New MaClasse

Dim TaVar1 As Double: TaVar1  = 123.123
Dim TaVar2 As Double: TaVar2 =  456.456
Dim TaVar3 As String: TaVar3 = "salut"

MsgBox Imp_Export.WriteVar(TaVar1, TaVar2, TaVar3)

End Sub

Sub test_Lecture()
    Dim Imp_Export As New MaClasse

Dim TaVar1 As Double
Dim TaVar2 As Double
Dim TaVar3 As String

MsgBox Imp_Export.ReadVar(TaVar1, TaVar2, TaVar3)

MsgBox "Valeur 1 : " & TaVar1 & vbCrLf & _
        "Valeur 2 : " & TaVar2 & vbCrLf & _
        "Valeur 3 : " & TaVar3

End Sub

~ <small> Mortalino ~ Colorisation automatique </small>

Bonne prog ;)

@++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
codebleu Messages postés 30 Date d'inscription mardi 30 mai 2006 Statut Membre Dernière intervention 6 mai 2009
5 avril 2007 à 18:36
Merci Mortalino,

Ton code fonctionne effectivement bien ! (Il faut quand même corriger dans la fonction

ReadVar() ou WriteVar = 
True


doit être ReadVar). Ceci dit, je n'aurais pas de communication dynamique de variables multiples entre classeurs portant des macros (.xla). Il faudra que j'enregistre le fichier ".txt" et j'ouvre... Mais c'est une façon de fonctionner possible!

Ce que je recherche vraiment c'est pouvoir passer des paramètres et avoir en retour d'autres paramètres sans passer par du stockage dans un fichier.

C'est pourquoi je pense aux librairies type ".dll", mais on ne peut pas les créer en vba me semble-t-il. Et je ne sais pas si en VB2005 on peut le faire ?

Si quelqu'un le sait cela m'intéresse beaucoup !




Est-ce qu'il faut aller voir dans d'autres thèmes de forum ?

A vous lire et merci à tous,

Patrice





Bleu le code...
0
Rejoignez-nous