bonjour à tous, je suis nouveau sur ce forum ,et je cherche désespérement une solution à mon probleme...

Déjà pour poser les bases, je suis debutant dans le vba depuis plusieurs mois...

Rapidement pour ne pas vous embêter...Je suis médecins et je me suis créée un fichier (appli) qui via un UserForm, me permet de consigner Coordonnée du patient / Examen clinique / comptabilité sur une feuille Excel.
Dansce userform, la saisie du nom ne se fait pas sur une textbox mais sur un combobox , ce qui me permet (dans la version que j'utilise actuellement) de récupérer les données déjà enregistrer si je revois un patient (prénom, date de naissance, numero de tel, antécédents, traitement habituel). MAIS.... la limite de cette combobox c'est que si j'ai un homonyme, ou plusieurs membres de la meme famille, qd je tape les première lettre, il choisit le premier membre de la famille que j'ai dejà enregistré, pas moyen de trouver un autre membre... bref la solution ComboBox n'est pas terrible...

D'où ma participation sur ce post...
Depuis quelques jours, je suis tenté par une solution plus élégante à mon sens, passer par un Userform intermediaire, avec une textbox pour rechercher un patient, et une listbox qui liste tous les homonymes et toutes les consultations pour un seul et meme patient... dès lors, un double clic sur la ligne du patient selectionné me permet d'ouvrir le UserForm de saisie avec les 6 éléments indispensables (Nom + Prenom + Date Naissance + Numero de tel + Atcd + traitement) déjà inscrit dans les textbox...je n'ai plus qu'à remplir le reste.
J'ai fais une version test pour laquelle j'ai enlevé mes COmboBox, en les remplaçant par des textBox

Ca , ça marche à peu près.

Mais pour une modification d'information saisie ça se complique ...
en deux point..
Tout d'abord : (et c'est mon plus grand probleme de ce jour, je m'arrache les cheveux...
si je veux importer cette fois ci TOUTES les informations d'une précédente consultation via la listbox dans le userform de saisie,
j'ai modifié le code que j'avais récupéré sur ce post, pour l'adapter au nombre de colonne et textbox nécessaire... ça marche presque , mais ça bug pour 2 colone de mon tableau de ligne. J'ai beau tester dans tous les sens,
mais en ayant adapté le code... TL(2, I) = R.Offset(0, 1).Value pour recupérer toute les valeurs... pour R.Offset(0,16) et (0,17) ça bug, alors qu'il laisse passer (0,18) et (0,19) ...
etledéboggueur m'affiche cette ligne comme problématique.

Me.ListBox1.List = Application.Transpose(TL) 'alimente la listbox "ListBox1" avec le tableau TL transposé

Je ne comprend pas....ça fait 4 h que je suis dessus à tout retourner dans tous les sens.... ((le fichier dont je m'etais inspiré au depart c'etait chris_v01 je pense qu'il avait été fait par Thautheme)
qd je bloque mes deux ligne (0,16) et (0,17) ça passe.
Je vois pas d'où ça vient... la seule idée que j'ai c'est que dans ma feuille de calcul j'ai juste une colonne qui n'est pas issue du userform, la colonne "Age" (colonne O, intercalée entre date de naissance et motif de consultation, qui n'est qu'une formule de calcule de l'age en fonction de la date de consultation...). Peut etre que ça decalle dans le Tableau de ligne mais je vois pas...
La deuxieme idée, c'est qu'il y a un postulat que j'ignore, du genre "pour tel macro utilisant une listbox et un TL, la valeur 16 et 17 est inutilisable,à cause la pointure des chaussure du prince charmant en conjonction avec l'alignement des planete... " = cause qui me dépasserait completement et connu des seuls "cracs" de l'informatique...

bref si vous avez une idée, ça me sauverait...

L'autre point:
du coup, le bouton "modifier" sur mon userform de Saisie, qui me permet de modifier des données précédemment enregistré en "écrasant" les données de la lignes (si je veux rajouter des resultats d'examen complémentaire par exemple... ou bien modifier le mode de paiement si j'ai rempli chèque au lieu de carte bancaire par exemple...) ne fonctionne plus, car il travaille avec la Combobox...
J'ai cru comprendre qu'il valait mieux passer par un UserForm specifique de modification, (semblable au userform de saisie initial) avec un bouton specifique "modifier", mais j'y suis pas encore....
Comment faire pour :
-trouver la consultation à modifier dans le userform "recherche"
-exporter TOUTE les données dans un Userform de modification
-cliquer sur un bouton "modifier"
-que les données modifiées/ajoutées ECRASE dans la bonne ligne les données d'avant...?

je vous laisse mon fichier de test actuel...
et le code qui me pose probleme
merci beaucoup pour votre aide.

appli_sos_win_betatest2.xlsm
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
Private O As Worksheet
Private DL As Integer
 
 
Private Sub UserForm_Initialize()
Set O = Sheets("Patients")
DL = O.Cells(Application.Rows.Count, 1).End(xlUp).Row
With Me.ListBox1
    .ColumnWidths = "30;30;30;30;30;30;30;30;30;30;30;30;30;30;30;30;30;30;30"
    .ColumnCount = 19
 
End With
End Sub
 
Private Sub TextBox1_Change()
 
 
Dim R As Range 'déclare la variable R (Recherche)
Dim TL() As Variant 'declare le tableau de lignes TL
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Byte 'déclare la variable J (incrément)
Dim PA As String 'déclare la variable PA (Première Adresse)
 
Me.ListBox1.Clear 'efface le contenu de la listbox "ListBox1"
If Me.TextBox1.Value = "" Then Exit Sub
Set R = O.Range("C2:C" & DL).Find(Me.TextBox1.Value, LookIn:=xlValues) 'définit la recherche R
If Not R Is Nothing Then 'condition : si il existe au moins sune occurrence trouvée
    PA = R.Address 'définit l'adresse de la première occurrence trouvée
    I = 1 'initialise la variable I
    Do 'éxécute
        ReDim Preserve TL(19, 1 To I) 'redimensionne le tableau de lignes TL (11 lignes de 0 à 10, K colonnes)
        TL(1, I) = R.Value 'Nom
        TL(2, I) = R.Offset(0, 1).Value 'prenom
        TL(3, I) = R.Offset(0, 2).Value ' N° tel
        TL(4, I) = R.Offset(0, 3).Value 'cotation
        TL(5, I) = R.Offset(0, 4).Value 'mode de paiement
        TL(6, I) = R.Offset(0, 5).Value 'mode de paiement
        TL(7, I) = R.Offset(0, 6).Value 'mode de paiement
        TL(8, I) = R.Offset(0, 7).Value 'mode de paiement
        TL(9, I) = R.Offset(0, 8).Value 'mode de paiement
        TL(10, I) = R.Offset(0, 9).Value 'mode de paiement
        TL(11, I) = R.Offset(0, 10).Value 'nom sur le cheque
        TL(12, I) = R.Offset(0, 11).Value 'date de naissance
        TL(13, I) = R.Offset(0, 12).Value 'age (ne correspond à aucune textbox!)
        TL(14, I) = R.Offset(0, 13).Value 'motif
        TL(15, I) = R.Offset(0, 14).Value 'ATCD
        TL(16, I) = R.Offset(0, 15).Value 'RAS
        TL(17, I) = R.Offset(0, 15).Value 'en attente de pouvoir caser "HdM"
        TL(18, I) = R.Offset(0, 15).Value 'en attente de pouvoir caser "clinique"
        TL(19, I) = R.Offset(0, 18).Value 'remarque
        I = I + 1 'incrémente I (ajoute une colonne au tableau de lignes TL)
        Set R = O.Range("C2:C" & DL).FindNext(R)  'redéfinit la recherche R (occurrence suivante)
    Loop While Not R Is Nothing And R.Address <> PA 'boucle tant qu'il existe de nouvelles occurrences ailleurs qu'en PA
End If 'fin de la condition
If I > 1 Then 'condition : si I est supérieur à 1 (au moins une occurrence a été trouvée)
    'si I=2 (une seule occurrence trouvée), redimensionne le tableau TL pour permettre la tranposition (sinon plantage)
    If I = 2 Then ReDim Preserve TL(UBound(TL), 1 To 2)
    Me.ListBox1.List = Application.Transpose(TL) 'alimente la listbox "ListBox1" avec le tableau TL transposé
End If
 
End Sub