Dépannage VBA Excel
Bonjour à tous,
je tâche de me construire un petit applicatif perso sur la gestion des dépenses de santé.
J'ai un peu avancé mais je bute sur 2 problèmes depuis quelques jours et j'avoue mon incapacité à comprendre même en ayant lu, modifié, cherché....
quand je veux faire une recherche de praticien par son nom via .find et .find.next j'obtiens une erreur 91 variable objet ou variable bloc with non défini et je n'arrive pas à résoudre le problème.(plantage ligne Loop While Not recherche Is Nothing And recherche.Address <> adr);
Ce qui fait mon incompréhension c'est que j'ai dupliqué ce module dans la base médecins et que là elle fonctionne.
Second probleme lorsque je fais une saisie qui va rechercher les données dans la base livre je ne sais pas pourquoi mais l'adresse de la recherche se positionne sur le premier enregistrement ( faire un essai avec CT- par exemple).
Je crois qu'à force d'être dessus je ne sais plus voir voir les erreurs. En plus ma connaissance de vba reste assez élémentaire.
Aussi, je m'en remets aux âmes patientes et charitables qui pourraient m'aider à résoudre ces 2 points.
Par avance merci
fichier joint
Bonsoir,
Peux-tu indiquer la ligne sur laquelle survient l'erreur ? Dans quelle procédure ? Et où on la trouve ?
Bonsoir et merci de t'interesser au problème.
L'erreur vient dans la procédure appellée par le bouton rechercher de l'USF1(commandbutton3) .
chercher le nom dans le champ bénéficiaire et faire rechercher à partir de l'USF1. Il trouve l'enregistrement 1 et lorsqu'il demande de continuer la recherche il plante avec une erreur 91.
Erreur commandbutton3 click = Loop While Not recherche Is Nothing And recherche.Address <> adr
j'espère que cela répond à ta question
cordialement
Re,
Cela plante parce que la recherche est infructueuse et donc recherche.Address ne peut être calculé.
Il y a pas mal de choses à revoir dans ta procédure, mais si l'erreur est expliquée, la recherche ne devrait pas être infructueuse et elle ne devrait pas se produire.
Je cherche d'abord la raison de cette anomalie, on verra la suite après.
@+
C'est apparemment ta TextBox5_Change qui provoque le problème... Je ne me suis pas attardé à scruter tous les détails, mais cette proc. opère également une recherche avec Find, et évidemment elle se déclenche lors de la mise à jour des contrôles au cours de ta recherche.
En l'état, il faut que tu substitue AfterUpdate à Change. AfterUpdate ne semble pas intervenir s'il n'y a pas validation de l'utilisateur.
A mon sens il faudrait revoir la conception d'ensemble pour alléger le tout.
Dans l'immédiat, j'ai fait quelques redressements sur ta procédure :
3 variable non typées sur 5, 1 non utilisée (donc à éliminer), instruction With non utilisée (il faut apprendre à quoi ça sert... !), variable adr qui modifiée à chaque tour ne pouvait plus servir comme condition d'arrêt, quelques élément s syntaxe un peu aléatoire ou inutiles, sans parler de l'énumération fastidieuse de la mise à jour des contrôles (parce qu'on n'a pas pris la peine de faire en sorte de pouvoir les traiter en boucle !).
A cet égard j'ai allégé le code mais je n'ai aucune envie de tout reprendre...
Private Sub CommandButton3_Click()
Dim nom As String, adr As String, plage As Range, recherche As Range
With Sheets("Livre")
Set plage = .Range("C1:C" & .Range("C" & .Rows.Count).End(xlUp).Row)
End With
nom = ComboBox4.Value
If nom = "" Then Exit Sub
Set recherche = plage.Find(nom, , xlValues, xlWhole)
If Not recherche Is Nothing Then
adr = recherche.Address
Do
With recherche
DTPicker1.Value = .Offset(0, -2).Value
TextBox8.Value = .Offset(0, -1).Value
ComboBox4.Value = .Value
ComboBox1.Value = .Offset(0, 1).Value
TextBox5.Value = .Offset(0, 2).Value
ComboBox3.Value = .Offset(0, 3).Value
TextBox6.Value = .Offset(0, 4).Value
TextBox7.Value = .Offset(0, 5).Value
TextBox2.Value = .Offset(0, 6).Value
TextBox9.Value = .Offset(0, 7).Value
ComboBox2.Value = .Offset(0, 12).Value
TextBox10.Value = .Offset(0, 8).Value
TextBox11.Value = .Offset(0, 9).Value
TextBox12.Value = .Offset(0, 10).Value
TextBox13.Value = .Offset(0, 11).Value
TextBox14.Value = .Offset(0, 13).Value
End With
Set recherche = plage.FindNext(recherche)
If MsgBox("Continuer la recherche ?", vbYesNo) = vbNo Then
Set recherche = Nothing
End If
Loop While Not recherche Is Nothing And recherche.Address <> adr
Else
MsgBox ("Valeur Non Trouvée")
End If
End Sub
J'ajouterai que la méthode ne me paraît pas la plus judicieuse, car cette recherche en boucle, commençant toujours par le début de la liste, finira par devenir fastidieuse au fil de l'allongement de ladite liste...
Tu verras à l'usage.
Cordialement.
Merci pour ces précisions
Je vais examiner tes conseils et je vais tâcher de corriger en rapport avec mes (légères) compétences.
En fait la structure est un peu usine à gaz car elle se construit au fur à mesure de mes idées et ne constitue donc pas une structure d'ensemble bien pensée. Je vais voir comment améliorer l'existant.
Encore merci.
bonjour
salut MFerrand
c'est typiquement un dév de bases de données liées
les tables sont apparemment très bien construites (en colonnes simples)
ça se travaille avec des RECHERCHEV qui vont chercher des données dans une table pour les afficher dans une autre
et on fait des TCD pour faire des états ou des bilans
un exemple ici : https://forum.excel-pratique.com/viewtopic.php?f=3&t=114388
pas besoin de VBA
note : une recherche se fait par ctrl+F
je n'ose conseiller le menu Données Formulaire, si tristement gris mais efficace, fiable et qui fonctionne dans 1 seconde et pour longtemps.
bon travail à tous
amitiés excelliennes
courage aux VBAistes de tous niveaux
Salut jmd !
Tu n'as toujours pas intégré le fait que lorsqu'on opère en VBA dans Excel, VBA peut ne jouer qu'un rôle relais, lancer les commandes de la même façon que le ferait l'utilisateur manuellement, ce dernier ne fait que déléguer cette tâche à VBA, et le boulot est toujours accompli par Excel !
Il peut aussi faire un peu plus lorsque ses outils propres peuvent apporter leur efficacité (tableaux par exemple) ou lorsqu'il permet d'utiliser d'utiliser des outils tiers (comme le Dictionnaire) : il fait alors un travail préparatoire sans aucunement se substituer à Excel qui reprendra la main sur les données apprêtées...
execladdict : Je ne raffole pas d'utiliser Find, qui réserve assez fréquemment des surprises... Au cas particulier de ta recherche en boucle, il faudrait déjà d'une part que la liste de médecin soit épurée avant d'être passée à la Combo (que chaque nom de médecin n'y figure qu'une seule fois), et d'autre part que la recherche commence par la fin de la liste pour aller vers le début, car tu rechercheras en priorité les enregistrements les plus récents.
Il y aurait donc un travail pour préparer la liste (à voir aussi si le prénom ne serait pas utile pour dissocier les homonymes ?) et opérer la recherche par une simple boucle remontante.
Je n'ai pas regardé suffisamment pour voir les interactions de tes divers opérations, mais il convient d'y réfléchir à partir d'une vue d'ensemble car, à rajouter des morceaux au fur et à mesure, on finit par construire un monstre difficile à maîtriser.
Cordialement.
Bon... merci Mferrand pour votre aide.
Après étude de vos remarques et analyse de mon code …. je crois que je vais repartir de zéro avec quelque chose de mieux construit.
Je vais me pencher à nouveau sur les cours d' excel-pratique et tâcher d'élaborer un code conventionnel.
Merci en tous cas.
Je qualifie donc le problème comme résolu car du coup j'abandonne le projet actuel et ses soucis.
Cordialement,