Bonjour, Salut à tous !
Je vois que nous sommes pleinement d'accord sur le fond avec Theze ! La petite différence est que je te propose juste de faire l'économie de la définition de l'objet tableau Excel-plage de données dans une variable...
Reprenons, la première chose est de supprimer les lignes en trop dans ton tableau Base, au départ : la ligne d'en-tête et une seule ligne de données, vide.
Tu as nommé ton tableau Base, Excel a introduit ce nom Base automatiquement dans le gestionnaire de noms, tu peux l'y retrouver en allant voir, comme les noms de tous tes autres tableaux Excel, et ce n'est pas toi qui les y a mis...
Et Excel lui a donné comme définition la plage de données de ton tableau.
C'est à dire : ListObjects("Base").DataBodyRange
représente exactement la même chose que Range("Base")
ou en notation compacte [Base]
, et que donc tu en disposes déjà sans avoir à le redéfinir.
J'écris donc ainsi ta procédure d'affectation :
Private Sub CommandButton1_Click()
Dim ctrl As Control, Col%, dLn%
With [Base]
dLn = .Rows.Count + 1
If dLn = 2 Then dLn = IIf(.Cells(1, 1) <> "", 2, 1)
For Each ctrl In Me.Controls
Col = Val(ctrl.Tag)
If Col > 0 Then .Cells(dLn, Col) = ctrl.Value
Next ctrl
End With
End Sub
On réfère à l'objet Base (plage de données), on définit la première ligne sous le tableau (comptée à partir de la première ligne du tableau), si on obtient 2, on teste la 1re cellule de la 1re ligne (cellule (1, 1) du tableau de données, si 1re ligne servie Ok pour 2, si 1re ligne vide on ajuste la der ligne à 1 pour ne pas la laisser vide.
Le reste sans changement par rapport à ton code initial, sauf qu'on adresse la valeur à la cellule (dLn, Col) du tableau sans s'être jamais préoccupé de la feuille. Et la ligne ajoutée sera automatiquement incorporée au tableau par Excel.
Cordialement.