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 :

ListObject - Récupérer le offset différement [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut ListObject - Récupérer le offset différement
    Bonjour à tous,

    Je tente depuis quelques jours de m'initier aux Tableaux Structuré via les beaux billets/tuto de Pierre Fauconnier.
    J'ai une petite question qui pourrais vous sembler assez bête...

    Je fais une boucle sur une table "T_Mapping" en vue de récupérer les critères pour "Ventiller" filtre et export vers autre feuille du résultat, la Bdd.

    Mon code fonctionne bien.

    Mais n'étant pas certain de l'évolution que prendra la table ajout colonne, modification ordre,....

    Je me demande s'il serait envisageable de se passer des Cel.Offset(0, 1).Value, pour récupérer la valeur d'une cellule sur la même ligne en fonction du header, et non plus de la position de la cellule. ?

    du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Crit2 = Cel.Offset(0, 1).Value
    ->
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Crit2 = Cel.ListColumns("Criteria1").DataBodyRange.Value
    je suis dans le flou.

    Merci d'avance pour votre aide.

    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
    Sub Testventilation()
     
     Dim Tbl As ListObject, Cel As Range
     Dim Crit1 As String, Crit2 As String
     Dim TD As Range, rangeDest As String
     
     
     Set TD = ThisWorkbook.Sheets("Sheet1").Range("T_Personnes")   ' table à ventiller
     Set Tbl =ThisWorkbook.Sheets("Param").ListObjects("T_Mapping") ' table de parametres
     
     For Each Cel In Tbl.ListColumns("Criteria1").DataBodyRange ' "Criteria1" libellé de la colone
      Crit1 = Cel.Value
      Crit2 = Cel.Offset(0, 1).Value
      rangeDest = Cel.Offset(0, -1).Value
      Call TestSelectTDbyMapping(TD, Crit1, Crit2, rangeDest)
     Next
     
    End Sub

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    S'il s'agit d'exporter des lignes provenant d'un tableau structuré (ListObject) suivant critères, il est possible de passer par la méthode AdvancedFilter

    Lire ma contribution sur ce sujet, titrée La méthode AdvancedFilter et l'objet ListObject

    [EDIT]
    Sinon, voici un exemple pour renvoyer la valeur se trouvant en ligne 1 des données et de la colonne "Prenom"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub t()
     Dim oLst As ListObject
     Set oLst = shtData.ListObjects(1)
     With oLst
       MsgBox .DataBodyRange.Cells(1, .ListColumns("Prenom").Index).Value
     End With
    End Sub
    Dans l'exemple, shtData est le CodeName de la feuille où se trouve le tableau structuré
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour Philippe,

    Je file de ce pas m'instruire avec le billet proposé, histoire dans apprendre un peu plus sur les filtres élaboré.

    Ma fonction de filtre marche très bien, il s agit juste d'acquerir les critères différent en parvenant à récupérer le offset différemment que selon la position de la cellule en cours dans la boucle.

    Je pensais récupérer via l index de la ligne de la cel en cour en pointant le bon header et non la position par des offset, vu que la table risque d être étendue à l avenir.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 171
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 171
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je pensais récupérer via l index de la ligne de la cel en cour en pointant le bon header et non la position par des offset, vu que la table risque d être étendue à l avenir.
    Voir le code que j'ai publié en [EDIT] de ma précédente réponse
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Re-Bonjour,

    Grâce aux conseils avisés de Philippe Tulliez, j'ai passé l'obstacle "Récupérer le offset différemment".

    Me reste à ajouter un wb de destination, et feuille de destination et j'aurai ma propre fonction générique de Filtre,Tris,Export de Bdd en Sql à partir d'une table de mappage (qui me facilitera les modifications avenir).

    Mon code actuel

    Je posterai l'ensemble du code final dès que celui-ci sera totalement aboutis et générique.

    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
     
     
    Sub test()
     
     Dim wb As Workbook: Set wb = ThisWorkbook
     Dim shMapping  As Worksheet: Set shMapping = wb.Sheets("Param")
     Dim shData As Worksheet: Set shData = wb.Sheets("Data")
     Dim Tbl  As ListObject:  Set Tbl = shMapping.ListObjects("T_Mapping")
     Dim TD  As Range:  Set TD = shData.Range("T_Personnes")
     
     Dim Cel As Range
     Dim sCrit1 As String, sCrit2 As String, rRangeDest  As String
     
     
      For Each Cel In Tbl.ListColumns("Criteria1").DataBodyRange
     
        sCrit1 = shMapping.Cells(Cel.Row, Tbl.ListColumns("Criteria1").Index).Value
        sCrit2 = shMapping.Cells(Cel.Row, Tbl.ListColumns("Criteria2").Index).Value
        rRangeDest = shMapping.Cells(Cel.Row, Tbl.ListColumns("RangeDest").Index).Value
     
      Call TestSelectTDbyMapping(TD, sCrit1, sCrit2, rRangeDest)
     
      sCrit1 = "": sCrit2 = "": rRangeDest = ""
     
     Next Cel
     
    Set wb = Nothing
    Set shMapping = Nothing
    Set shData = Nothing
    Set Tbl = Nothing
    Set TD = Nothing
     
     
    End Sub

  6. #6
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut Oups
    Bonjour …

    Problème Résolu ?
    Je me sers simplement du nom du tableau (plutôt que l’index) et du nom de colonnes (plutôt que le numéro) et je passe simplement (si je puis dire avec de telles dénominations) par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
        Dim L As Long, sCrit1 As String, sCrit2 As String, rRangeDest As String
        For L = 1 To [T_Mapping].Rows.Count
            sCrit1 = [T_Mapping[Criteria1]].Rows(L)
            sCrit2 = [T_Mapping[Criteria2]].Rows(L)
            rRangeDest = [T_Mapping[RangeDest]].Rows(L)
            'Call TestSelectTDbyMapping(TD, sCrit1, sCrit2, rRangeDest)  'à voir, remplacé par
            MsgBox sCrit1 & " " & sCrit2 & " " & rRangeDest
        Exit Sub
        Next
    End Sub
    Ainsi, la position du tableau importe peu dans le classeur !
    À titre de comparaison
    Nom : Oups.jpg
Affichages : 1262
Taille : 164,9 Ko
    Un tableau structuré est une boîte spéciale (dixit Fauconnier) mais celle-ci est, elle-même, contenue dans une boîte de base (Range). Le Ts a des propriétés précises et une syntaxe très particulière.
    Confondre les numéros de ligne ( .Row et de colonne .Column) du tableau avec ceux de la feuille est souvent source d’erreur (comme ici) !
    Ne s’en tenir qu’à un tableau structuré exige de bien contrôler ses propriétés (syntaxe comprise). Dans ce cas on peut se retrouver avec une quantité plus importante de lignes de codes.

    A toutes fins utiles pour ceux qui n’auraient pas un tableau évolutif (lignes, colonnes ajoutées, supprimées…), la macro (voir #1) avec les numéros sera, avec moi,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub test3()
        Dim C As Range, sCrit1 As String, sCrit2 As String, rRangeDest As String
        For Each C In [T_Mapping[Criteria1]]
            sCrit1 = C: sCrit2 = C(1, 2):    rRangeDest = C(1, 0)
            MsgBox sCrit1 & " " & sCrit2 & " " & rRangeDest
        Next
    End Sub
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour Ordonc,

    Merci pour ton poste, je suis encore à mille lieux de connaître et manipuler aussi bien que toi, Pierre, Philippe ou encore rêver les tableaux structurés.

    Je mis met peu à peu, et j'ai énormément d'outils à modifier, j aimerais donc uniformiser et généraliser au maximum mes fonctions de manière à gagner du temps et à avoir une même ligne conductrice dans mes diverses applications.

    Cependant, je trouve la documentation sur le Web, ormis qq contributions sur ce site, sont encore assez pauvre, en comparaison au manipulation sur range standard.

    Si vous avez qq liens qui pourrais m être utile, surtout n'hésitez pas.

    Merci encore, à vous et au differents membres aguerris de ce forum.

  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
    Citation Envoyé par OrDonc Voir le message
    [...]
    Un tableau structuré est une boîte spéciale (dixit Fauconnier) mais celle-ci est, elle-même, contenue dans une boîte de base (Range). Le Ts a des propriétés précises et une syntaxe très particulière.[...]
    Je n'ai jamais dit nulle part qu'un tableau structuré était une "boite spéciale". Dans mon tuto, j'utilise une comparaison avec une "boite" dans laquelle on placerait des fiches (fiches clients, factures, ...). Un tableau structuré, appelé parfois table ou tableau dynamique (à ne pas confondre avec tableau croisé dynamique) n'est pas "une boite", mais un objet spécifique d'Excel qui s'appelle ListObject en VBA.

    Un tableau structuré n'est pas contenu dans une "boite de base" qui serait un objet Range. C'est l'inverse! C'est le Listobject qui contient, entre autre, l'objet Range (le pendant de la référence structurée en Excel). Le ListObject, quant à lui, n'est pas contenu dans un objet Range mais dans un objet Worksheet (voir le modèle objet d'Excel pour s'en convaincre). C'est vrai que l'on peut atteindre un ListObject via un objet Range qui contient au moins une cellule dudit ListObject, mais ce n'est pas pour cela que c'est le range qui contient le listobjet . Tant qu'à faire, je rappelle également que le ListObject nommé X n'est pas égal à la référence structurée nommée X (listobjects("Tableau1") <> range("Tableau1")). ListObject et Range sont des objets très différents qu'il ne faut pas confondre.


    Citation Envoyé par OrDonc Voir le message
    [...]
    Dans ce cas on peut se retrouver avec une quantité plus importante de lignes de codes.[...]
    D'une manière générale, l'utilisation des références structurées et des listobject va, au contraire, diminuer les lignes de code, et en tout cas clarifier celui-ci et lui ajouter de la souplesse (notamment par les avantages que tu cites relatifs au fait de n'avoir jamais besoin d'en spécifier la feuille et la position sur celle-ci). Cela étant, l'important pour moi n'est pas le nombre de lignes de codes mais sa clarté, sa lisibilité et, in fine, l'élégance de sas syntaxe que le nombre de lignes écrites...



    @mfoxy,

    Utiliser la notation à crochets est une très mauvaise idée et je te déconseille fortement d'utiliser cette syntaxe dans ton code, pour les raisons que j'explique dans ce billet.

    Citation Envoyé par OrDonc Voir le message
    [...]
    For L = 1 To [T_Mapping].Rows.Count
    sCrit1 = [T_Mapping[Criteria1]].Rows(L)[...]
    "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 Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Bonjour Pierre,

    Je lisais justement ce billet tout à l'heure avec la notation par crochet.
    Et d’ailleurs, j'ai eu un soucis avec le code d'Ordonc, si le classeur actif n'est pas celui contenant la table t_Mapping.

    Mais un fait est que le code de Ordonc, comme prouvé par sadémonstration,fonctionne mieux que le miens (en cas de déplacement de la table dans la feuille,dans le classeur).

    Je ne parviens pas, avec des nomenclatures "standard" à faire un code générique, mes connaissances en Tables Structurées (vba) sont encore trop restreinte.

    Pourrais-tu,si tu as le temps, et en guise de comparaison me montrer un code "à ta sauce" correspondant à mon souci comme Ordonc la fait.
    Je pourrais ainsi comparer et "imprégner" de la bonne façon de coder avec les table structurées.

    Bat

  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
    mfoxy,

    Si cela t'intéresse, j'ai créé deux classes d'objets qui permettent de manipuler un listobject et une ligne particulière de celui-ci. Je finalise ( ^^ ) deux tutos sur le vba des listobject, mais en primeur, je te donne ici le code générique partiel de ces classes: la classe xlTable qui est une couche d'abstration du listobject, et la classe xlRow qui est une couche d'abstraction du ListRow. Ces codes permettent de manipuler facilement un listobject et les données qu'il contient. L'abstraction qu'ils permettent amène à modifier la une valeur particulière en quelques lignes de code sans devoir "se taper" toute la syntaxe des listobject et listrow, comme le montre le code de la procédure Test ci-dessous. Je joins en annexe un fichier d'exemple.

    xlTable (partiel)
    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
    115
    116
    117
    118
    Option Explicit
     
    Private mListObject As ListObject
    Private mIndex As String
    Private mName As String
     
    Private Const VERSION As String = "2.0"
     
    Function Init(Name As String, Optional Index As String, Optional wb As Workbook) As Long
      InitListObject Name, wb
      If mListObject Is Nothing Then
        Init = 1
      Else
        mIndex = Index
      End If
    End Function
     
    Private Sub InitListObject(Name As String, Optional wb As Workbook)
      Dim sh As Worksheet
      Dim lo As ListObject
      Dim shCounter As Long, loCounter As Long
     
      shCounter = 1
     
      If wb Is Nothing Then Set wb = ThisWorkbook
      Do While shCounter <= wb.Worksheets.Count And mListObject Is Nothing
        loCounter = 1
        Do While loCounter <= wb.Worksheets(shCounter).ListObjects.Count And mListObject Is Nothing
          If StrComp(wb.Worksheets(shCounter).ListObjects(loCounter).Name, Name, vbTextCompare) = 0 Then Set mListObject = wb.Worksheets(shCounter).ListObjects(loCounter)
          loCounter = loCounter + 1
        Loop
        shCounter = shCounter + 1
      Loop
    End Sub
     
    Sub ShowAllData()
      mListObject.AutoFilter.ShowAllData
    End Sub
     
    Property Get DataRange() As Range
      Set DataRange = mListObject.DataBodyRange
    End Property
     
    Property Get ColumnExists(Name As String) As Boolean
      Dim Counter As Long
     
      Counter = 1
     
      Do While Counter <= mListObject.ListColumns.Count And ColumnExists = False
        If StrComp(mListObject.ListColumns(Counter).Name, Name, vbTextCompare) = 0 Then ColumnExists = True
        Counter = Counter + 1
      Loop
    End Property
     
    Property Get Index() As String
      Index = mIndex
    End Property
     
    Property Get Table() As ListObject
      Set Table = mListObject
    End Property
     
    Property Get Column(ByVal Name As String) As ListColumn
      Set Column = mListObject.ListColumns(Name)
    End Property
     
    Property Get ColumnFromIndex(ByVal Index As Long) As ListColumn
      Set ColumnFromIndex = mListObject.ListColumns(Index)
    End Property
     
    Property Get IsEmpty() As Boolean
      IsEmpty = (mListObject.ListRows.Count = 0)
    End Property
     
    Property Get NewRow() As xlRow
      Set NewRow = New xlRow
      NewRow.Init mListObject.ListRows.Add()
    End Property
     
    Property Get Row(ByVal Value As Variant, Optional ByVal ColumnName As String) As xlRow
      Dim Formula As String
      Dim Pos As Variant
      If ColumnName = "" Then ColumnName = mIndex
     
      Select Case TypeName(Value)
        Case "String"
          Value = """" & Value & """"
      End Select
     
      If ColumnName <> "" Then
        Formula = "match(" & Value & "," & mListObject.Name & "[" & ColumnName & "],0)"
        Pos = Evaluate(Formula)
        If Not IsError(Pos) Then
          Set Row = New xlRow
          Row.Init mListObject.ListRows(Pos)
        End If
      End If
    End Property
     
    Property Get RowFromIndex(Index As Long) As xlRow
      If Index <= mListObject.ListRows.Count Then
        Set RowFromIndex = New xlRow
        RowFromIndex.Init mListObject.ListRows(Index)
      End If
    End Property
     
     
    Property Get Name() As String
      Name = mListObject.Name
    End Property
     
    Property Get RowsCount() As Long
      RowsCount = mListObject.ListRows.Count
    End Property
     
    Public Function RowExists(Value As Variant) As Boolean
      RowExists = Not Row(Value) Is Nothing
    End Function
    xlRow
    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
    Option Explicit
     
    Private mRow As ListRow
     
    Sub Init(Row As ListRow)
      Set mRow = Row
    End Sub
     
    Property Get Row() As ListRow
      Set Row = mRow
    End Property
     
    Property Get Value(ByVal FieldName As String) As Variant
      If ColumnExists(FieldName) Then
        Value = mRow.Range(mRow.Parent.ListColumns(FieldName).Index).Value
      Else
        Err.Raise 2000, "xlRow.Value", "Column doesn't exist"
      End If
    End Property
     
    Property Let Value(ByVal FieldName As String, ByVal Value As Variant)
      mRow.Range(mRow.Parent.ListColumns(FieldName).Index).Value = Value
    End Property
     
    Property Get Address() As String
      Address = mRow.Range.Address
    End Property
     
    Property Get Range() As Range
      Set Range = mRow.Range
    End Property
     
    Property Get Cell(ByVal FieldName As String) As Range
      Set Cell = mRow.Range(mRow.Parent.ListColumns(FieldName).Index)
    End Property
     
    Property Get Table() As ListObject
      Set Table = mRow.Parent
    End Property
     
    Function Delete()
      If Not mRow Is Nothing Then mRow.Delete
    End Function
     
    Private Function ColumnExists(Name As String) As Boolean
      Dim Counter As Long
     
      Counter = 1
      Do While Counter <= mRow.Parent.ListColumns.Count And Not ColumnExists
        ColumnExists = (StrComp(mRow.Parent.ListColumns(Counter).Name, Name, vbTextCompare) = 0)
        Counter = Counter + 1
      Loop
    End Function
    Voici une procédure "Test" qui initialise le xlTable "t_Contacts", qui trouve une ligne particulière dans celui-ci, en récupère et en modifie une valeur particulière également. Tu vois que, grâce à un outil générique, tu as besoin d'une seule ligne pour initialiser l'objet, une ligne de code pour trouver une ligne particulière (sur un tableau muni d'une colonne d'identifiants uniques), une ligne de code pour retrouver la valeur d'une colonne particulière de la ligne trouvée, et également une ligne pour modifier la valeur d'une colonne particulière de cette ligne de données. Tu remarques qu'ici, on ne manipule pas de listobject ni de listrow, ces notions sont déportées dans les classes génériques (c'est pour cela qu'on appelle cela des couches d'abstraction, puisqu'elles permettent de faire abstraction des notions manipulées par les classes). Bien sûr, ça ne dispense pas de connaître les listobject et listrow, mais ça accélère considérablement la création d'une "application" qui doit manipuler les données d'un tableau structuré. En utilisant ces outils dans une autre classe d'interfaçage de userform, on crée rapidement des formulaires liés à des tableaux structurés, puisque toutes les manipulations génériques sont déportées dans des classes.

    Nom : 2020-03-02_142052.png
Affichages : 1205
Taille : 5,5 Ko


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub Test()
      Dim Table As New xlTable
      Dim Row As xlRow
     
      Table.Init "t_Contacts", "ID"
      Set Row = Table.Row(72)
      Debug.Print Row.Value("Service")
      Row.Value("Service") = "Res. Humaines"
    End Sub

    ** Je donne le code partiel, notamment pour le problème que tu évoques concernant le tableau actif. Au départ, j'utilise EVALUATE du modèle objet Excel, mais cela limite la manipulation au classeur actif. Je dois encore modifier la façon de récupérer une ligne même pour un tableau se trouvant sur un autre classeur. Je vais essayer de finaliser cela demain.
    Fichiers attachés Fichiers attachés
    "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 Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Merci beaucoup Pierre.
    Je me suis toujours demandé, comment tu arrives à créer de tel outils et espère un jour arriver à ta cheville.
    Je télécharge et je vais tenter de comprendre.

  12. #12
    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
    Pas de quoi... De toute façon, ce code sera bientôt publié dans un tuto... Autant en profiter dès maintenant...

    Pour ce qui est de développer "de tels outils", c'est juste de l'expérience, de la pratique (beaucoup de pratique*), de la passion, et aussi de la rigueur (beaucoup de rigueur, notamment dans les syntaxes utilisées et dans les architectures mises en place). Il n'y a rien de magique ni d'extraordinaire... Et il est clair que ces outils, génériques, permettent de développer très rapidement des applications fonctionnelles en codant un minimum. J'apprécie donc tout particulièrement tes recherches et ton souhait de développer des outils génériques (=> on est toujours gagnant à ne pas réinventer la roue)

    ENJOY



    * Certains auteurs de bouquins sur l'expertise disent qu'il faut 10.000 heures de pratique d'une technique pour en devenir expert...
    "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...
    ---------------

  13. #13
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    364
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 364
    Par défaut
    Re …

    C’est moi qui te remercie pour ton retour mfoxy.

    Précisions quant à l’objet de mon intervention
    :
    Je ne suis pas un Formateur professionnel, ni un Architecte professionnel donc, en pensant aux personnes qui débutent* (avec un niveau minimum quand même), j’évite de proposer de grandes Théories, privilégiant la Pratique pour donner des exemples adaptés aux contextes rencontrés. Connaître une Théorie ne sert pas à grand-chose quand on ne se sait pas l’appliquer ou quand elle n’est pas la plus performante au moment propice.
    Il ne viendrait pas à l’esprit de proposer les plans génériques d’un château (quelle que soit son architecture) à une personne que ne peut se payer qu’un petit pavillon**.
    Pour celui-ci, dans l’exemple simple de Fauconnier je me contenterai de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Debug.Print [t_Contacts[Service]].Rows(2) 'avec la ligne 2 de la colonne Service du tableau
    End Sub
    à comparer à toutes les lignes de codes précédentss, y compris des modules de classe.

    * j’ai, comme tout le monde, fait partie de cette catégorie. Ma formation et mon apprentissage m’ont permis de progresser, cela sans mentor, en ne retenant parmi les documentations proposées que celles qui me semblaient les plus simples à utiliser selon le contexte présent (sans pour autant rejeter les autres) !
    Tu as, sur ce site, une mine de documents à consulter donc, bonne route mfoxy pour ce parcours du combattant que tu as entrepris.
    ** Simple question à laquelle tu n’as aucune obligation de réponse : « veux-tu devenir codeur professionnel pour traiter de nombreux et gros logiciels ? »

  14. #14
    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
    Ordonc,

    La comparaison d'un code générique avec les plans génériques d'une château/pavillon n'a pas lieu d'être. Il ne me viendrait en tout cas pas à l'idée de construire un pavillon avec les plans d'un château. Par contre, une bonne architecture de code, c'est une bonne architecture de code, et les bonnes pratiques, ce sont les bonnes pratiques, quelle que soit la taille du projet. Prendre, dès le début, l'habitude d'une bonne architecture ne me semble pas être une idée idiote.

    On peut bien sûr écrire range("Tableau1[colonne1]")(x) pour récupérer la valeur de CETTE colonne sur CETTE ligne pour CE tableau. On réinvente alors la roue à chaque développement en devant modifier les noms, les index, etc. Ou on se dit qu'on aura à répéter l'opération dans un autre projet, et on essaie d'écrire du code générique (ce qui était, au passage, la motivation de mfoxy, telle qu'il l'a spécifié dans une de ses réponses, et qui m'a donné l'idée de lui proposer mes outils génériques).

    Citation Envoyé par mfoxy Voir le message
    [...]

    Je mis met peu à peu, et j'ai énormément d'outils à modifier, j aimerais donc uniformiser et généraliser au maximum mes fonctions de manière à gagner du temps et à avoir une même ligne conductrice dans mes diverses applications.[...]
    J'illustre ici une autre orientation technique que la tienne, qui expose la possibilité de réutiliser du code générique et donc de gagner du temps de projet en projet. Ce n'est jamais qu'une autre manière de faire, permettant à mfoxy, mais aussi à tous les lecteurs de cette discussion d'avoir différentes solutions parmi lesquelles chacun choisira celle qui lui convient le mieux. Il n'y a pas de ma part, au départ en tout cas, de dénigrement de ma part ni d'attaque personnelle, mais un simple constat technique et l'envie de parler et de partager sur les bonnes pratiques (que je n'ai pas inventées, mais que j'ai apprivoisées parce qu'elles étaient les meilleures). Mon agacement est né de la malhonnêteté intellectuelle qui consiste à affirmer qu'un code, qui plus est sorti de son contexte, est équivalent à un autre, en se retranchant derrière le fallacieux prétexte de "l'autodidactisme"...

    Perso, je trouve confortable d'intégrer des modules génériques (toujours les mêmes de projet en projet hormis le fait que le module générique s'enrichit de nouveaux outils à chaque développement) et d'architecturer mon code sur ces outils. Cela ne minimise en rien les solutions telles que celle que tu proposes. Chaque solution a sa raison d'être, et si je devais construire une seule maison, il ne me viendrait pas à l'esprit de créer des plans génériques, mais dès que je dois construire deux maisons, je vais essayer de gagner du temps en rendant certains plans génériques. C'est pile poil pareil en informatique, et ça n'a que peu à voir avec le fait de construire des "gros logiciels"... Quelqu'un qui met le doigt dans le VBA va rarement s'arrêter à un seul fichier et gagnera donc à rendre son code générique le plus tôt possible. Des outils génériques trouvent leur place dans des projets de toute taille, dès lors qu'ils rendent les services pour lesquels ils sont créés. Dès que je dois manipuler des tableaux structurés en VBA, je ne me pose pas la question, j'intègre mes modules et je trouve de suite mes réflexes de programmation qui me permettent d'aller vite et en sécurité, sans devoir à chaque ligne me gratter l'occiput pour retrouver une syntaxe...

    Pour illustrer l'intérêt d'outils génériques, compris et apprivoisés, je place ici le code qui modifie la donnée d'une colonne spécifique d'une ligne spécifique d'un tableau structuré en utilisant les classes proposées plus haut. Le nommage permet de comprendre rapidement ce que le code réalise, et ça m'a pris 3 minutes de coder cela, en ce compris la création du second tableau dans le classeur... Perso, ça m'encourage à créer des codes génériques dès que je le peux, à les enregistrer dans des modules (Tools, xlTools, apptools, DateTools, ...) et à systématiser leur utilisation. J'y gagne en fiabilité, en temps, et donc, pour moi qui suis un professionnel d'Excel, en argent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Function getTable(Name As String, IndexName As String) As xlTable
      Set getTable = New xlTable
      getTable.Init Name, IndexName
    End Function
     
    Sub Test()
      getTable("t_contacts", "ID").Row(72).Value("Service") = "Res. humaines"
      getTable("t_Factures", "Numéro").Row(2).Value("Client") = "Developpez.com"
    End Sub

    Citation Envoyé par OrDonc Voir le message
    [...]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Sub test()
        Debug.Print [t_Contacts[Service]].Rows(2) 'avec la ligne 2 de la colonne Service du tableau
    End Sub
    à comparer à toutes les lignes de codes précédentss, y compris des modules de classe.[...]
    Ton exemple de ta soi-disante simplicité en une ligne est affligeant à plus d'un titre. Evidemment, si tu compares la "simplicité" de ta ligne de code, sortie de tout contexte qui détermine comment et pourquoi t_Contacts, comment et pourquoi [Service] et comment et pourquoi (2), à mon code générique, tu vas donner l'impression que ta solution est plus simple. Sauf que c'est une ineptie sans nom de procéder ainsi, et que l'honnêteté intellectuelle la plus élémentaire t'imposerait de te taire au lieu d'écrire une absurdité aussi énorme (ou alors, tu as compris, à tort, que le 72 de mon code pointait vers la ligne 72... Tiens, pourquoi pas, quand j'y pense, tu n'es plus à une idiotie près ). L'ignorance ou la bêtise mononeuronale, passe encore, mais la mauvaise foi crasse, désolé, il y a des limites à ne pas franchir... En gros, ta ligne de code, sortie de tout contexte, s'apparente à la mienne: getTable("t_contacts", "ID").Row(72).Value("Service") = "Res. humaines" (une ligne de code pour une ligne de code...). Ca n'illustre rien d'autre que ton incompréhension de ce qu'est un code générique et de quand, comment et pourquoi l'utiliser.

    Quant au sempiternel refrain "je suis autodidacte, blabla blabla"... De grâce, cessez, toi et quelques autres, avec ce discours pleurnichard qui ne veut rien dire. Personne n'apprend à coder tout seul, vraiment tout seul, sans lectures, sans partages, sans exemples. J'ai également été "autodidacte" pendant les +/- 20 premières années de ma vie professionnelle (avant d'être expert Excel (oui oui ), j'étais comptable formé à l'expertise comptable en cours du soir - 6 ans - et encore avant, j'étais boulanger... Alors le couplet larmoyant sur l'autodidacte, ça commence à me les briser menu ). Ca ne m'a pas empêché, au contraire, d'apprendre de plein de gens, de tester leurs pratiques et de faire miennes les meilleures que je trouvais. C'est ainsi que j'ai progressé en ne validant (ou pas) que sur le tard mes acquis empiriques par une approche plus formelle (trois ans et demi de cours de soir en plus, en étant indépendant-freelance pour un bachelor en informatique de gestion, tout se paie...). Je partage depuis 20 ans sur différents forums, dont DVP depuis 17 ans, je forme depuis +/- 15 ans (+/- 1500 journées de formation à mon actif), je crée des fichiers Excel pour mes clients sur base d'extracts de ERP, CRM, SAP, Sage BOB, ... depuis des années. Si je partage aujourd'hui ces architectures qui sont miennes parce que ce sont les meilleures (et non l'inverse!!), c'est parce que je pense que plus tôt on voit et on s'approprie ces bonnes pratiques, meilleur sera notre code... Si, dès le début de nos apprentissages, nous ne goûtons pas aux bonnes pratiques, il sera très difficile de s'y référer et de les appliquer lorsque leur mise en pratique deviendra nécessaire, voire indispensable. Après, que ceux qui ont envie de continuer à pleurnicher parce que l'on donne un code meilleur que le leur continuent de pleurnicher. Ce n'est pas moi qui salit mon mouchoir.
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  15. #15
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Citation Envoyé par OrDonc Voir le message
    Simple question à laquelle tu n’as aucune obligation de réponse : « veux-tu devenir codeur professionnel pour traiter de nombreux et gros logiciels ? »
    Re Ordonc,

    J'ai sans nulle doute encore énormément de chemin avant de pouvoir me qualifier de codeur pro.

    Néanmoins, j'ai de nombreuses "applications" tournant sous Vba (Excel pour la plupart, access pour une minorité), ventilation de bbd, usf d encodage, interaction avc IE, bot via sendmessage sur application hors MS office.

    Le but rechercher dans ma demande de généralisation de code, est de ne pas devoir coder au cas par cas, mais de pouvoir réutiliser les mêmes fonctions pour mes différents projets en cours, passés et futurs.

    Il me semble qu'en procédant de la sorte, j'aurai un gain de temps de codage non négligeable, ainsi qu'une trame "identique" et fonctionnelle qui me permettra plus aisément de mettre en place de nouveaux outils et migrer mes premières relique pour uniformisation.

    Si vous avez de quelconque conseils, lecture, avis, pour devenir plus "pro" dans mon approche de codage Vba, n'hésitez pas.

  16. #16
    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
    @mfoxy,

    Puisque tu cherches à utiliser des codes génériques pour gagner du temps par une approche plus systématique, dans le fichier joint, j'ai ajouté un module DateObject qui permet de manipuler une date comme un objet et non plus comme un type primitif de données.

    Ca permet du code concis et clair à qui doit manipuler des dates sans devoir réinventer la roue à chaque fois.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TestDate()
      Dim d As New DateObject
     
      d.init Date
      Debug.Print d.FirstDayOfMonth.ToDate ' premier jour du mois en date
      Debug.Print d.LastDayOfQuarter.WeekdayName 'Nom du jour de la semaine du dernier jour du trimestre
      ' La ligne suivante illustre que beaucoup de propriétés de l'objet DateObject renvoient un objet DateObject... Ca permet d'empiler facilement
      ' les propriétés en notation pointée...
      Debug.Print d.FirstDayOfQuarter.Offset(-6, "M").EndOfMonth.Offset(2, "M").ToDate 'dernier jour du 2ième trimestre en arrière
    End Sub
    Ce n'est pas ma dernière version mais je pense que tout est ok dedans... A s'approprier, à enrichir... pour encore plus de fun et de productivité dans tes codes... Je le donne ici même si il est "hors scope" de ta demande initiale parce qu'il illustre que l'on a toujours intérêt à rendre son code générique. Cela fait gagner un temps fou parce qu'on s'appuie sur des petites procédures/fonctions qui reçoivent les variables en paramètres et que l'on peut tester à fond et réutiliser de projet en projet...


    Citation Envoyé par mfoxy Voir le message
    [...]
    Il me semble qu'en procédant de la sorte, j'aurai un gain de temps de codage non négligeable, ainsi qu'une trame "identique" et fonctionnelle qui me permettra plus aisément de mettre en place de nouveaux outils et migrer mes premières relique pour uniformisation. [...]
    Je ne peux qu'applaudir...
    Fichiers attachés Fichiers attachés
    "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...
    ---------------

  17. #17
    Membre Expert Avatar de mfoxy
    Homme Profil pro
    Automation VBA
    Inscrit en
    Février 2018
    Messages
    752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Belgique

    Informations professionnelles :
    Activité : Automation VBA
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2018
    Messages : 752
    Par défaut
    Re,

    Ma boucle du Post #1 remaniée avec utilisation de tes Class xlRow et xlTable .

    Merci pour les nouveaux fichiers, je regarde à cela demain car ici je n'ai plus toutes mes frites dans le même sachet , mais la fonction getTable va encore harmoniser un peu plus le code

    Tout grand merci à toi.

    Au plaisir de te lire,
    Michaël

    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
     
    Sub test_Fauconnier_Cls()
    'Author Cls Pierre Fauconnier
    'https://www.developpez.net/forums/d2051546/logiciels/microsoft-office/excel/macros-vba-excel/listobject-recuperer-offset-differement/#post11402760
     
      Dim T_Mapping As New xlTable
      Dim T_Personnes As New xlTable
     
      Dim Row As xlRow
      Dim r As Long
     
      T_Mapping.Init "t_Mapping"
      T_Personnes.Init "T_Personnes"
     
      For r = 1 To T_Mapping.RowsCount
     
       Set Row = T_Mapping.RowFromIndex(r)
     
        With Row
             wbDest = .Value("wbDest")
             wsDest = .Value("shDest")
             sCrit1 = .Value("Criteria1")
             sCrit2 = .Value("Criteria2")
             rRangeDest = .Value("RangeDest")
        End With
     
        Call TestSelectTDbyMapping(T_Personnes.DataRange, sCrit1, sCrit2, wbDest, wsDest, rRangeDest)
     
        Set Row = Nothing
     
      Next r
     
    End Sub

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment récupérer l'adresse d'une cellule qui a subi un Offset
    Par gonsp dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/02/2017, 12h42
  2. [Assembleur inline C++] Récupérer l'offset d'un label
    Par ShivX dans le forum x86 32-bits / 64-bits
    Réponses: 21
    Dernier message: 10/09/2009, 14h04
  3. Réponses: 1
    Dernier message: 21/01/2009, 17h44
  4. Réponses: 11
    Dernier message: 23/07/2002, 14h33
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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