VBA - Excel : Recherchev se bloque mon programme en cas de non correspondance trouvé
Dans mon programme, l'utilisateur saisit un Code Postal et obtient en sortie des informations relatives au Code Postal de la (province, ville, district). Pour ce faire, j'utilise la fonction Recherchev.
Ainsi, l'utilisateur :
- Types un code Postal dans la feuille principale
- Le programme de recherche dans une base de données (dans une autre feuille) dans lequel le Code Postal sont associés à la Ville, la Province, de District.
- Quand il y a un match, il envoie le résultat à la page principale, de sorte que l'utilisateur peut obtenir une ville, province, district, juste en tapant le Code Postal. Assez simple processus.
J'utilise ce code pour le faire :
If Range("J9").Value <> "N/A" Then 'if there is actually a zip code entered by the user (if not, it will be "N/A")
cityZip = Application.WorksheetFunction.VLookup(sMain.Range("J9").Value,
sZipCodes.Range("B2:E864"), 3, False)
barangayZip = Application.WorksheetFunction.VLookup(sMain.Range("J9").Value,
sZipCodes.Range("B2:E864"), 2, False)
provinceZip = Application.WorksheetFunction.VLookup(sMain.Range("J9").Value,
sZipCodes.Range("B2:E864"), 4, False)
sMain.Range("J7").Value = provinceZip
sMain.Range("J13").Value = cityZip
sMain.Range("J16").Value = barangayZip
Else
End If
Il fonctionne parfaitement quand il y a un Code Postal qui est dans ma base de données. Mais si pas, il bloque l'exécution du programme et j'ai un message d'erreur ("erreur d'exécution '1004', impossible de lire la Recherchev ...).
Comment modifier mon code pour juste dire que si il n'y a pas de match, alors qu'il devrait tout simplement ne rien faire? Je ne sais pas comment introduire cette demande en fonction Recherchev.
Merci d'avance !
EDIT : voici mon nouveau code, après Tim Williams suggestion :
'Using Zip Code
If Range("J9").Value <> "N/A" Then
provinceZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 4, False)
If IsError(provinceZip) = False Then
cityZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 3, False)
barangayZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 2, False)
sMain.Range("J7").Value = provinceZip
sMain.Range("J13").Value = cityZip
sMain.Range("J16").Value = barangayZip
Else
'do nothing
End If
End If
Mon erreur sur cette ligne :
provinceZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907"), 4, False)
=> Erreur 1004, nombre d'arguments incorrect
.WorkSheetFunction
et il suffit d'utiliser Application.Lookup
. Ensuite, vous pouvez tester la valeur de retour à l'aide de IsError()
sur la première rechercheest droit. Cependant, pourquoi ne pas simplement mettre le
VLOOKUP
formules dans les cellules J7, J13 et J16 directement? Vous pouvez également en faire J9 une validation des données de liste déroulante dont la source de gamme est à votre liste de codes postaux. De cette façon, les utilisateurs ne pouvais en choisir qu'valide codes postaux et vous pourriez éviter (peut-être) inutile de codage.merci!!!! J'ai trouvé plus de détails ici (cpearson.com/excel/callingworksheetfunctionsinvba.aspx ) et j'ai essayé de suivre leur exemple, mais j'ai encore un problème, différent cette fois-ci (mais toujours erreur 1004), lorsque j'essaie d'exécuter mon programme... je vais modifier mon code avec plus de détails.
merci pour les suggestions, mais l'utilisateur n'est en fait pas le type de l'zip code, j'ai juste évité de donner des détails inutiles. Pour résumer, le code postal est automatiquement trouvé dans une adresse, envoyé à "J9", mais peut parfois être confondu avec autre chose (un numéro de rue, un numéro d'unité, etc.) donc il doit y avoir une erreur de manipulation de la partie!
Votre erreur est parce que vous avez mis de
VLOOKUP
à LOOKUP
dans votre code.
OriginalL'auteur Phalanx | 2013-06-14
Vous devez vous connecter pour publier un commentaire.
Vous devriez lire sur VBA erreur de manipulation. Une source comme http://www.cpearson.com/excel/errorhandling.htm pourrait aider. Cela dit, essayez le code suivant.
Vous voulez quelque chose comme:
Dans votre code, vous pouvez l'appeler comme:
Le dernier paramètre est la valeur par défaut de retour si la recherchev a échoué. Donc, dans cet exemple, il retourne une chaîne vide.
OriginalL'auteur AndASM
J'ai l'habitude de enveloppez la recherchev() avec un iferror() qui contient la valeur par défaut.
La syntaxe se présente comme suit:
Vous pouvez aussi faire quelque chose comme ceci:
OriginalL'auteur Ashwin Balamohan
Vous avez changé d'Recherchev pour la Recherche, qui a moins d'arguments. À l'aide de seulement 2 arguments, vous devriez être bien:
provinceZip = Application.Lookup(sMain.Range("J9").Value, sZipCodes.Range("B2:E907") )
OriginalL'auteur Dimas
SafeVlookup est une bonne fonction.
Je suis encore à apprendre VB.
J'ai changé comme ça et ça marche pour moi.
Espère que je peux l'utiliser comme ça.
VLOOKUP
formule. Vous êtes à l'aide d'unerror_value
dans la dernière RECHERCHEV argument pour déterminer si recherchev est à la recherche d'une correspondance exacte ou non. Pourquoi ne pas utiliser la solution de @andASM?OriginalL'auteur pmyk