UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Joe[PT]

XLDnaute Junior
Bonjour à tous,

Je viens (avec bien du mal) d'achever un UserForm qui permet de valider la saisie d'un fournisseur...

Par contre, je m'aperçois que si le fournisseur existe déjà dans la base, il le saisit une 2e fois alors qu'il serait plus judicieux d'afficher les éléments déjà saisis pour le fournisseur en question afin d'éventuellement pouvoir modifier des éléments puis valider...

Code:
Private Sub CommandButton1_Click() 'Valider
Dim L As Long
' Si la textbox ne contient aucune valeur, alors ne pas mettre à jour (rien)
    If TextBox1.Value = "" Then Unload Me: Exit Sub

    With Worksheets("Fournisseurs")
    L = .Cells(6000, 1).End(xlUp).Row + 1   '1ère ligne vide
        For I = 1 To 19
        .Cells(L, I) = Me.Controls("TextBox" & I)
         Me.Controls("TextBox" & I) = ""
        Next I
        If .Cells(L, 9) <> "" Then .Cells(L, 9) = CDbl(.Cells(L, 9))
        If .Cells(L, 10) <> "" Then .Cells(L, 10) = CDbl(.Cells(L, 10))
        If .Cells(L, 11) <> "" Then .Cells(L, 11) = CDbl(.Cells(L, 11)): .Cells(L, 11).NumberFormat = "0.00 €"
        If .Cells(L, 12) <> "" Then .Cells(L, 12) = CDbl(.Cells(L, 12))
        If .Cells(L, 17) <> "" Then .Cells(L, 17) = CDbl(.Cells(L, 17)): .Cells(L, 17).NumberFormat = "0,00%" 

' Permet d'ajuster automatiquement la largeur de la colonne R & S à son contenu
    .Columns("R:S").AutoFit
    End With

' Trier la liste en validant la saisie
'

    Range("A16:Z1000").Select
    ActiveWorkbook.Worksheets("Fournisseurs").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("Fournisseurs").Sort.SortFields.Add Key:=Range( _
        "A16"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("Fournisseurs").Sort
        .SetRange Range("A16:Z1000")
        .Header = xlNo
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Range("A2").Select
    
    
' Repositionner le curseur en TextBox1 après validation pour une nouvelle saisie
'
    TextBox1.SetFocus
    
End Sub

Je pense qu'il faut poser une condition sur la première TextBox1 mais la syntaxe... Hum !

De plus, je m'aperçois que la ligne If .Cells(L, 17) <> ""... au lieu de me renvoyer 3% m'affiche à la validation : 300% (Personnellement, j'aimerai bien trouver des fournisseurs qui me font des remises de 300% :p )

En attendant vos avis, merci et bonne journée.

Joe
 

Lone-wolf

XLDnaute Barbatruc
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonjour joe

Je te propose ceci. Avec un nouveau classeur, crée un formulaire avec: 3 TextBox, 1 combobox et 2 boutons

Dans les propriétés textbox > Tag, tu inscrit pour chaqu'une d'elles, 1 - 2 - 3.

ensuite copie ceci:

Code:
Private Sub UserForm_Initialize()
Dim derlig As Integer

With Sheets("Feuil1")
For x = 2 To .Range("a65536").End(xlUp).Row
        ComboBox1 = .Range("a" & x)
        'filtre les doublons
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem .Range("a" & x)
    Next x
    ComboBox1.Text = ""
End With
End Sub

Private Sub UserForm_Activate()
ComboBox1.Text = ""
TextBox2.SetFocus
End Sub

Private Sub TextBox3_Change() ' Affiche Nom et Prénom
If TextBox3.Text <> "" Then _
TextBox1.Text = TextBox2.Text & " " & TextBox3.Text
End Sub

Private Sub CommandButton1_Click() 'Bouton enregistrements
Dim ctrl As Control
Dim col As Integer
Dim derlig As Integer
Dim cel As Range

derlig = Sheets("Feuil1").Range("a65536").End(xlUp).Row + 1

For Each ctrl In Me.Controls
col = Val(ctrl.Tag)
If col > 0 Then Sheets("Feuil1").Cells(derlig, col) = ctrl
Next ctrl

For i = 1 To 3
Me.Controls("TextBox" & i).Text = ""
Next
End Sub

Private Sub CommandButton2_Click() 'Bouton Recherche
Dim cel As Range
If ComboBox1 <> "" Then
With Sheets("Feuil1").Range("a2:s65000")
Set cel = .Find(ComboBox1, , xlValues)
If Not cel Is Nothing Then
MsgBox "Le fournisseur est déjà dans la liste", , "Fournisseurs"
ComboBox1 = ""
Exit Sub
End If
End With
End If
End Sub


A+ :cool:
 
Dernière édition:

ExcelDow

XLDnaute Occasionnel
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonjour Joe[PT] et Lone-Wolf,
Ce projet ci dessus a attiré mon attention, j'ai essayé de construire un formulaire d'après le code VBA, mais je m'en sort pas.
serais t il possible s'il vous plaît, de m'informer un petit peux plus sur la construction de la feuille de donnée, et du formulaire.
Merci à vous et très bonne fin de journée
A ++++
 

Lone-wolf

XLDnaute Barbatruc
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

bonjour ExcelDow,

je ne veux pas répéter les explications déjà données.

Notre ami Joe à 19 TextBox partant de 1 à 19; dans les propriétés de chaqu'une d'elles visualise la ligne Tag. Là tu inscrit 1 -2- 3 - 4 etc., jusqu'à 19. Chaque Tag doit correspondre à une colonne précise. Tu dois faire attention à ne pas mettre par ex. dans Textbox5 le tag à 4 ou à 6. Admettons que dans la ("TextBox5" - Tag 5 tu met le Tag à 6) qui correspond à la colonne E, et tu inscris 5874, c'est dans la colonne Ville que vas être enregister le N° postal.

Pour la feuille de données, tu pars de la colonne A puis suivant: nom complet - nom - prénom - adresse - CP - Ville etc.
Comme ici on commence avec le nom complet, il faut faire comme ceci : TexBox1 = TextBox2 & " " & TextBox3.

Voilà, tu peux copier le code et voir le résultat.


@ Joe: un modification pour le bouton d'enregistrement.


Code:
Dim ctrl As Control
Dim col As Integer
Dim derlig As Integer
Dim i As Long
Dim cel As Range

With Sheets("Feuil1")
derlig = .Range("a65536").End(xlUp).Row + 1

For Each ctrl In Me.Controls
col = Val(ctrl.Tag)
If col > 0 Then
If Not IsNumeric(ctrl) Then
.Cells(derlig, col) = ctrl
Else
.Cells(derlig, col) = CDbl(ctrl)   'format numérique simple ex: 31 - 312 - 3124
End If
End If
Next ctrl
.Range("G2:H65000").NumberFormat = "000 000 00 00"   'Numéro téléphone et fax
.Range("A:I").Columns.AutoFit
End With


For i = 1 To 19
Me.Controls("TextBox" & i).Text = ""
Next

'AJOUTER MACRO DE RECHERCHE DANS TEXTBOX4 CORRESPONDANT À L'ADRESSE DU FOURNISSEUR
'Tu peux garder ou supprimer la COMBO.

Private Sub TextBox4_Enter()
Dim cel As Range,  i As Long
TextBox4.SetFocus

If TextBox4 = "" Then
With Sheets("Feuil1").Range("a2:i65000")
Set cel = .Find(TextBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
MsgBox "Le fournisseur est déjà dans la liste.", , "Fournisseurs"
For i = 1 To 9
Me.Controls("TextBox" & i).Text = ""
Next
End If
End With
Else
Exit Sub
End If
End Sub


A+ :cool:
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bon beiiin, comme je suis gentil :eek:

voilà le classeur démo, mais qui a seulement 3 TextBox.


A+ :cool:
 

Pièces jointes

  • Classeur2.xls
    43 KB · Affichages: 106
  • Classeur2.xls
    43 KB · Affichages: 96

ExcelDow

XLDnaute Occasionnel
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Hello Lone-wolf,
J'ai construit ce formulaire selon tes données, mais je suis pas sur d'avoir compris pour la suite, pourrais-tu m'informer s'il te plaît ??
Merci
 

Pièces jointes

  • Classeur1.xlsm
    27.7 KB · Affichages: 76
  • Classeur1.xlsm
    27.7 KB · Affichages: 72

Lone-wolf

XLDnaute Barbatruc
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonsoir Joe,

Encore un modification pour le bouton de recherche.


Code:
Private Sub CommandButton2_Click() 'Bouton Recherche
Dim cel As Range, i As long

If ComboBox1 <> "" Then
With Sheets("Feuil1").Range("a2:i65000")
Set cel = .Find(ComboBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
For i = 1 To 19 'Nombre de Colonnes et TextBox
Me.Controls("TextBox" & i).Text = cel.Offset(0, i - 1)
Next i
Else
MsgBox "Pas de correspondant en cours.", , "Fornisseurs"
Combobox1 = ""
For i = 1 To 19
Me.Controls("TextBox" & i).Text = ""
next 
End If
End With
End If
End Sub


'AJOUT RECHERCHE ET MODIFICATION

Private Sub CommandButton3_Click() 'Bouton Modification
Dim cel As Range, i As Long
If ComboBox1 <> "" Then
With Sheets("Feuil1").Range("a2:i65000")
Set cel = .Find(ComboBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
For i = 1 To 9
cel.Offset(0, i - 1) = Me.Controls("TextBox" & i).Text
Next i
End If
End With
End If
For i = 1 To 9
Me.Controls("TextBox" & i).Text = ""
Next i
End Sub

Pour le format % c'est 0.03 et non 3.


A+ :cool:
 
Dernière édition:

Lone-wolf

XLDnaute Barbatruc
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bon Joe,

Si tu repasse par ici voici les macros au complet.


Code:
Option Explicit
Dim lig As Integer

Private Sub UserForm_Initialize()
Dim x As Integer

ComboBox1.Clear

With Sheets("Feuil1")
For x = 2 To .Range("a65536").End(xlUp).Row
        ComboBox1 = .Range("a" & x)
        'filtre les doublons
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem .Range("a" & x)
    Next x
    ComboBox1.Text = ""
End With
End Sub

Private Sub UserForm_Activate()

Me.Top = Me.Top + 5
Me.Left = Me.Left + 288

ComboBox1.Text = ""
TextBox2.SetFocus
End Sub

Private Sub TextBox3_Change() ' Affiche Nom et Prénom
If TextBox3.Text <> "" Then _
TextBox1.Text = TextBox2.Text & " " & TextBox3.Text
End Sub

Private Sub TextBox4_Enter()
Dim cel As Range, i As Long

TextBox4.SetFocus
If TextBox4 = "" Then
With Sheets("Feuil1").Range("a2:i65000")
Set cel = .Find(TextBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
MsgBox "Le fournisseur est déjà dans la liste.", , "Fournisseurs"
For i = 1 To 9
Me.Controls("TextBox" & i).Text = ""
Next
End If
End With
Else
Exit Sub
End If
End Sub

Private Sub CommandButton1_Click() 'Bouton Enregistrements
Dim col As Integer, derlig As Integer, x As Integer
Dim ctrl As Control, cel As Range, i As Long

With Sheets("Feuil1")
derlig = .Range("a65536").End(xlUp).Row + 1

For Each ctrl In Me.Controls
col = Val(ctrl.Tag)
If col > 0 Then
If Not IsNumeric(ctrl) Then
.Cells(derlig, col) = ctrl
Else
.Cells(derlig, col) = CDbl(ctrl)   'format numérique simple ex: 3124
End If
End If
Next ctrl
.Range("G2:H65000").NumberFormat = "000 000 00 00"   'Numéro téléphone et fax
.Range("A:I").Columns.AutoFit
.Range("A2:I65000").Sort [A2], xlAscending
End With

With Sheets("Feuil1")
ComboBox1.Clear
For x = 2 To .Range("a65536").End(xlUp).Row
        ComboBox1 = .Range("a" & x)
        'filtre les doublons
        If ComboBox1.ListIndex = -1 Then ComboBox1.AddItem .Range("a" & x)
    Next x
    ComboBox1.Text = ""
End With

For i = 1 To 9
Me.Controls("TextBox" & i).Text = ""
Next
TextBox2.SetFocus
End Sub

Private Sub CommandButton2_Click() 'Bouton Recherche
Dim cel As Range, i As Long

If ComboBox1 <> "" Then
With Sheets("Feuil1").Range("a2:i65000")
Set cel = .Find(ComboBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
For i = 1 To 9
Me.Controls("TextBox" & i).Text = cel.Offset(0, i - 1)
Next i
TextBox7 = Format(TextBox7, "000 000 00 00")
TextBox8 = Format(TextBox8, "000 000 00 00")
Else
MsgBox "Pas de correspondant en cours.", , "Fornisseurs"
ComboBox1 = ""
For i = 1 To 9
Me.Controls("TextBox" & i).Text = ""
Next i
End If
End With
End If
TextBox2.SetFocus
End Sub

Private Sub CommandButton3_Click() 'Bouton Modification
Dim cel As Range, i As Long

If ComboBox1 <> "" Then
With Sheets("Feuil1").Range("a2:i65000")
Set cel = .Find(ComboBox1, , xlValues, xlWhole)
If Not cel Is Nothing Then
For i = 1 To 9
cel.Offset(0, i - 1) = Me.Controls("TextBox" & i).Text
Next i
End If
End With
End If
For i = 1 To 9
Me.Controls("TextBox" & i).Text = ""
Next i
TextBox2.SetFocus
End Sub

Private Sub CommandButton4_Click() 'Bouton Annuler
Dim x As Long, k As Long, RechNom As Range, Rep

Rep = MsgBox("Voulez-vous vraiment annuler les modifications ?", vbYesNo, "Fournisseur")
If Rep = vbYes Then
For k = 1 To 9
Me.Controls("TextBox" & k).Text = Me.Controls("TextBox" & k).Text
Next k
Else
With Sheets("Feuil1").Columns(1)
Set RechNom = .Cells.Find(TextBox1.Value)
    If RechNom Is Nothing Then
        Exit Sub
    Else
    lig = RechNom.Row
    End If
With Sheets("Feuil1")
For x = 1 To 9
.Cells(lig, x) = Me.Controls("Textbox" & x)
If Not IsNumeric(Me.Controls("Textbox" & x)) Then
.Cells(lig, x) = Me.Controls("Textbox" & x)
Else
.Cells(lig, x) = CDbl(Me.Controls("Textbox" & x))
End If
Next x
End With
End With
End If
TextBox2.SetFocus
End Sub

Private Sub CommandButton5_Click() 'Bouton Fermeture Formulaire
Unload Me
End Sub


A+ :cool:
 
Dernière édition:

ExcelDow

XLDnaute Occasionnel
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonsoir Lone-wolf et Joe,
Un grand merci et bravo pour votre compétence, et votre aide
J'ai testé le toute et super ça fonctionne très bien;
Merci et bonne soirée
 

ExcelDow

XLDnaute Occasionnel
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonjour lone-wolf,
J'aurais juste une question que j'arrive pas à résoudre:
J'ouvre le formulaire et je saisi un nouveau client, et lorsque je fais transfert sur la feuille, seul les colonnes A,B,C sont transférée, et pas D,E,F,G,H,I.
Est-ce que quelqu'un ou quelqu'une pourrais m'éclairer, et me donner s'il vous plaît un petit coup de main
Merci à vous tous
A+++
J'arrive pas à mettre le classeur dans le site je sais pas pourquoi ???
 

Joe[PT]

XLDnaute Junior
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonjour Lone-Wolf, ExcelDow,

Mille excuses pour cette réponse tardive, j'ai été accaparé par de menus soucis personnels et du coup... j'ai lâché un peu de lest. Je reviens enfin... plus serein et plus disposé à la concentration.

Merci infiniment Lone-Wolf, ton aide m'a au moins permis de comprendre le fonctionnement de plusieurs éléments d'un UserForm, chose que j'ai toujours trouvé assez ardue... Je ne dis pas, bien sûr, que j'ai tout compris :p ... J'ai repris ton code est tout fonctionne presque bien... J'ai un petit souci avec la fonction "Recherche", je vais creuser....

Encore mille fois merci ;)

Joe
 

Joe[PT]

XLDnaute Junior
Re : UserForm de Saisie : Afficher données si fournisseur existe déjà dans la base

Bonjour ExcelDow,

Tes TextBox1 à TextBox9 doivent avoir le "Tag" de 1 à 9 pour remplir ton tableau dans le bon ordre

Enfin... je pense que c'est çà... avis d'un non-expert ;)

Joe
 

Discussions similaires

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16