Oui, c'est normal, j'ai répondu avant de voir votre fichier et j'ai pensé que baseMetaux était le nom d'un tableau structuré...
Voici donc une proposition nécessitant toutefois pas mal de réorganisations :
- mettre les données sous forme de tableau structuré et le nommer "Base",
- enlever les textbox inutiles et les remplacer par des labels,
- bien nommer toutes les textbox et combobox qui seront reportées dans la base : elles doivent contenir un "_" (avec le code ci-dessous mais il est possible d'ajuster et de trouver un autre dénominateur commun). Les autres, qui ne seront pas archivées, ne doivent pas contenir le dénominateur commun. Il faut aussi changer l'ordre de tabulation des contrôles de manière à reporter dans les bonnes cases les données. Et changer un peu la disposition de certains de ces contrôles ne ferait pas de mal.
Voici un code :
Private Sub CommandButton_ajout_click()
Dim t(), ctrl As Control, n&, col&, nvl&
For Each ctrl In Me.Controls 'pour chaque control
If ctrl.Name Like "*_*" Then 'si le control contient "_"
n = n + 1: ReDim Preserve t(1 To n) 'on prépare un nouvel item à notre tableau dynamique
t(n) = ctrl.Value 'il prend la valeur du control en cours
End If
Next ctrl
With Range("Base") 'avec tab. struc. "Base"
col = nColonne(TextBox_poids_prod.Value, .Name) 'renvoie la colonne de correspondance
nvl = .Rows.Count + 1 'nouvelle ligne (nécessite de ne pas avoir de lignes vides)
.Cells(nvl, 1).Resize(, n - 2) = t 'on colle les valeurs "fixes"
.Cells(nvl, 12) = t(n - 1) 'observations
If col > 0 Then .Cells(nvl, col) = CDbl(t(n)) 'poids
End With
End Sub
Voici la fonction à mettre dans un module normal :
Function nColonne(scherche As String, Ref As String) As Long
If Application.CountIf(Range(Ref).Rows(0), scherche) > 0 Then
nColonne = Application.Match(scherche, Range(Ref).Rows(0), 0)
End If
End Function
Donc le plus important déjà, c'est le tableau structuré. Ensuite le code marchera (mais les données seront pas reportées comme espéré tant que les petites opérations, dont le changement de l'ordre de tablulation, ne seront pas effectuées).
Pour mettre sous forme de tableau structuré, il faut aller sur une cellule du tableau, puis dans Accueil/mettre sous forme de tableau structuré/cochez avec entêtes. Puis, dans le nouvel onglet Création qui apparait (en jaune en principe), allez dans renommer et entrez Base.
Edit : j'ai rajouté les variables pour éviter les erreurs de compilation.
Cdlt,