XL 2010 alimenter Bdd avec userform

celine123

XLDnaute Junior
Bonjour,
J'ai un classeur avec un userform pour alimenter une BDD.
le sujet avait été suivit par Paf mais n'ayant plus de retour de sa part je pense qu'il doit être pas mal occupé(un grand merci pour le temps qu'il a consacré sur mon sujet)
c'est pour cela que j'en appelle a votre aide
j'ai un petite particularité c'est de pouvoir alimenter en deux fois mon formulaire
en gros j'aimerai pouvoir après avoir fait une première saisie (la partie hors frame) de pouvoir par rapport a la date et heure saisie en première partie pouvoir compléter pour la ligne correspondante la suite (frame) tout en pouvant ajouter un nouveau terme dans la colonne correspondante (si il n'existe pas) par la saisie dans les combobox
dans la trame du tableau la premiére partie se symbolise par la couleur orange et la deuxiéme par la couleur verte
petit point particulier si j'ai oui dans la combobox 25 la combobox 26 et visible sinon pas visible
Paf a déjà répondu pour ça:

Dans Private Sub UserForm_Initialize(), ajouter:
Code (Text):
ComboBox26.Visible = False
et dans Private Sub ComboBox25_Change()
Code (Text):
If UCase(ComboBox25) = "OUI" Then ComboBox26.Visible = True



il peut avoir des dates identiques
pour une date il peut avoir plusieurs heures
mais il ne peut pas avoir d'heures identiques
la combinaison date + heure ne peut être identique

voici le lien de la discussion déjà commencer qui concerne ce sujet et un sujet dans le même esprit
https://www.excel-downloads.com/threads/alimenter-bdd-avec-userform.20014041/
 

Pièces jointes

  • Copie de formulaire 2.xlsm
    21 KB · Affichages: 76

celine123

XLDnaute Junior
Code:
Option Explicit
Dim WS As Worksheet   'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de ce UserForm
Private Sub Ini()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Long    'Variable pour connaitre le numéro de derniere ligne
Dim i, y As Integer    'Variable pour connaitre incrémenter les Data
'On Vide tous les Controls Combobox
For Each CTRL In Me.Controls
    If TypeOf CTRL Is MSForms.ComboBox Then CTRL.Clear
Next CTRL
Set WS = ThisWorkbook.Worksheets("PARAMETRE") 'On identifie l'objet pour la feuille de travail
'Pour éviter les fash d'écran pour le select ci dessous
Application.ScreenUpdating = False
    'WS.Select 'On sélectionne la feuille sinon bug si elle ne l'est pas

For y = 1 To 31
    Select Case y
    Case 1 To 11, 15 To 27, 30 To 31
        L = WS.Cells(Cells.Rows.Count, y).End(xlUp).Row
        For i = 2 To L             'Boucle sur lignes  de la feuille :2 jusqu'à dernière
           With Me.Controls("ComboBox" & y)
            .AddItem WS.Cells(i, y)  'On ajoute dans les ComboBox toutes les valeurs, cellules après cellules
           End With
        Next
    End Select
Next y
Application.ScreenUpdating = True
End Sub

Private Sub BoutQuitte_Click()
Unload Me

End Sub

Private Sub CmdAjout_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Integer, y As Integer 'Variable pour connaitre le numéro de derniere ligne vide
Dim LeChoix As String
L = ThisWorkbook.Worksheets("BDD").Range("A65536").End(xlUp).Row + 1 ' On identifie la dernière ligne vide en partant du bas


  For y = 1 To 31
Select Case y
Case 1 To 11
With F1
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
Case 12
LeChoix = Switch(Me.OptionButton4, "oui", Me.OptionButton5, "Non")
F1.Cells(L, y) = LeChoix
Case 13
LeChoix = Switch(Me.OptionButton10, "Homme", Me.OptionButton11, "Femme")
F1.Cells(L, y) = LeChoix
Case 14
LeChoix = Switch(Me.OptionButton12, "Homme", Me.OptionButton13, "Femme")
F1.Cells(L, y) = LeChoix
Case 15 To 27
With F1
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
Case 28
LeChoix = Switch(Me.OptionButton14, "Conforme", Me.OptionButton15, "Non Conforme")
F1.Cells(L, y) = LeChoix
Case 29
LeChoix = Switch(Me.OptionButton16, "Conforme", Me.OptionButton17, "Non Conforme")
F1.Cells(L, y) = LeChoix
Case 30 To 31
With F1
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
End Select
  Next y



Dim Ctr As Control, col As Integer, lig As Long
With Worksheets("PARAMETRE")
For Each Ctr In Me.Controls
    If TypeName(Ctr) = "ComboBox" Then
        If Ctr.ListIndex = -1 And Ctr.Value <> "" Then
            col = Right(Ctr.Name, Len(Ctr.Name) - 8)
            lig = .Cells(Cells.Rows.Count, col).End(xlUp).Row + 1
            .Cells(lig, col) = Ctr
        End If
    End If
Next
End With
Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)



End Sub
A L 'activation on démarre le focus sur la Première Combobox

Private Sub ComboBox25_Change()
If UCase(ComboBox25) = "OUI" Then ComboBox26.Visible = True
End Sub

Private Sub UserForm_Activate()
Me.ComboBox1.SetFocus
End Sub
Private Sub UserForm_Initialize()
ComboBox1.List = Intersect(Feuil2.[A2:A1000000], Feuil2.UsedRange).Value
Ini
ComboBox26.Visible = False
End Sub

j'ajoute la ligne ici si j'ai bien compris
 

Dranreb

XLDnaute Barbatruc
Oui.
Mais moi je préfère travailler avec les ListObject car on n'a plus jamais besoin de se poser de question quant à savoir quelle est la dernière ligne. On l'a par LO.ListRows.Count, mais on n'en a même pas besoin puisqu'il suffit de prendre LO.ListRows.Add pour obtenir un ListRow d'une nouvelle ligne.
 

Dranreb

XLDnaute Barbatruc
Il y a surtout le tableau dynamique: c'est une variable déclarée avec deux parenthèses sans rien dedans.
VB:
Dim T() As Variant
On peut lui affecter la Value d'un Range représentant plusieurs cellules contigües ou au contraire en affecter un à la Value d'un tel Range.
On accède à un élément du tableau par son nom suivi des valeurs d'indices entre parenthèses séparées par des virgules. C'est accès est beaucoup plus rapide qu'un accès à une ou plusieurs cellules.
Pour la Value d'un Range de plusieurs cellules il y a 2 dimensions: ligne et colonne commençant chacune à 1. UBound(T, 1) donne le nombre de lignes, UBound(T, 2) le nombre de colonnes.
 

celine123

XLDnaute Junior
merci pour ces explication dranreb mais règle pas mon problème de saisie en 2 fois
j'ai fait quelque recherche sur ce que tu vient d'expliquer pour le moment j'ai pas le niveau pour mettre ça en application
mon fichier en finalité n'aura que 250 ligne environ de saisie
 

celine123

XLDnaute Junior
le problème est que ce que tu m'explique je ne sait pas le mettre en application
c'est très gentil de ta part et j'en prend compte pour mes connaissance personnel (je travaillerait le sujet, j’essayerai cette méthode)
mais je ne sait pas pour le moment appliquer tout ça
j'ai part contre besoin de fichier pour le cour terme
je ferait des test hors demande précise concernant tout ce que tu vient d’énoncer et je reviendrai surement vers toi afin d'avoir des correction ou des conseil
 

Dranreb

XLDnaute Barbatruc
J'ai mis aux postes #8 et #11 des renseignements pour alimenter la ComboBox dans l'UserForm_Initialize.
Pour installer un modèle de procédure détectant un changement de celle ci, devant forcément conduire à noter le numéro de ligne déduit de son ListIndex et éventuellement appeler une autre procédure qui garnit des champs à partir des cellule de cette ligne, le mieux c'est de sélectionner la ComboBox dans la liste de gauche qui surmonte la fenêtre de code, ou mieux de double cliquer dessus dans la fenêtre de conception. Ça fait venir un modèle de Private Sub ComboBox1_Change().
 

celine123

XLDnaute Junior
Bonjour Dranreb j'ai essayée de mettre en application tes indications mais sans résultat j'ai a chaque fois des messages d'erreur voici le code
Code:
Option Explicit
Dim WS As Worksheet   'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de ce UserForm
Private Sub Ini()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Long    'Variable pour connaitre le numéro de derniere ligne
Dim i, y As Integer    'Variable pour connaitre incrémenter les Data
'On Vide tous les Controls Combobox
For Each CTRL In Me.Controls
    If TypeOf CTRL Is MSForms.ComboBox Then CTRL.Clear
Next CTRL
Set WS = ThisWorkbook.Worksheets("PARAMETRE") 'On identifie l'objet pour la feuille de travail
'Pour éviter les fash d'écran pour le select ci dessous
Application.ScreenUpdating = False
    'WS.Select 'On sélectionne la feuille sinon bug si elle ne l'est pas

For y = 1 To 31
    Select Case y
    Case 1 To 11, 15 To 27, 30 To 31
        L = WS.Cells(Cells.Rows.Count, y).End(xlUp).Row
        For i = 2 To L             'Boucle sur lignes  de la feuille :2 jusqu'à dernière
           With Me.Controls("ComboBox" & y)
            .AddItem WS.Cells(i, y)  'On ajoute dans les ComboBox toutes les valeurs, cellules après cellules
           End With
        Next
    End Select
Next y
Application.ScreenUpdating = True
End Sub

Private Sub BoutQuitte_Click()
Unload Me

End Sub

Private Sub CmdAjout_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L, y As Integer 'Variable pour connaitre le numéro de derniere ligne vide
Dim LeChoix As String

L = ThisWorkbook.Worksheets("BDD").Range("A65536").End(xlUp).Row + 1 ' On identifie la dernière ligne vide en partant du bas


  For y = 1 To 31
Select Case y
Case 1 To 11
With F1
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
Case 12
LeChoix = Switch(Me.OptionButton4, "oui", Me.OptionButton5, "Non")
F1.Cells(L, y) = LeChoix
Case 13
LeChoix = Switch(Me.OptionButton10, "Homme", Me.OptionButton11, "Femme")
F1.Cells(L, y) = LeChoix
Case 14
LeChoix = Switch(Me.OptionButton12, "Homme", Me.OptionButton13, "Femme")
F1.Cells(L, y) = LeChoix
Case 15 To 27
With F1
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
Case 28
LeChoix = Switch(Me.OptionButton14, "Conforme", Me.OptionButton15, "Non Conforme")
F1.Cells(L, y) = LeChoix
Case 29
LeChoix = Switch(Me.OptionButton16, "Conforme", Me.OptionButton17, "Non Conforme")
F1.Cells(L, y) = LeChoix
Case 30 To 31
With F1
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
End Select
  Next y



Dim Ctr As Control, col As Integer, lig As Long
With Worksheets("PARAMETRE")
For Each Ctr In Me.Controls
    If TypeName(Ctr) = "ComboBox" Then
        If Ctr.ListIndex = -1 And Ctr.Value <> "" Then
            col = Right(Ctr.Name, Len(Ctr.Name) - 8)
            lig = .Cells(Cells.Rows.Count, col).End(xlUp).Row + 1
            .Cells(lig, col) = Ctr
        End If
    End If
Next
End With
Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)



End Sub
A L 'activation on démarre le focus sur la Première Combobox

Private Sub ComboBox1_Change()
ComboBox1.List = Intersect(Feuil2.[A2:A1000000], Feuil2.UsedRange).Value
End Sub

Private Sub ComboBox25_Change()
If UCase(ComboBox25) = "OUI" Then ComboBox26.Visible = True
End Sub

Private Sub UserForm_Activate()
Me.ComboBox1.SetFocus
End Sub
Private Sub UserForm_Initialize()
Dim TE(), TS(), L As Long
TE = Feuil2.UsedRange.Resize(, 2).Value
ReDim TS(0 To UBound(TE, 1) - 2)
For L = 2 To UBound(TE, 1)
   TS(L - 2) = Format(TE(L, 1) + TE(L, 2), "dd/mm/yyyy hh:mm")
   Next L
Me.ComboBox1.List = TS
Ini
ComboBox26.Visible = False
End Sub
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Dans ComboBox1_Change il n'y a pas lieu de modifier ComboBox1.List.
Juste faire: LCou = ComboBox1.ListIndex + 1
LCou étant déclaré derrière WS: Private LCou As Long
Je vous déconseille d'utiliser des WS.Cells(LCou, n).Value ensuite pour garnir vos contrôles de ce qui y existe, passez plutôt par un tableau VLgn chargé en une fois de cette ligne.

le For y = 1 To 31 dans votre code me paraît bizarre. Ne serait ce pas plutôt
For y = 2 to 31 ? Parce que sinon il me semble que vous fusillez plus bas la liste du ComboBox1
avec With Me.Controls("ComboBox" & y)
 
Dernière édition:

celine123

XLDnaute Junior
j'ai fait (je pense) correctement les modifications mais j'ai un message d'erreur sur
Code:
ReDim TS(0 To UBound(TE, 1) - 2)
pour
passez plutôt par un tableau VLgn chargé en une fois de cette ligne.
j'ai pas tout compris
Code:
Option Explicit
Dim WS As Worksheet
Private LCou As Long   'Variable pour un Objet Worksheet en PUBLIC pour tous les Controls de ce UserForm
Private Sub Ini()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Long    'Variable pour connaitre le numéro de derniere ligne
Dim i, y As Integer    'Variable pour connaitre incrémenter les Data
'On Vide tous les Controls Combobox
For Each CTRL In Me.Controls
    If TypeOf CTRL Is MSForms.ComboBox Then CTRL.Clear
Next CTRL
Set WS = ThisWorkbook.Worksheets("PARAMETRE") 'On identifie l'objet pour la feuille de travail
'Pour éviter les fash d'écran pour le select ci dessous
Application.ScreenUpdating = False
    'WS.Select 'On sélectionne la feuille sinon bug si elle ne l'est pas

For y = 2 To 31
    Select Case y
    Case 1 To 10, 14 To 26, 29 To 30
        L = WS.Cells(Cells.Rows.Count, y).End(xlUp).Row
        For i = 2 To L             'Boucle sur lignes  de la feuille :2 jusqu'à dernière
           With Me.Controls("ComboBox" & y)
            .AddItem WS.Cells(i, y)  'On ajoute dans les ComboBox toutes les valeurs, cellules après cellules
           End With
        Next
    End Select
Next y
Application.ScreenUpdating = True
End Sub

Private Sub BoutQuitte_Click()
Unload Me

End Sub

Private Sub CmdAjout_Click()
Dim CTRL As Control 'Variable pour la collection des controls
Dim L As Integer, y As Integer 'Variable pour connaitre le numéro de derniere ligne vide
Dim LeChoix As String
L = ThisWorkbook.Worksheets("BDD").Range("A65536").End(xlUp).Row + 1 ' On identifie la dernière ligne vide en partant du bas


  For y = 2 To 30
Select Case y
Case 1 To 10
With Feuil2
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
Case 11
LeChoix = Switch(Me.OptionButton4, "oui", Me.OptionButton5, "Non")
Feuil2.Cells(L, y) = LeChoix
Case 12
LeChoix = Switch(Me.OptionButton10, "Homme", Me.OptionButton11, "Femme")
Feuil2.Cells(L, y) = LeChoix
Case 13
LeChoix = Switch(Me.OptionButton12, "Homme", Me.OptionButton13, "Femme")
Feuil2.Cells(L, y) = LeChoix
Case 14 To 26
With Feuil2
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
Case 27
LeChoix = Switch(Me.OptionButton14, "Conforme", Me.OptionButton15, "Non Conforme")
Feuil2.Cells(L, y) = LeChoix
Case 28
LeChoix = Switch(Me.OptionButton16, "Conforme", Me.OptionButton17, "Non Conforme")
Feuil2.Cells(L, y) = LeChoix
Case 29 To 30
With Feuil2
.Cells(L, y) = Me.Controls("ComboBox" & y).Value
End With
End Select
  Next y



Dim Ctr As Control, col As Integer, lig As Long
With Worksheets("PARAMETRE")
For Each Ctr In Me.Controls
    If TypeName(Ctr) = "ComboBox" Then
        If Ctr.ListIndex = -1 And Ctr.Value <> "" Then
            col = Right(Ctr.Name, Len(Ctr.Name) - 8)
            lig = .Cells(Cells.Rows.Count, col).End(xlUp).Row + 1
            .Cells(lig, col) = Ctr
        End If
    End If
Next
End With
Ini 'On lance la réinitialisation du UserForm (Macro en haut du Module)



End Sub

Private Sub ComboBox1_Change()
LCou = ComboBox1.ListIndex + 1
End Sub

Private Sub ComboBox25_Change()
If UCase(ComboBox25) = "OUI" Then ComboBox26.Visible = True
End Sub

Private Sub UserForm_Activate()
Me.ComboBox1.SetFocus
End Sub
Private Sub UserForm_Initialize()
Dim TE(), TS(), L As Long
TE = Feuil2.UsedRange.Resize(, 2).Value
ReDim TS(0 To UBound(TE, 1) - 2)
For L = 2 To UBound(TE, 1)
   TS(L - 2) = Format(TE(L, 1) + TE(L, 2), "dd/mm/yyyy hh:mm")
   Next L
Me.ComboBox1.List = TS
Ini
ComboBox26.Visible = False
End Sub
 

Dranreb

XLDnaute Barbatruc
Curieux. Se pourrait il qu'elle soit vide la feuille Excel représentée du coté de VBA par l'objet Worksheet Feuil2 de la rubrique Microsoft Excel Objets ? Regardez en tout cas ce qu'il y a dans le tableau TE qui est repris de sa UsedRange juste avant.
 

Discussions similaires

  • Question
Microsoft 365 webbrowser
Réponses
20
Affichages
906

Statistiques des forums

Discussions
312 169
Messages
2 085 925
Membres
103 043
dernier inscrit
nouha nj