IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Module de classe - Liens de parentés entre classes


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut Module de classe - Liens de parentés entre classes
    Bonjour à tous,

    Il s'agit de mon premier poste mais d'une nième consultation de cet ecxellent forum.
    J'ai ici une classe "Label" qui parmi ses attributs on y trouve "Position", correspondant à la colonne où se situe ce Label (soit un libellé) dans un objet type Tableau ou Worksheet. Cela dit, j'ai également une classe "TabData" qui n'est autre qu'une classe faisant référence à un objet type Tableau ou Worksheet mais qui possède un attribut "LabelsDict" qui est un dictionnaire contenant tout les Label qui y figurent. Enfin une dernière classe "TabDatas" me sert à répertorier toutes les classes TabData lui concernant via l'attribut "TabDatasDict".

    Mon objectif est de pouvoir attribuer à chaque libellé (LabelA, LabelB...), de chacune des feuilles 1 et 2, un indice colonne selon sa TabData, voici un exemple pour appeler la position du LabelA, de la TabData "Feuil1" (correspondant dans le dictionnaire TabDataList à TabDataList(1)), de la TabDatas "Classeur1":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Classeur1.TabDatasList(1).LabelsList(LabelA).Position
    Je suis certain que mon explication sera peu clair, je vous laisse donc en pièce jointe ce que j'ai tenté pour le moment. Si vous lancez la sub "DefinirPositionLabels" dans le module "Tests", vous verrai sur la console d'exécution qu'on obtient la "Position" pour "LabelA" que se soit sur Feuil1 ou Feuil2 (soit 3), ce qui n'est pas le résultat attendu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Debug.Print Classeur1.TabDatasList(1).WkSheet.Name & " " & Classeur1.TabDatasList(1).LabelsList(LabelA).Name & " " & Classeur1.TabDatasList(1).LabelsList(LabelA).Position
    Debug.Print Classeur1.TabDatasList(2).WkSheet.Name & " " & Classeur1.TabDatasList(2).LabelsList(LabelA).Name & " " & Classeur1.TabDatasList(2).LabelsList(LabelA).Position
    Console d'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Feuil1 LabelA 3
    Feuil2 LabelA 3
    Auriez vous des pistes ?

    Merci à vous tous!

    PS: Je me suis aidé dans un premier temps du code de dysorthographie (un grand merci btw!), https://www.developpez.net/forums/d1...buts-d-classe/

    Les différents modules, sub et classes :

    1. Module "Tests"
    > Déclarations

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Public LabelA  As New Label, LabelB As New Label, LabelC As New Label, LabelD As New Label, LabelE As New Label, LabelF As New Label
    Public Feuil1 As New TabData, Feuil2 As New TabData
    Public Classeur1 As New TabDatas
    > Sub DefinirPositionLabels()

    Code : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    Sub DefinirPositionLabels()
     
    Dim i As Byte, j As Byte
     
        'Initialisation de la classe TabDatas - Classeur1 - stockant tout les TabData - Feuil1 et Feuil2
        Set Classeur1.AddTabData(Feuil1) = Feuil1
        Set Classeur1.AddTabData(Feuil2) = Feuil2
     
        'Initialisation des classes TabData - Feuil1 et Feuil2 - stockant les label les presents
        Set Feuil1.WkSheet = ThisWorkbook.Worksheets(1)
     
        Set Feuil2.WkSheet = ThisWorkbook.Worksheets(2)
     
        Set Feuil1.AddLabel(LabelA) = LabelA
        Set Feuil1.AddLabel(LabelB) = LabelB
        Set Feuil1.AddLabel(LabelC) = LabelC
        Set Feuil1.AddLabel(LabelD) = LabelD
        Set Feuil1.AddLabel(LabelE) = LabelE
        Set Feuil1.AddLabel(LabelF) = LabelF
     
        Set Feuil2.AddLabel(LabelA) = LabelA
        Set Feuil2.AddLabel(LabelB) = LabelB
        Set Feuil2.AddLabel(LabelC) = LabelC
        Set Feuil2.AddLabel(LabelF) = LabelF
     
        'Initialisation des classes Label - nous aurons ici besoin que de leur attributs Name
        LabelA.Name = "LabelA"
        LabelB.Name = "LabelB"
        LabelC.Name = "LabelC"
        LabelD.Name = "LabelD"
        LabelE.Name = "LabelE"
        LabelF.Name = "LabelF"
     
        'Boucle pour definir l'attribut Position de chaque Label selon sa TabData correspondante
        For i = 1 To Classeur1.NbTabDatas
     
            For j = 1 To Classeur1.TabDatasList(i).NbLabels
     
                Set Classeur1.TabDatasList(i).LabelsList(j).WkSheet = Classeur1.TabDatasList(i).WkSheet
                Classeur1.TabDatasList(i).LabelsList(j).Position = Application.Match(Classeur1.TabDatasList(i).LabelsList(j).Name, Classeur1.TabDatasList(i).WkSheet.Rows(1), 0) 'On suppose que chaque label sont en ligne 1
     
                'Debug.Print Classeur1.TabDatasList(i).WkSheet.Name & " " & Classeur1.TabDatasList(i).LabelsList(j).Name & " " & Classeur1.TabDatasList(i).LabelsList(j).Position
     
            Next j
     
        Next i
     
        'Tests
        Debug.Print Classeur1.TabDatasList(1).WkSheet.Name & " " & Classeur1.TabDatasList(1).LabelsList(LabelA).Name & " " & Classeur1.TabDatasList(1).LabelsList(LabelA).Position
        Debug.Print Classeur1.TabDatasList(2).WkSheet.Name & " " & Classeur1.TabDatasList(2).LabelsList(LabelA).Name & " " & Classeur1.TabDatasList(2).LabelsList(LabelA).Position
     
    End Sub
    2. Classes
    > Label

    Code : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    Private MeName As String
    Private MePosition As Integer
    Private MeTabData As TabData
    Private MeWkSheet As Worksheet
     
    Property Get Name() As String
        ' Propriété en lecture
        Name = MeName
    End Property
    Property Let Name(Name As String)
        ' Propriété en écriture
        MeName = Name
    End Property
     
    Property Get Position() As Integer
        ' Propriété en lecture
        Position = MePosition
    End Property
    Property Let Position(Position As Integer)
        ' Propriété en écriture
        MePosition = Position
    End Property
     
    Property Let RowIndex(RowIndex As Byte)
        ' Propriété en écriture
        MeRowIndex = RowIndex
    End Property
     
    Property Get TabData() As TabData
        ' Propriété en lecture
        Set TabData = MeTabData
    End Property
    Property Set TabData(TabData As TabData)
        ' Propriété en écriture
        Set MeTabData = TabData
    End Property
     
    Property Get WkSheet() As Worksheet
        ' Propriété en lecture
        Set WkSheet = MeWkSheet
    End Property
    Property Set WkSheet(WkSheet As Worksheet)
        ' Propriété en écriture
        Set MeWkSheet = WkSheet
    End Property
    > TabData

    Code : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    Private MeBook As Workbook
    Private MeWkSheet As Worksheet
    Private MeLabelsRowIndex As Byte
    Private MeDirectory As String
    Private MeBookName As String
    Private MeSheetName As String
    Private MeFolderType As String
    Private LabelsDict As Object
     
    Private Sub Class_Initialize()
        Set LabelsDict = CreateObject("Scripting.Dictionary")
    End Sub
    Private Sub Class_Terminate()
        Set LabelsDict = Nothing
    End Sub
     
    Public Property Set AddLabel(TheNewLabel As Label, LabelToAdd As Label)
        ' Propriété en écriture
        k = LabelsDict.Keys
        Set LabelsDict(TheNewLabel) = LabelToAdd
    End Property
    Public Property Get LabelsList(LabelIndex) As Label
        ' Propriété en lecture
        k = LabelsDict.Keys
        If IsNumeric(LabelIndex) Then Set LabelsList = LabelsDict(k(LabelIndex - 1)) Else Set LabelsList = LabelsDict(LabelIndex)
    End Property
     
    Public Property Get NbLabels() As Byte
        ' Propriété en lecture
        NbLabels = LabelsDict.Count
    End Property
     
    Property Get Book() As Workbook
        ' Propriété en lecture
        Set Book = MeBook
    End Property
    Property Set Book(Book As Workbook)
        ' Propriété en écriture
        Set MeBook = Book
    End Property
     
    Property Get WkSheet() As Worksheet
        ' Propriété en lecture
        Set WkSheet = MeWkSheet
    End Property
    Property Set WkSheet(WkSheet As Worksheet)
        ' Propriété en écriture
        Set MeWkSheet = WkSheet
    End Property
     
    Property Let LabelsRowIndex(LabelsRowIndex As Byte)
        ' Propriété en écriture
        MeLabelsRowIndex = LabelsRowIndex
    End Property
    Property Get LabelsRowIndex() As Byte
        ' Propriété en lecture
        LabelsRowIndex = MeLabelsRowIndex
    End Property
     
    Property Get Directory() As String
        ' Propriété en lecture
        Directory = MeDirectory
    End Property
    Property Let Directory(Directory As String)
        ' Propriété en écriture
        MeDirectory = Directory
    End Property
     
    Property Get BookName() As String
        ' Propriété en lecture
        BookName = MeBookName
    End Property
    Property Let BookName(BookName As String)
        ' Propriété en écriture
        MeBookName = BookName
    End Property
     
    Property Get SheetName() As String
        ' Propriété en lecture
        SheetName = MeSheetName
    End Property
    Property Let SheetName(SheetName As String)
        ' Propriété en écriture
        MeSheetName = SheetName
    End Property
     
    Property Get FolderType() As String
        ' Propriété en lecture
        FolderType = MeFolderType
    End Property
    Property Let FolderType(FolderType As String)
        ' Propriété en écriture
        MeFolderType = FolderType
    End Property
     
    Property Get FullName() As String
        ' Propriété en lecture
        FullName = Directory & "\" & BookName & "." & FolderType
    End Property
     
    Property Get nbRows() As Integer
        ' Propriété en lecture
        nbRows = WkSheet.Cells(Rows.Count, 2).End(xlUp).Row
    End Property
     
    Property Get nbColumns() As Integer
        ' Propriété en lecture
        nbColumns = WkSheet.Cells(LabelsRowIndex, Columns.Count).End(xlToLeft).Column
    End Property
     
    Property Get Matrix() As Variant
        ' Propriété en lecture
        Matrix = WkSheet.Range(WkSheet.Cells(LabelsRowIndex, 1), WkSheet.Cells(nbRows, nbColumns)).Value
    End Property
    > TabDatas

    Code : 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
    23
    24
    Private TabDatasDict As Object
     
    Private Sub Class_Initialize()
        Set TabDatasDict = CreateObject("Scripting.Dictionary")
    End Sub
    Private Sub Class_Terminate()
        Set TabDatasDict = Nothing
    End Sub
     
    Public Property Set AddTabData(TheNewTabData As TabData, TabDataToAdd As TabData)
        ' Propriété en écriture
        k = TabDatasDict.Keys
        Set TabDatasDict(TheNewTabData) = TabDataToAdd
    End Property
    Public Property Get TabDatasList(TabDataIndex As Byte) As TabData
        ' Propriété en lecture
        k = TabDatasDict.Keys
        Set TabDatasList = TabDatasDict(k(TabDataIndex - 1))
    End Property
     
    Public Property Get NbTabDatas() As Byte
        ' Propriété en lecture
        NbTabDatas = TabDatasDict.Count
    End Property
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    J'ai l'impression que c'est bien compliqué, ce que tu veux mettre en place.

    Je comprends déjà mal à quoi te sert un dictionnaire pour lister les entêtes d'une feuille ou d'un tableau, car j'ai rarement vu un tableau avec plusieurs entêtes identiques (un tableau structuré ne peut d'ailleurs pas en contenir). Mémoriser l'emplacement des entêtes alors qu'il est si simple de les retrouver par une formule Excel utilisée en VBA me semble bien inutile.

    Pourrais-tu expliquer en français (sans jargon VBA) ce que tu souhaites mettre en place?
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Bonjour,

    Je vais essayer de justifier au mieux le besoin.
    Concrètement, je travaille dans une équipe qui a régulièrement besoin de mise en place d'outils (sous VBA, car facile à utiliser pour eux et je n'ai pas d'autres tech à disposition) et ce plutôt sur de petites horizons mais robustes également.

    Pour la rapidité, VBA est clairement un atout, mais la robustesse . Pour pallier à ce défaut, je me tourne donc vers les modules de classes. Travaillant souvent avec des données extraites de progiciels et d'extraction des bases données, je préfère croiser ces données en dimensionant des variables tableaux. Cela dit, je préfère travailler avec des modules de classes comprenant plusieurs attributs plus parlant pour moi (et ceux qui me succéderont). Parmis ces attributs, le nom, le classeur concernait, les label présents (elles mêmes faisant référence à une classe)... Je préfère cependant travailler avec les variables public du module plutôt qu'en attributs des classes (question de maîtrise).

    Pourquoi mettre en place un dictionnaire de "label" plutôt que de les définir en attributs de mes "TabData"?
    Cela me permet simplement de pouvoir faire des boucles sur les label présents dans chaque TabData. Également, chaque TabData ne possède pas forcément les mêmes Label (en nombre et/ou en nom).
    Les mêmes principes s'appliquent pour le dictionnaire de TabData pour la classe TabDatas

    Alors pourquoi ces complications?
    C'est pour me permettre de maintenir le code ensuite plus simplement. Le progiciels où sont faites les extractions est régulièrement mis à jour par les ITs. Lorsqu'une maj (changement de nom de certains Label...) est faite, je n'aurai qu'à modifier mes attributs concernant les classes "labels" et/ou "TabData" dans une sub d'initialisation.
    En bref, je ne souhaite pas intervenir dans des fonctions VBA pour changer ses arguments. Par ailleurs, travaillant sur des variables tableau (beaucoup plus rapide à boucler), je ne connais pas de fonction VBA de type recherchev ou equiv sur Excel (sauf si on passe par une fonction personnalisée).

    Voilà, je m'excuse d'avance car je pense avoir utilisé beaucoup du jargon mais j'ai essayé au mieux

    Merci

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Par défaut
    Bonjour,

    ça m'a l'air bien compliqué ton truc !
    Avec un tableau de Labels :
    Code : 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
     
    Public TblLabel() As New Label
    Public Feuil1 As New TabData, Feuil2 As New TabData
    Public Classeur1 As New TabDatas
     
    Sub DefinirPositionLabels()
     
        Dim i As Byte, j As Byte
        Dim L As Integer
        Dim Plage As Range
        Dim Lbl() As Label
     
        Erase TblLabel()
     
        Set Feuil1.WkSheet = ThisWorkbook.Worksheets(1)
        Set Feuil2.WkSheet = ThisWorkbook.Worksheets(2)
     
        'Initialisation de la classe TabDatas - Classeur1 - stockant tout les TabData - Feuil1 et Feuil2
        Set Classeur1.AddTabData(Feuil1) = Feuil1
        Set Classeur1.AddTabData(Feuil2) = Feuil2
     
        'Initialisation des classes TabData - Feuil1 et Feuil2 - stockant les label les presents
     
        With Feuil1.WkSheet: Set Plage = .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)): End With
     
        For i = 1 To Plage.Count
     
            If Plage(1, i).Value <> "" Then
     
                L = L + 1: ReDim Preserve Lbl(1 To L)
                Set Lbl(L) = New Label
                Lbl(L).Name = Plage(1, i).Value
                Lbl(L).Position = Plage(1, i).Column
                Set Lbl(L).WkSheet = Plage.Parent
                Lbl(L).RowIndex = 1
     
            End If
     
        Next i
     
        Feuil1.Tableau() = Lbl()
     
        L = 0
     
        With Feuil2.WkSheet: Set Plage = .Range(.Cells(1, 1), .Cells(1, .Columns.Count).End(xlToLeft)): End With
     
        For i = 1 To Plage.Count
     
            If Plage(1, i).Value <> "" Then
     
                L = L + 1: ReDim Preserve Lbl(1 To L)
                Set Lbl(L) = New Label
                Lbl(L).Name = Plage(1, i).Value
                Lbl(L).Position = Plage(1, i).Column
                Set Lbl(L).WkSheet = Plage.Parent
                Lbl(L).RowIndex = 1
     
            End If
     
        Next i
     
        Feuil2.Tableau() = Lbl()
     
        Debug.Print "Feuille 1 :"
        For i = 1 To UBound(Feuil1.Tableau())
            Debug.Print Feuil1.Tableau()(i).Name; "---"; Feuil1.Tableau()(i).Position
        Next i
     
        Debug.Print "Feuille 2 :"
        For i = 1 To UBound(Feuil2.Tableau())
            Debug.Print Feuil2.Tableau()(i).Name; "---"; Feuil2.Tableau()(i).Position
        Next i
     
    End Sub
    Dans le module de classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Private Tbl() As Label
     
    Property Get Tableau() As Label()
     
        Tableau = Tbl
     
    End Property
     
    Property Let Tableau(ByRef T() As Label)
     
        Tbl = T
     
    End Property

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Merci pour ta réponse, je vais tester ça au plus vite

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Travailler avec des modules de classe qui utiliseraient des variables publiques est pour moi une absurdité, dans la mesure ou l'intérêt du module de classe est justement de se passer de variables publiques (technique d'encapsulation dans le module de classe lui permettant de "voyager" d'une application à l'autre).

    Si j'ai bien compris le besoin et le jargon employé (notamment en ce qui concerne les "labels" qui seraient en fait les intitulés, ou noms de champs, des tables à plat récupérées du progiciel), ce dont tu as besoin est un tableau EXCEL de correspondance entre les libellés récupérés du progiciel et les libellés de tes "applications VBA". En jargon informatique, on appelle cela une "table de mappage" (mapping table). Je ne saurais trop te conseiller d'utiliser les tableaux structurés d'Excel pour réaliser cela, de façon à éviter le "hard coding", avec un code très léger pour le mappage, c'est-à-dire la conversion d'un libellé d'un système en un libellé de l'autre système. Dès lors, tu gardes ton appli "propre" en créant une passerelle entre le progiciel et ton appli qui serait en fait gérée grâce à Excel, VBA étant là pour signaler les éventuelles incohérences ou manques, que tu sois en "version" ou en "thème"...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    L'idée de tableau de correspondance est bonne je l'admet . Je vais réfléchir également à ta première remarque concernant l'utilisation de variables publiques en tentant de ne travailler qu'avec du privées
    Dans le cas où j'obtiendrais quelques choses de structurant, je vous le partagerai.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Le problème (pour moi) étant que je n'ai toujours pas bien cerné le fond du problème...
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Citation Envoyé par Pierre Fauconnier Voir le message
    Le problème (pour moi) étant que je n'ai toujours pas bien cerné le fond du problème...
    Disons que techniquement, je veux être capable de créer des bases de données (TabData) personnalisées en instanciant les champs (label) que je souhaite. Le problème c'est que quand je le fais via la première méthode dans mon premier poste, je ne parviens pas à créer les bons liens de parentés sur les attributs des labels (pour cet exemple, j'ai tenté en vain de le faire sur l'attribut position) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Debug.Print Classeur1.TabDatasList(1).WkSheet.Name & " " & Classeur1.TabDatasList(1).LabelsList(LabelA).Name & " " & Classeur1.TabDatasList(1).LabelsList(LabelA).Position
    Debug.Print Classeur1.TabDatasList(2).WkSheet.Name & " " & Classeur1.TabDatasList(2).LabelsList(LabelA).Name & " " & Classeur1.TabDatasList(2).LabelsList(LabelA).Position
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Feuil1 LabelA 3
    Feuil2 LabelA 3
    Je ne suis pas sensé obtenir la même position colonne ici, mais plutôt 1 et 3.
    Pour y parvenir je pourrais éventuellement instancier en module de classe tout les TabData dont j'aurais besoin en amont avec directement en attributs les champs (label) que je souhaitent. Mais ce n'est pas une solution qui me convient ici, je cherche à réutiliser le module TabData dans d'autres projets ensuite.
    Voilà grossièrement ce que je cherche techniquement. Maintenant usuellement parlant il y a d'autre moyen (la table de correspondance par exemple), mais je cherche à travailler le moins possible avec des feuilles Excel comme pseudo base de données. Ça ne m'a jamais trop bien servies niveau maintenance.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je ne comprends pas ce que tu veux dire par "bases de données tabdata", et je n'ai toujours pas compris la finalité. Pourrais-tu expliquer avec un exemple? Parce que, quoi tu veuilles réaliser, la mise en place utilisée (dictionary et autres) me paraît bien compliquée.


    Citation Envoyé par StarFalco Voir le message
    [...]mais je cherche à travailler le moins possible avec des feuilles Excel comme pseudo base de données. Ça ne m'a jamais trop bien servies niveau maintenance.
    Voir ma signature. Je pense que l'on gagne beaucoup en maintenance à travailler avec Excel, puisque cela permettrait, en gros, de ne pas devoir toucher au code VBA mais de modifier simplement les paramètres dans les feuilles Excel. Sur le plan de la maintenance et de la réutilisabilité du code, il n'y a pas mieux.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre à l'essai
    Homme Profil pro
    Développeur VBA
    Inscrit en
    Octobre 2018
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur VBA

    Informations forums :
    Inscription : Octobre 2018
    Messages : 6
    Par défaut
    Je vais préparer une réponse prochainement avec un exemple afin d'être le plus clair possible

Discussions similaires

  1. liens entre classes
    Par gate35 dans le forum Débuter
    Réponses: 7
    Dernier message: 28/05/2009, 17h01
  2. Réponses: 7
    Dernier message: 28/04/2009, 17h46
  3. Pas de liaisons entre classes dans un diagramme des classes
    Par zoom35 dans le forum Diagrammes de Classes
    Réponses: 3
    Dernier message: 26/06/2008, 15h40
  4. Réponses: 12
    Dernier message: 19/04/2008, 16h19
  5. parentés entre classes
    Par MisterTee dans le forum Langage
    Réponses: 9
    Dernier message: 04/10/2006, 13h08

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo