Bonjour
En préambule, je ne suis qu'un piètre bricoleur en VBA, j'ai bcp de mal à tout articuler.
Je vais tenter de me faire comprendre.

J'utilise des Userform pour remplir et modifier des données dans des tables excel.
Nom : USFcultures.PNG
Affichages : 604
Taille : 14,8 Ko
Les données sont chargées à partir de la fonction TAG de la fenêtre propriété des Combobox/Listbox, les données des listbox sont modifiable par une liste chargée en rowsource.

Ces données sont ensuite modifiées dans la table à la ligne date mentionnée dans la listbox Date (verrouillée au chargement) et à la bonne colonne à partir du tag.

Extrait table:
Nom : extrait table.PNG
Affichages : 420
Taille : 29,4 Ko

Mon classeur contient une vingtaine de formulaires et je le fait évoluer assez régulièrement. Je suis sur un projet Access, mais encore du travail, donc pour l'instant travail avec ce fichier qui doit rester fiable.
Pour des raisons de clarté et de classement, il m'arrive d'ajouter des colonnes à mes tables, je suis donc à chaque fois obligé de modifier tout les TAG des formulaires qui y sont liés avec les risques d'erreur que cela comporte. Je pourrais les ajouter les nouvelles données en fin de liste, mais ça devient vite un fouillis et difficile à retrouver.

Existe t il une possibilité de charger le données dans les différentes box à partir de nom (nom des entêtes de colonnes par ex ou autre), j'ai essayé plusieurs solution sans succès.

Code lié au userform, toute critique est bienvenue, il y a certainement de l'aménagement et du nettoyage à faire.

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
 
Option Explicit
Dim Ligne As Long
 
 
Private Sub UserForm_Initialize()
Dim j As Long
 
  With Sheets("Data_Système")
    For j = 4 To .Range("A" & Rows.Count).End(xlUp).Row
      Me.CboDate.AddItem .Range("A" & j)
    Next j
  End With
    CboDate.Value = Format(CboDate.Value, "dd/mm/yy")
    CboDate.Value = Sheets("Fiche").Range("Date_Visite")
    Me.CboDate.Enabled = False
 
 
   End Sub
 
Private Sub CboDate_Change()
Dim Ctrl As Control
Dim Colonne As Integer
 
  If Me.CboDate.ListIndex = -1 Then Exit Sub
  With Sheets("Data_Système")
    Ligne = Me.CboDate.ListIndex + 4
    For Each Ctrl In Me.Controls
Colonne = CInt("0" & Ctrl.Tag)
      If Colonne > 0 Then Ctrl = .Cells(Ligne, Colonne)
    Next Ctrl
  End With
End Sub
 
 
Function TrouveType(V)
TrouveType = V
If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 And InStr(TrouveType, ":") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd hh:mm"): Exit Function
If IsDate(TrouveType) = True And InStr(TrouveType, "/") <> 0 Then TrouveType = Format(TrouveType, "yyyy-mm-dd"): Exit Function
If IsNumeric(Replace(TrouveType, ".", ",")) = True Then TrouveType = Replace(TrouveType, ",", "."): Exit Function
End Function
 
Private Sub CmdModifier_Click()
  Dim Ctrl As Control
  Dim Colonne As Integer
  Dim Ligne As Long
  Dim x As Integer
 
     If Me.CboDate.ListIndex = -1 Then Exit Sub
      Ligne = Me.CboDate.ListIndex + 4
        With Sheets("Data_Système")
           For Each Ctrl In Me.Controls
                     Colonne = CInt("0" & Ctrl.Tag)
              If Colonne > 0 Then
                .Cells(Ligne, Colonne) = TrouveType(Ctrl)
              End If
        Next Ctrl
        For x = 1 To 10
            If CDbl("0" & Trim("" & Sheets("Fiche").Range("Rdt_C" & x).Value)) <> 0 Then
           .Cells(Ligne, 60 + x) = Sheets("Fiche").Range("coût_Ha_C" & x) / Sheets("Fiche").Range("Rdt_C" & x)
           Else:  .Cells(Ligne, 60 + x) = 0
              End If
Next
 
        End With
Unload Me
End Sub
 
 
Private Sub CmdAnnuler_Click()
Unload Me
End Sub
Merci de votre aide.
Joël