VBA, vérifier existence valeur

Résolu
anthony -  
 anthony - 7 juil. 2011 à 19:47
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
A voir également:

3 réponses

pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 759
 
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

0
anthony
 
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 ^^
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 779
 
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

0
anthony
 
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
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 313
 
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
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 313
 
Pijaku, Patrice

Excusez moi, je n'avais pas rafraichi
0
pijaku Messages postés 12263 Date d'inscription   Statut Modérateur Dernière intervention   2 759
 
Pas de souci Michel.
Une belle journée
0
anthony
 
bonjour,
j'ai essayé ce code, le message indiquand que la référence n'existe pas est immédiate donc il semblerait que le temps soit optimal, par contre j'ai le même message même si la référence existe ... :-(
j'ai désactivé else avec goto erreur et il ne se passe rien, donc j'imagine que c'est la vérification de l'existence de la feuille qui ne fonctionne pas
0
anthony
 
et dans la foulée j'ai une question, je veux créer un nouveau bouton qui cette fois ne fera pas de recherche sur A1 & A2 de chaque feuille mais sur chaque ligne 1 de chaque feuille (sachant que la recherche entre A1 et P1 n'est pas nécessaire car la valeur ne peut pas être dans cetet zone)
0
michel_m Messages postés 16602 Date d'inscription   Statut Contributeur Dernière intervention   3 313
 
Bonjour

C... s dues à la précipitation!
enlève cette ligne (c'était ma maquette)
'monfichier = "D:\documents\av-Evaluate-v3.xls"
et aussi
'feuille = "Moyenne"


et enlève l'apostrophe devant
'Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True
==>
Application.Workbooks.Open Filename:=monfichier, ReadOnly:=True

excuses moi
tu dis...
0