Bonjour l'ami,
si ça peut t'aider
En VBA (Visual Basic for Applications), une structure (ou Type) déclarée comme
Private dans un module est accessible uniquement au sein de ce module. Cela signifie que si vous essayez de la passer comme argument à une fonction qui se trouve dans un autre module ou un autre contexte, cela entraînera une erreur.
Pour contourner ce problème, voici quelques options :
1. Déclarer la structure comme Public
Si vous avez besoin que votre structure soit accessible en dehors de son module, déclarez-la comme
Public :
vba
Copier le code
' Dans un module standard
Public Type MonType
Valeur1 As String
Valeur2 As Integer
End Type
Avec une structure publique, vous pourrez passer cette structure comme argument d'une fonction, même si celle-ci se trouve dans un autre module :
vba
Copier le code
' Fonction acceptant une structure en argument
Public Function TraitementMonType(ByVal data As MonType) As String
TraitementMonType = data.Valeur1 & " - " & data.Valeur2
End Function
Et dans votre code principal, vous pouvez appeler la fonction :
vba
Copier le code
Sub TestPassageStructure()
Dim info As MonType
info.Valeur1 = "Bonjour"
info.Valeur2 = 42
MsgBox TraitementMonType(info)
End Sub
2. Utiliser une variable globale pour contourner la portée
Si vous ne voulez pas rendre la structure publique mais que vous devez la partager, vous pouvez utiliser une variable globale (dans un module standard) :
vba
Copier le code
' Structure privée et variable globale dans le même module
Private Type MonType
Valeur1 As String
Valeur2 As Integer
End Type
Private GlobalStruct As MonType
Puis, utilisez des fonctions ou des sous-programmes pour modifier ou lire la structure depuis d'autres modules :
vba
Copier le code
' Fonction pour affecter des valeurs
Public Sub SetStruct(v1 As String, v2 As Integer)
GlobalStruct.Valeur1 = v1
GlobalStruct.Valeur2 = v2
End Sub
' Fonction pour lire ou traiter la structure
Public Function GetStruct() As String
GetStruct = GlobalStruct.Valeur1 & " - " & GlobalStruct.Valeur2
End Function
Appel dans un autre module :
vba
Copier le code
Sub TestVariableGlobale()
Call SetStruct("Hello", 100)
MsgBox GetStruct()
End Sub
3. Redéfinir la même structure dans plusieurs modules
Si vous insistez pour garder la structure
Private dans chaque module, une autre approche consiste à redéfinir la même structure (avec le même nom et les mêmes membres) dans chaque module où elle est nécessaire. Voici un exemple :
vba
Copier le code
' Dans Module1
Private Type MonType
Valeur1 As String
Valeur2 As Integer
End Type
Public Sub FonctionModule1()
Dim info As MonType
info.Valeur1 = "Test"
info.Valeur2 = 123
Call FonctionModule2(info)
End Sub
vba
Copier le code
' Dans Module2
Private Type MonType
Valeur1 As String
Valeur2 As Integer
End Type
Public Sub FonctionModule2(data As MonType)
MsgBox data.Valeur1 & " - " & data.Valeur2
End Sub
Cette approche fonctionne, mais il est important que les deux structures soient définies exactement de la même manière. Sinon, des erreurs peuvent survenir.
4. Utiliser des paramètres spécifiques au lieu de la structure
Si vous avez une structure privée et que vous ne voulez pas la rendre publique, vous pouvez passer ses membres individuellement à la fonction, plutôt que de passer la structure elle-même :
vba
Copier le code
' Structure privée
Private Type MonType
Valeur1 As String
Valeur2 As Integer
End Type
' Fonction utilisant des arguments séparés
Public Function TraitementValeurs(V1 As String, V2 As Integer) As String
TraitementValeurs = V1 & " - " & V2
End Function
Sub TestPassageParValeur()
Dim info As MonType
info.Valeur1 = "Exemple"
info.Valeur2 = 50
MsgBox TraitementValeurs(info.Valeur1, info.Valeur2)
End Sub
Conclusion
La meilleure méthode dépend de votre contexte :
- Utilisez Public Type si vous avez besoin que la structure soit largement accessible.
- Utilisez des variables globales ou redéfinissez localement la structure pour préserver la portée.
- Passez des arguments individuels si les membres de la structure sont peu nombreux.