VBA, vérifier existence valeur

Résolu/Fermé
Signaler
-
 anthony -
Bonjour,

je bloque légèrement
j'ai un fichier "moteur de recherche" qui contient un userform.
on tape notre recherche à travers une textbox et une combobox
on lance la recherche, ça ouvre un fichier en lecture seule et le but est de se placer sur la bonne feuille de ce second fichier

en A1 et A2 de chaque feuille on a une valeur qui correspond à la concaténation de la textbox et de la combobox
voici le code actuel :

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
'teste si un numéro a été entré, si non, le programme averti l'utilisateur et s'arrête
If UserForm1.TextBox1.Text = "" Then
MsgBox "Aucun PN n'a été saisi !"
Exit Sub
End If

If Len(UserForm1.TextBox1.Text) <> 8 Then
MsgBox "le Part Number est incorrect !!!"
Exit Sub
End If

monfichier = "X:\QEHS\QA_DOC_FE\QA_FOURNISSEURS\0_CHEMICALS_RESISTS\2011\Risques excursion Qa\graphes.xlsm"
Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True

'chercher la feuille du fournisseur correspondant
Dim feuille As String
Dim shFo As Worksheet

feuille = TextBox1 & " " & ComboBox1
For Each shFo In Worksheets
Set a = shFo.Range("A1:A2").Find(feuille, lookat:=xlWhole)
If Not a Is Nothing Then
Worksheets(shFo.Name).Activate
UserForm1.Hide
Exit For
Next
End If
Application.ScreenUpdating = True
End Sub

ça fonctionne, par contre ça nécessite quelques secondes, y a-t-il moyen d'accélérer le code ?
et mon soucis c'est que si la feuille avec les valeurs en A1 et A2 n'existe pas alors le programme me place sur la feuille active par défaut !!! j'aimerais que si la feuille n'est pas présente alors un message informe l'utilisateur sinon il va penser qu'il est sur la bonne feuille...

merci à vous

3 réponses

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Bonjour,
Pour accélerer le processus, je ne sais pas, mais je ne pense pas que l'on puisse faire plus rapide...

!!!!! A la place du End If par rapport au Next !!!

Par contre, pour le message à l'utilisateur, c'est beaucoup plus facile.
Tu dis dans ton code :
Si tu trouves la bonne feuille alors
tu la sélectionnes
et tu sors de la boucle et pis c'est tout

Il te suffit donc de placer un message après la boucle et de remplacer ton Exit For par un Exit Sub. Comme ça s'il ne sort pas de la procédure c'est qu'il n'a pas trouvé tes valeurs...
If Not a Is Nothing Then 
    Worksheets(shFo.Name).Activate 
    UserForm1.Hide
    Application.ScreenUpdating = True
    'Exit For
    Exit Sub 
End If
Next
MsgBox "Références non trouvées dans les feuilles du classeur"
Application.ScreenUpdating = True 
End Sub

parfait
c'est toujours le pb quand on ne maîtrise pas réellement, du coup les subtilités de sortie ou de fin ne sont pas exploitées
merci ça m'enlève des complications futures ^^
Messages postés
8539
Date d'inscription
dimanche 13 juin 2010
Statut
Membre
Dernière intervention
20 juillet 2021
1 715
bonjour,

Au lieu de :

For Each shFo In Worksheets
Set a = shFo.Range("A1:A2").Find(feuille, lookat:=xlWhole)
If Not a Is Nothing Then
Worksheets(shFo.Name).Activate
UserForm1.Hide
Exit For
Next
End If

Essayer :
For Each shFo In Worksheets
  If shFo.Range("A1").Formula = feuille Or shFo.Range("A2").Formula = feuille Then
    shFo.Activate
    UserForm1.Hide
    Exit For
  Else
   ActiveWorkbook.Saved = True
   ActiveWorkbook.Close
   MsgBox "Non trouvé"
  End If
Next

bonjour,
j'ai pris la première réponse tombée et ça fonctionne.
par contre je vais utilisée ta proposition pour faire une autre procédure car le OR va être utile.
merci
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
Bonjour

peut-^tre plus rapide mais pas sûr ( à essayer)

Sub peutetreplusvite()
Dim shFo As Worksheet, monfichier as string
Dim D_onglet As Object

monfichier = "X:\QEHS\QA_DOC_FE\QA_FOURNISSEURS\0_CHEMICALS_RESISTS\2011\Risques excursion Qa\graphes.xlsm"
'monfichier = "D:\documents\av-Evaluate-v3.xls"
'Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True
feuille = TextBox1 & " " & ComboBox1
'feuille = "Moyenne"

Set D_onglet = CreateObject("scripting.dictionary")
For Each shFo In Worksheets
     onglet = shFo.Name
     D_onglet.Add shFo.Name, shFo.Name
Next

If D_onglet.exists(feuille) Then
     Sheets(feuille).Activate
     '..... suite ton code
 Else
     GoTo erreur
  End If

Exit Sub

erreur:
MsgBox feuille & "n'existe pas dans ce classeur", vbCritical
   ActiveWorkbook.Saved = True
   ActiveWorkbook.Close
End Sub
Messages postés
16537
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
25 novembre 2021
3 249
Désolé, ca marche chez moi avec le classeur av-évaluate d'environ 100 feuilles...

mais... cest sur ma proposition que tu coinces? je ne retrouve pas mes petits notamment le dictionary...
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 666
Salut tous,
Ca coince ou ça coince pas... On ne sait plus du tout ou on en est.
Anthony, merci d'être clair!
ok désolé pour la confusion apportée
donc en reprenant ton code michel_m

Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
'teste si un numéro a été entré, si non, le programme averti l'utilisateur et s'arrête
If UserForm1.TextBox1.Text = "" Then
MsgBox "Aucun PN n'a été saisi !"
Exit Sub
End If

If Len(UserForm1.TextBox1.Text) <> 8 Then
MsgBox "le Part Number est incorrect !!!"
Exit Sub
End If


Dim shFo As Worksheet, monfichier As String
Dim D_onglet As Object

monfichier = "C:\Users\thony\Desktop\graphes.xlsm"
Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True
feuille = TextBox1 & " " & ComboBox1

Set D_onglet = CreateObject("scripting.dictionary")
For Each shFo In Worksheets
onglet = shFo.Name
D_onglet.Add shFo.Name, shFo.Name
Next

If D_onglet.exists(feuille) Then
Sheets(feuille).Activate
UserForm1.Hide
Application.ScreenUpdating = True

Else
GoTo erreur
End If

Exit Sub

erreur:
MsgBox feuille & "n'existe pas dans ce classeur", vbCritical
'ActiveWorkbook.Saved = True
'ActiveWorkbook.Close

Application.ScreenUpdating = True
End Sub

j'ai systématiquement le message de fin indiquant que la feuille n'existe pas, qu'elle existe réellement ou pas
ah j'ai trouvé pourquoi ça ne fonctionne pas
en fait ta recherche se fait sur le nom des feuilles, moi ça ne peut pas fonctionner à tous les coups car une même feuille peut se nommer comme la cellule A1 mais peut s'appeler comme la cellule A2
donc si par exemple ta feuille s'appelle comme la valeur en A1 et que tu cherches la valeur de A2, la feuille ne ressortira pas alors qu'elle existe
j'ai fait le test sur une feuille qui n'a qu'une valeur (A1) mais ça m'affiche quand même le message d'inexistance