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
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
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
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.
350dr, je ne comprends plus ta question. Le code que je t'ai proposé fait la recherche sur la TextBox1ETsur 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(x1Up).Row. C'est un L minuscule là la place du 1.
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
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 :
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
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+
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.