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

18santecheck-2-bug.xlsm (373.67 Ko)

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,

Rechercher des sujets similaires à "depannage vba"