Enregistrement données sous conditions

350dr

XLDnaute Junior
Bonjour le forum,
Grace à ce forum, mon projet à bien avancé, Soyez en tous remercié.
J’ai néanmoins un code VBA à modifier et je ne sais pas comment faire.
Le voici :

'bouton "AJOUTER"
Private Sub CommandButton2_Click()
'déclaration des variables
Dim lign As Integer

'Si un champ obligatoire est vide alors envoie message
If TextBox1 = "" Or ComboBox1 = "" Or ComboBox2 = "" Or TextBox2 = "" Then
MsgBox ("les champs : N°Analyseur, Type, Technicien et Client sont obligatoires!")
Exit Sub
End If
'sélectionne la première ligne vide feuille "Donnée" et remplit les cellules 1 a 17
With Sheets("Donnée")
lign = .Range("A65536").End(xlUp).Offset(1, 0).Row
.Cells(lign, 1) = ComboBox2
.Cells(lign, 2) = TextBox1
.Cells(lign, 3) = ComboBox1
ETC…

Quand je clique sur le bouton « ajouter » je rempli ma feuille « Donnée » avec les valeurs des textbox et combobox de mon formulaire.
J’aimerais vérifier que cet automate n’existe pas avant d’enregistrer cette nouvelle fiche soit vérifier que les valeurs des textbox1 ET combobox 1 n’existe pas déjà dans la feuille ‘Donnée’ sinon je renvoi un Msgbox « cet automate existe déjà, sélectionner le bouton modifier »
Remarque : textbox1= N° d’automate et Combobox1=type d’automate.
Il est indispensable que je vérifie ses 2 conditions pour autoriser l’ajout de cette nouvelle fiche car il se peut que dans la feuille Donnée il y est plusieur fois le même n° d’automate mais avec un type d’automate différant.
Ex : N° 1010 type A et n°1010 typeB

Merci de votre aide
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Enregistrement données sous conditions

Bonjour 350dr, bonjour le forum,

Ton code modifié :
Code:
Private Sub CommandButton2_Click() 'bouton "AJOUTER"
'déclaration des variables
Dim lign As Integer
Dim r As Range 'déclare la variable r (Recherche)


'Si un champ obligatoire est vide alors envoie message
If TextBox1 = "" Or ComboBox1 = "" Or ComboBox2 = "" Or TextBox2 = "" Then
    MsgBox ("les champs : N°Analyseur, Type, Technicien et Client sont obligatoires!")
    Exit Sub
End If
With Sheets("Donnée") 'prend en compte l'onglet "Donnée"
    Set r = .Columns(2).Find(TextBox1.Value, , xlValues, xlWhole) 'définit la recherche r (recherche dans la colonne B (2), la valeur entière de la TextBox1)
    If Not r Is Nothing Then 'condition 1 : si il existe au moins une occurrence trouvée
        If r.Offset(0, 1).Value = ComboBox1.Value Then 'condition 2 : si la valeur de la cellule en colonne C correspond a la valeur de la ComboBox2
            MsgBox "cet automate existe déjà, sélectionnez le bouton modifier" 'message
            Exit Sub 'sort de la procédure
        End If 'fin de la condition 2
    End If 'fin de la condition 1
    
    'sélectionne la première ligne vide feuille "Donnée" et remplit les cellules 1 a 17
    lign = .Range("A65536").End(xlUp).Offset(1, 0).Row
    .Cells(lign, 1) = ComboBox2
    .Cells(lign, 2) = TextBox1
    .Cells(lign, 3) = ComboBox1
    'ETC…
End With
End Sub
 

Gorfael

XLDnaute Barbatruc
Re : Enregistrement données sous conditions

Salut 350dr et le forum
Quand tu cliques sur ton bouton de validation, tu n'as qu'à regarder que cet automate n’existe pas avant d’enregistrer cette nouvelle fiche, qu'à vérifier que les valeurs des textbox1 ET combobox1 n’existe pas déjà dans la feuille ‘Donnée’ sinon renvoyer une Msgbox « cet automate existe déjà, et sélectionner le bouton modifier » ;)
Code:
Dim X As Long, Flg As Boolean
'......................
With Sheets("Donnée")
    Flg = False
    For X = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
        If .Cells(X, "B") = TextBox1 And .Cells(X, "C") = ComboBox1 Then
            Flg = True
            Exit For
        End If
    Next X
    If Flg Then
        'on a trouvé une déjà existante
    Else
        'il n'en existe pas, il faut la créer
    End If
End With
Ce n'est qu'un principe. On peut aussi faire un filtre (et rechercher la ligne visible), et/ou utiliser l'instruction Find pour accélérer la recherche.
A+
Edit : Salut Robert
Pas sûr du résultat de ton code avec une base non triée
 
Dernière édition:

350dr

XLDnaute Junior
Re : Enregistrement données sous conditions

Bonjour Robert et Gorfael
Merci de m'avoir répondu.
Robert, ton code marche nickel et en + je le comprends
Gorfael, ton code me renvoi l'erreur suivante:
Objet requis
sur la ligne
For X = 2 To .Cells(Row.Count, "A").End(x1Up).Row
et j'avoue ne pas le comprendre.

Par contre j'espérais pouvoir l'adapter à mon bouton "modifier" mais je ne pense pas qu'il soit possible:

'Bouton "Modifier"
Private Sub CommandButton4_Click()

'déclaration des variables
Dim i As Integer

'Si un champ obligatoire est vide alors envoie message
If TextBox1 = "" Or ComboBox1 = "" Or ComboBox2 = "" Or TextBox2 = "" Then
MsgBox ("les champs : N°Analyseur, Type, Technicien et Client sont obligatoires!")
End If

'demande à l'utilisateur s'il est sur de lui
result = MsgBox("Etes vous sur de vouloir modifier la fiche de : " & ComboBox1 & TextBox1, vbYesNo)
If result = vbNo Then Exit Sub 'si l'utilisateur n'est pas sur, on ne fais rien


'recherche la ligne dans la feuille "Donnée" ou apparait le nom de l'automate (textbox1)
With Sheets("Donnée").Columns(2)
i = .Cells.Find(TextBox1).Row
'remplace les données existantes par les nouvelles
.Cells(i, 0) = ComboBox2
.Cells(i, 1) = TextBox1
.Cells(i, 2) = ComboBox1
.Cells(i, 3) = TextBox2
ETC…

Comme précédement je fais une recherche que sur la textbox 1 mais il faudrais la faire sur le textbox1 et la combobox1 pour être sûr de modifier la bonne fiche.
J'ai egalement un bug sur mon bouton "rechercher" mais chaque chose en son temps
Merci de votre aide.
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Enregistrement données sous conditions

Bonsoir le fil, bonsoir le forum,

350dr, je ne comprends plus ta question. Le code que je t'ai proposé fait la recherche sur la TextBox1
ET sur la ComboBox1... J'ai repris ton code initial et rajouté la condition de recherche. Je n'ai pas compris non plus la remarque de Gorfael par rapport à une base non triée. Le seul doute que j'ai sur mon code est le type de données mais comme tu n'as pas daigné mettre un petit fichier en exemple il nous sera difficile d'y voir plus clair.

Au niveau du code de Gorfael l'erreur est ici :
For X = 2 To .Cells(Row.Count, "A").End(x
1Up).Row. C'est un L minuscule l à la place du 1.
 

350dr

XLDnaute Junior
Re : Enregistrement données sous conditions

Ca y est, j'ai fait du ménage pour pouvoir réduire la taille de mon fichier.

Comme vous pouvez le voir, dans mon formulaire de saisie j'ai 5 boutons.
"Ajouter": Robert a réglé mon PB.
"Modifier": actuelement je recherche la fiche à modifier selon un seul critère (textbox1) mais j'ai besoin de vérifier selon les critères Textbox1 et combobox1 car il se peut que j'ai plusieurs entrées avec la même valeur en textbox1.
"Supprimer": là idem, j'ai besoin de rechercher la fiche selon les critères en textbox1 et Combobox1.
"Rechercher": idem, recherche selon textbox1 et combobox1 + Bug si on recherche une entrée qui n'existe pas dans la feuille de donnée.
Je ne parle pas du bouton "Fermer" qui lui fonctionne à merveille !! en même temps c'est le plus simple !!!

J'ai bien avancé grace à vous mais mes connaissances VBA sont limitées.
Merci de votre aide
 

Pièces jointes

  • Test.zip
    36.9 KB · Affichages: 24
  • Test.zip
    36.9 KB · Affichages: 20
  • Test.zip
    36.9 KB · Affichages: 18

Robert

XLDnaute Barbatruc
Repose en paix
Re : Enregistrement données sous conditions

Bonsoir le fil, bonsoir le forum,

En pièce jointe ton fichier modifié. C'est tellement plus simple avec un exemple !
J'ai enfin compris ce que voulais dire Gorfael et je lui présente mes plus plates excuses car il avait raison le bougre... D'ailleurs c'est sa méthode que j'ai utilisée pour ton fichier :

 

Pièces jointes

  • 350dr_v01.xls
    83.5 KB · Affichages: 48

350dr

XLDnaute Junior
Re : Enregistrement données sous conditions

Ola, c'est nickel !!! Un grand merci à toi Robert et a toi aussi Gorfael.

Sans vouloir abuser, pourrais-tu m’expliquer le code de Gorfael ? Copier c’est bien, comprendre c’est mieux !
2ème question, comment as-tu fait pour diminuer le scrollbars de ma feuille de donnée ? Est-ce pour cela que la taille de mon fichier a fondu ?
Encore merci
 

Gorfael

XLDnaute Barbatruc
Re : Enregistrement données sous conditions

Salut 350dr et le forum
Sans vouloir abuser, pourrais-tu m’expliquer le code de Gorfael ? Copier c’est bien, comprendre c’est mieux !
Le but est toujours de comprendre, pour pouvoir l'appliquer sur d'autres problèmes.
Ma macro commentée
Code:
Dim X As Long, Flg As Boolean
'X est en Long, car il correspond à une ligne et peut dépasser la limite d'un Integer
'......................
With Sheets("Donnée")
    Flg = False
    'Flg=Faux
    For X = 1 To .Cells(Rows.Count, "A").End(xlUp).Row
    'de X=1 à dernière ligne non vide de A. J'utilise Rows.count, plutôt que 65536,
    'parce que les nouvelles versions dépasse cette ligne.
        If .Cells(X, "B") = TextBox1 And .Cells(X, "C") = ComboBox1 Then
        'si Bx=TextBox1 et Cx=Combobox1, alors
            Flg = True
            'Flg=Vrai
            Exit For
            'On sort de la boucle
        End If
    Next X
    If Flg Then 'Si Fg =Vrai, alors => on a trouvé une correspondance (en ligne X)
        'on a trouvé une déjà existante
    Else 'si Flg=Faux
        'il n'en existe pas, il faut la créer
    End If
End With
Ça me semble tellement évident, qu'il ne faut pas hésiter si quelque chose reste obscure. Les gens ont souvent peur/honte de poser des questions triviale, alors qu'une chose incomprise génère plus de temps de travail qu'une explication claire.

Petit reproche : quand on demande une modification/dépannage d'un code, l'intégralité du code est souvent essentiel, alors qu'un fichier d'essai n'est pas obligatoirement nécessaire.
En mettant ton fichier dès le départ, on aurait pas forcément travaillé pareil.
La grandeur est aussi importante : si tu as un fichier de 60000 lignes, ma méthode est trop lente, et l'utilisation de Find beaucoup, beaucoup plus rapide. Mais, à moins que B & C soient triées, à chaque cellule de B trouvée, il faut vérifier C, et repartir sur un FindNext pour re-tester B et C. Mais comme c'est plus complexe à comprendre, je ne propose pas ce type de solution d'entrée (Et il faut penser que l'on teste après la cellule active, ce qui peut créer des problèmes si on a l'info en ligne 1).

Étant, à priori, satisfait des réponses, je n'ai pas vérifié le fichier fourni (en retard)...
Toujours penser qu'un dépanneur répond en fonction de ce qu'on lui donne comme infos, précisions.
A+
 

350dr

XLDnaute Junior
Re : Enregistrement données sous conditions

Merci Gorfael,
Grosse journée aujourd'hui, je vais étudier ta macro demain à tête reposée.
Il est vrai que j'aurais pu mettre mon exemple depuis le début mais il faisait + de 2mo et je n'ai pas percuté qu'en le zippant il n’allait faire plus que 35ko !! Mea-culpa
Je fais parti des gens qui aiment bien comprendre (et apprendre) les solutions données alors que d’autres (enfin j’imagine) se contente d’appliquer et basta !
En tout cas je n’hésiterai pas à vous solliciter si j’ai besoin d’autres conseils ou de faire évoluer mon fichier (après avoir recherché par moi-même bien sûr)
Encore merci et longue vie à ce forum.:eek:
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
312 185
Messages
2 086 020
Membres
103 097
dernier inscrit
Benduch