BBdebutant
Messages postés10Date d'inscriptionmercredi 8 juin 2016StatutMembreDernière intervention20 juin 2016
-
8 juin 2016 à 07:02
BBdebutant
Messages postés10Date d'inscriptionmercredi 8 juin 2016StatutMembreDernière intervention20 juin 2016
-
8 juin 2016 à 18:17
Bonjour à tous, je suis un déboutant en VBA, mais j'aimerais
1. effectuer une macro (style CTRL+F) qui recherche dans une colonne(A:Aune valeur xxxx et sectionne la cellule trouvée
2. si aucune valeur n'est trouvée, que la boîte (de recherche) se ferme sans aucune action afin que ma macro puisse continuer de s'exécuter.
Ex. de mon code:
Sheets("Clients").Select
Range("A2").Select
Application.Dialogs(xlDialogFormulaFind).Show 2, , 2
If MsgBox("Opération irréversible. Souhaitez-vous continuez ?", vbQuestion + vbYesNo, "QUESTION ...") = vbYes Then
' TON CODE SI LA REPONSE EST "OUI"
Else
Exit Sub ' TON CODE SI LA REPONSE EST "NON"
End If
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 8 juin 2016 à 07:12
Bonjour,
Qu'entends-tu très exactement par :
effectuer une macro (style CTRL+F)
CTRL+F n'est pas une "macro", mais une combinaison de touches pour ouvrir une boîte de dialogue.
Si tu veux gérer toi-même (donc autrement qu'au travers de cette boîte de dialogue), il te faut utiliser la méthode Find, que tu trouveras exposée et assortie d'un exemple très clair à la rubrique Range.Find, méthode de ton aide VBA.
BBdebutant
Messages postés10Date d'inscriptionmercredi 8 juin 2016StatutMembreDernière intervention20 juin 2016 8 juin 2016 à 07:40
Bonjour ucfoutu
par CTRL+F j'entends exécuter la commande: Application.Dialogs(xlDialogFormulaFind).Show 2, , 2
qui me permet d'entrer dans la boîte de dialogue la valeur que je désire trouver
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 8 juin 2016 à 07:51
Il s'agit là d'une boîte de dialogue Excel.
Sa vocation est claire : faciliter à l'utilisateur l'exécution de tâches prédéfinies et limitées à la recherche et au remplacement.
Ce type de boîte de dialogue ne permet rien d'autre et en tout état de cause pas d'inclure dans le cours de son exécution des instructions de traitement autres que celles gérées intrinsèquement par cette boîte.
J'insiste donc : pour faire ce que tu sembles vouloir faire, il te faudra utiliser la méthode Range.Find dont je t'ai parlé dans mon message précédent.
A toi d'y inclure, si nécessaire, la détermination de ses paramètres via des inputboxes.
A toi également d'y inclure, via une msgbox, la décision de sortir (un exit Do) éventuellement de la boucle parfaitement exposée dans l'exemple dont est assortie la rubrique Range.Find, entre Do et Loop !
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 8 juin 2016 à 08:00
Si maintenant ta question, après cette lecture, est :
Comment arrêter une boule de type Do ... Loop par msgbox, la réponse est : comme dans ce petit exemple :
Private Sub CommandButton1_Click() Static titi As Integer Do titi = titi + 1 If MsgBox("titi = " & titi & vbCrLf & "voulez-vous continuer ?", vbYesNo) = vbNo Then titi = 0 Exit Do End If Loop While titi < 1000 End Sub
Quelles que soient les instructions entre "Do" et "Loop" !
Vous n’avez pas trouvé la réponse que vous recherchez ?
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 Modifié par ucfoutu le 8/06/2016 à 11:39
Et intéresse-toi dans la foulée à ce que te permet de savoir WorksheetFunction.countif (même pas la peine de lancer une recherche et des instructions si elle retourne 0)
EDIT : j'aimerais maintenant vraiment que tu nous montres ce que tu as au moins tenté d'écrire après toutes ces indications. Ce serait bien et montrerait que tu "en veux" vraiment.
________________________
Nul ne saurait valablement coder ce qu'il ne saurait exposer clairement.
BBdebutant
Messages postés10Date d'inscriptionmercredi 8 juin 2016StatutMembreDernière intervention20 juin 2016 8 juin 2016 à 13:44
Merci de ton aide pour commencer, et oui c'est en cherchant, essayant que l'on apprend. Grace à toi, j'ai pu trouver une solution qui fonctionne: voilà ce que j'ai écrit et insérer dans ma macro
Sheets("Resto").Select
Range("A2").Select
Cells(Rows.Count, 1).End(xlUp)(2).Select
nomCherche = InputBox("Nom cherché? ")
Set result = Range("A2:A1500").Find(What:=nomCherche, LookIn:=xlValues)
If result Is Nothing Then
MsgBox "Non trouvé"
Range("A1500").Select
Else
Range(result, result).Select
End If
If MsgBox("Opération irréversible. Souhaitez-vous continuez ?", vbQuestion + vbYesNo, "QUESTION ...") = vbYes Then
Else
Exit Sub
End If
Rows(ActiveCell.Row & ":" & ActiveCell.Row).Select
Selection.Copy
Sheets("Calcul1").Select
Range("A1").Select
cs_MPi
Messages postés3877Date d'inscriptionmardi 19 mars 2002StatutMembreDernière intervention17 août 201822 8 juin 2016 à 14:53
Bonjour, n'oublie pas le LookAt de la fonction Find
Set result = Range("A2:A1500").Find(What:=nomCherche, LookIn:=xlValues, LookAt:=xlPart)
Tu mets xlPart si tu veux que le texte recherché soit contenu en partie dans la cellule ou xlWhole si tu veux la cellule contienne exactement le texte recherché.
Find est l'équivalent de la boîte de dialogues dont tu parlais et mémorise les choix de recherche d'une fois à l'autre.
Si tu fais une recherche manuelle (Ctrl-F) et que tu coches certaines options, quand tu vas utiliser Find, celle-ci va les reconnaître par défaut.
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 8 juin 2016 à 15:28
Bonjour, Cs_MPI,
Oui, mais le demandeur veut en plus faire une injection ailleurs, à chaque occurrence trouvée. La boîte de dialogue ne le permettant pas, il va lui falloir passer par la méthode Find et intervenir à chaque occurrence.
BBdebutant
Messages postés10Date d'inscriptionmercredi 8 juin 2016StatutMembreDernière intervention20 juin 2016 8 juin 2016 à 17:31
Re bonjour et encore merci. Voici la macro complète qui fonctionne. On peut certainement même surement l'améliorer, mais je ne suis qu'un débutant.
Sub Facture_totale()
'
' Facture_chambre_boisson Macro
'
Sheets("Clients").Select
Range("A2").Select
Application.Dialogs(xlDialogFormulaFind).Show 2, , 2
If MsgBox("Opération irréversible. Souhaitez-vous continuez ?", vbQuestion + vbYesNo, "QUESTION ...") = vbYes Then
Else
Exit Sub
End If
Rows(ActiveCell.Row & ":" & ActiveCell.Row).Select
Selection.Copy
Sheets("Calcul").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Clients").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Sheets("Resto").Select
Range("A2").Select
Cells(Rows.Count, 1).End(xlUp)(2).Select
nomCherche = InputBox("Nom cherché? ")
Set result = Range("A2:A1500").Find(What:=nomCherche, LookIn:=xlValues)
If result Is Nothing Then
MsgBox "Non trouvé"
Range("A1500").Select
Else
Range(result, result).Select
End If
If MsgBox("Opération irréversible. Souhaitez-vous continuez ?", vbQuestion + vbYesNo, "QUESTION ...") = vbYes Then
Else
Exit Sub
End If
Rows(ActiveCell.Row & ":" & ActiveCell.Row).Select
Selection.Copy
Sheets("Calcul1").Select
Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("Resto").Select
Application.CutCopyMode = False
Selection.Delete Shift:=xlUp
Sheets("resto").Select
Range("A2").Select
ucfoutu
Messages postés18038Date d'inscriptionlundi 7 décembre 2009StatutModérateurDernière intervention11 avril 2018212 Modifié par ucfoutu le 8/06/2016 à 17:50
Que te répondre, sinon qu tu ferais mieux de tout revoir.
- aucune raison d'utiliser à la fois la boîte de dialogue et la méthode Find (la seconde suffit et est nécessaire)
- cesse de travailler à coups de select, etc ... et commence à travailler directement sur les objets de Excel.
Exemple (un bout de ton code ... ce n'est qu'un bout car on retrouve cela un peu partout dans ton code) :