Bonjour à tous,
@Bart
au lieu de mettre le "listobject" en static, pouvait-on aussi mettre le contenu du listobject comme array en static
Je ne sais pas si j'ai tout bien compris, mais dans la mesure ou le listobject est en Static son contenu l'est aussi, L'initialiser dans une fonction me permet de ne changer son nom que dans un seul emplacement. La fonction getListObject me permet de récupérer le fameux ListObject où qu'il soit.
Par exemple pour ajouter une ligne dans un tableau de clients depuis un formulaire :
Public Sub TestAddRow()
Dim itemRow As Excel.ListRow
Set itemRow = Factory.InitTabDatas.ListRows.Add
With itemRow
.Range(.Parent.ListColumns("Nom").Index).Value = NomClient.Value
.Range(.Parent.ListColumns("Prénom").Index).Value = PrenomClient.Value
.Range(.Parent.ListColumns("Age").Index).Value = AgeClient.Value
'...
'...
End With
End Sub
et pour récupérer une ligne j'utilise souvent un ID unique sur les tableaux.
Imaginons qu'une zone de liste déroulante paramétrée avec trois colonnes ID, Prénom, Nom dont la première est cachée et renvoyée par défaut.
Dans un module (TabsManagement) j'ai la fonction qui me permet de récupérer une ligne de tableau. Elle utilise aussi un listObject appelé depuis Factory :
'@Description "Retourne une ligne d'un tableau depuis la recherche d'une valeur dans une colonne"
Public Function GetRow(ByVal Table As Excel.ListObject, ByVal ColumnName As String, ByVal Value As Variant) As Excel.ListRow
If TypeName(Value) = "String" Then Value = """" & Value & """" Else Value = Value * 1
Dim Formula As String
Formula = "iferror(match({value},{table}[{column}],0),0)"
Formula = Replace(Formula, "{value}", Value)
Formula = Replace(Formula, "{table}", Table.Name)
Formula = Replace(Formula, "{column}", ColumnName)
Dim Index As Long
Index = Evaluate(Formula)
If Index > 0 Then Set GetRow = Table.ListRows(Index)
End Function
Pour l'appel je lui fournis les paramètres voulus et puis ça roule...
Private Sub ValiderSaisie_Click()
Dim itemRow As Excel.ListRow
If Me.ComboBox1.ListIndex > -1 Then
Set itemRow = TabsManagement.GetRow(Factory.InitTabDatas, "ID", CLng(Me.ComboBox1.Value))
If Not itemRow Is Nothing Then
With itemRow
NomClient.Value = .Range(.Parent.ListColumns("Nom").Index).Value
PrenomClient.Value = .Range(.Parent.ListColumns("Prénom").Index).Value
AgeClient.Value = .Range(.Parent.ListColumns("Age").Index).Value
'...
'...
End With
Else
'Todo "Make Something."
End If
Else
'Todo "Make Something."
End If
End Sub
Pour éviter de réinventer la roue à chaque fois il très judicieux de faire de petites fonctions, que l'on pourras réutiliser.