Microsoft 365 excel vba

PHV62

XLDnaute Junior
bonjour peut on utiliser un bouton dans un formulaire pour remplir les textbox de ce formulaire

je m explique dans le formulaire il y a 7 textbox je les remplis j appuie sur ajouter ca s ajoute dans la feuil1
avec le combobox je choisis ce nom que j ai remplie précédemment
tous les renseignement s affiche correctement a cote d un textbox il y a un bouton je voudrais que quand j appuie sur ce bouton il remplie les textbox qui correspondent a cette ligne
merci de votre aide
phv
 

Pièces jointes

  • Classeur1 test.xlsm
    24.3 KB · Affichages: 37

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

VBA est très très permissif au niveau des types (avec le type Variant, avec les conversions automatiques de types, etc...). Certains langages fortement typés imposent de réfléchir bien plus à la conception du code pour savoir exactement ce qu'on manipule.

Exemple de chose qui passe en VBA et qui ne passerait pas en langage vraiment typé :
Sub test()
Dim n As Integer, r As Single
r = 5.3
n = r
End Sub

A la fin n vaut 5, alors qu'on pourrait croire en lisant le code qu'il vaut r (5.3). VBA fait une conversion automatique (on ne sait pas trop comment : il tronque ou il arrondit ??). Un langage typé détecte une erreur à la compilation et oblige le codeur à réfléchir à ce qu'il fait et à écrire quelque chose du genre n = Cint(r) ou bien à corriger la déclaration ==> n as Single.
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
C'est ce qui me chiffonne, je n'arrive pas à anticiper le Lbound d'un tableau 1D (0 ou 1).

C'est toi qui est maître du Lbound mais pas entièrement et pas dans tous les cas.

Si tu déclares un array, le Lbound est zéro.
VB:
Dim t(2)
va désigner un tableau à une dimension. Ce tableau aura pour Lbound 0 et pour Ubound 2. Ce tableau aura donc 3 éléments : t(0), t(1) et t(2).

Si tu mets l'option Option base 1 en tête du module, Dim t(2) créera un tableau à une dimension. Ce tableau aura pour Lbound 1 et pour Ubound 2. Ce tableau aura donc 2 éléments :t(1) et t(2).

Pour plus de clarté, on peut abandonner l'option Compare, et écrire Dim t(0 to 2) ou bien Dim t(1 to 2). Ainsi on sait ce qu'on fait.

Quand on utilise :
dim T
T = range("A1:C2")

VBA crée un tableau à deux dimensions dont Lbound pour les deux dimensions est toujours 1. Et ceci quelque soit la valeur de Option Compare (pour l'exemple on a un tableau à deux lignes et trois colonnes)

Une exception quand il n'y a qu'une cellule : :
Dim T
t=range("A1")

Dans ce cas, T n'est pas un tableau mais une variable simple. Lbound(T) et Ubound(T) aboutissent à une erreur.
Il faudra donc tester (si on peut n'avoir qu'une seule cellule) si T est un tableau ou non par IsArray(T) et faire le traitement idoine suivant le cas.

On peut aussi prendre une ligne supplémentaire (en général une ligne vide) et boucler sur les n-1 lignes du tableau:

derlig = cells(rows.count,"a").end(xlup).row+1
T=range("a" & derlig)
For i = Lbound(t) to Ubound(T)-1
...
...
Next i
 
Dernière édition:

cp4

XLDnaute Barbatruc
C'est toi qui est maître du Lbound mais pas entièrement et pas dans tous les cas.

Si tu déclares un array, le Lbound est zéro.
VB:
Dim t(2)
va désigner un tableau à une dimension. Ce tableau aura pour Lbound 0 et pour Ubound 2. Ce tableau aura donc 3 éléments : t(0), t(1) et t(2).

Si tu mets l'option Option base 1 en tête du module, Dim t(2) créera un tableau à une dimension. Ce tableau aura pour Lbound 1 et pour Ubound 2. Ce tableau aura donc 2 éléments :t(1) et t(2).

Pour plus de clarté, on peut abandonner l'option Compare, et écrire Dim t(0 to 2) ou bien Dim t(1 to 2). Ainsi on sait ce qu'on fait.

Quand on utilise :
dim T
T = range("A1:C2")

VBA crée un tableau à deux dimensions dont Lbound pour les deux dimensions est toujours 1. Et ceci quelque soit la valeur de Option Compare (pour l'exemple on a un tableau à deux lignes et trois colonnes)

Une exception quand il n'y a qu'une cellule : :
Dim T
t=range("A1")

Dans ce cas, T n'est pas un tableau mais une variable simple. Lbound(T) et Ubound(T) aboutissent à une erreur.
Il faudra donc tester (si on peut n'avoir qu'une seule cellule) si T est un tableau ou non par IsArray(T) et faire le traitement idoine suivant le cas.

On peut aussi prendre une ligne supplémentaire (en général une ligne vide) et boucler sur les n-1 lignes du tableau:

derlig = cells(rows.count,"a").end(xlup).row+1
T=range("a" & derlig)
For i = Lbound(t) to Ubound(T)-1
...
...
Next i
Merci beaucoup pour toutes ces explications. Je vais les copier et faire des exercices.

Toute ma gratitude.
 

PHV62

XLDnaute Junior
Bonjour PHV62, Dranreb,

j'ai fait PLEIN d'modifs, alors essaye TOUT, puis lis bien TOUT le code VBA.

bon courage, car tu vas avoir beaucoup de pain sur la planche ! 😄 😁

si besoin, tu peux demander une adaptation.
à te lire pour avoir ton avis. 😉

soan
bonjour soan
j ai essaye le fichier envoyé ca fonctionne bien par contre j ai ajouté des noms et la certain non fonctionne d autre non pourriez vous regarder et m expliquer voici le fichier ce fichier et un fichier test le vrai fichier est bien plus gros 111textbox
merci
phv
 

Pièces jointes

  • Classeur1 test (1).xlsm
    30 KB · Affichages: 6

PHV62

XLDnaute Junior
merci vous avez changé quoi je ne vois pas de différence dans le prog
je copie le programme 2 et je le met dans le classeur 1 ca marche pas pourquoi
je dois refaire toutes les lignes ou il y a un truc que je ne vois pas
merci
phv62
 

soan

XLDnaute Barbatruc
Inactif
Bonjour PHV62,

je n'ai absolument rien changé dans le code VBA ; tout se passe seulement dans les données de la feuille de calcul "Feuil1" (qui est en fait la seule feuille du classeur).

quand un père (colonne C) correspond à une personne de la colonne A, la cellule du père doit être exactement la même que celle de la personne (ceci pour pouvoir être trouvée) ; et pour aboutir à cela, j'ai fait tout ce qui suit pour chaque donnée.

1) j'ai supprimé tous les espaces à gauche de la donnée (parfois y'en a qu'un seul à supprimer) ; exemple en A14 : y'avait " FELIX(v-ri)" (avec 2 espaces devant le "F") ; je l'ai remplacé par "FELIX(v-ri)" (avec aucun espace devant le "F") ; attention : c'est pas pareil, et si y'a une différence, c'est pas trouvé !

2) j'ai ajouté une parenthèse gauche là où tu l'avais oublié : en A6, "MARIE THERESEv-ar)" est devenu "MARIE THERESE(v-ar)" ; idem en C23 : t'as sûrement dû faire un copier/coller, petit coquin ! 😜 mais euh, ça t'as pas trop gêné d'mettre une femme dans la colonne "père" ? elle a dû faire une drôle de tronche et s'retourner dans sa tombe, la pauv' Marie Thérèse ! 😁 😂 🤣 mébon, j'ai quand même laissé vu qu'c'est un fichier fictif ; et puis aussi, p't'être qu'en généalogie, quand y'a pas d'père connu, on met la mère en tant que 1er parent ? (juste histoire de pouvoir « remonter » dans l'arbre généalogique)

3) j'ai ajouté 1 espace devant la parenthèse gauche pour bien séparer le nom (ou les noms) de ce qui est entre parenthèses ; exemple en A4 : "JEAN PHILIPPE(v-x)" est devenu "JEAN PHILIPPE (v-x)" ; c'est quoi, ce "(v-x)" ? apparemment, c'est pour dire par exemple 5ème du nom, en chiffres romains, bien sûr ! tout comme pour le Roi "Louis XVI" (mais pas pour ce Roi Louis) ; tu as tout l'air de vouloir faire la généalogie de la haute noblesse française ! 😄 sauf qu'y'a un truc qui colle pas : il y a aussi "v-ar", "v-ri" et "ri-v" ; mais dans les chiffres romains, y'a ni "a" ni "r" !!! 😭 mébon, si t'as inventé d'autres chiffres romains en plus, ça m'dérange pas ! (si ça peut t'faire plaisir, pourquoi pas ? 😁 😜)

4) puisque j'y étais, j'ai aussi supprimé les espaces superflus en colonne D "mère" ; exemples : en D5:D12 pour "ISABELLE" ; en D17:D18 pour "MARIE HELENE" ; faut vraiment qu'tu deviennes plus rigoureux dans tes saisies de données ! j'ose pas imaginer ton fichier réel avec plein d'autres espaces superflus ; ou plusieurs fois : un espace manquant avant une parenthèse gauche ; ou plusieurs fois : pas de parenthèse gauche du tout ! :eek: :rolleyes:

5) j'ai bien compris que tu mets un ou des espaces à gauche pour éviter qu'une donnée soit collée contre le bord gauche de la cellule, afin que ce soit plus aéré et plus lisible ; mais pour faire ça, c'est autrement que tu dois t'y prendre : ne mets pas d'espace(s) à gauche de la donnée, et utilise l'indentation de cellule ; exemple pour "gina" : fais un clic droit en A20, choisis l'item "Format de cellule" ➯ fenêtre du même nom ; sélectionne le 2ème onglet "Alignement" ; pour "Retrait :" mets 1retrait gauche de 1 ; mais si besoin était, c'est aussi possible de mettre un retrait droit de 1 en choisissant aussi un alignement Horizontal à Droite ; car le Retrait est en fonction de l'Alignement (gauche ou droit) ; si tu mets un nombre plus grand, la marge sera plus grande ; maxi : 250 (en pratique, je mets très souvent 1, parfois 2 à 5) ; pour un alignement Horizontal Centré, le Retrait est toujours 0.​

Image.jpg


si tu as besoin de plus d'infos, n'hésite pas ! 😄
à te lire pour avoir ton avis. 😉
soan
 
Dernière édition:

PHV62

XLDnaute Junior
Bonjour PHV62,

je n'ai absolument rien changé dans le code VBA ; tout se passe seulement dans les données de la feuille de calcul "Feuil1" (qui est en fait la seule feuille du classeur).

quand un père (colonne C) correspond à une personne de la colonne A, la cellule du père doit être exactement la même que celle de la personne (ceci pour pouvoir être trouvée) ; et pour aboutir à cela, j'ai fait tout ce qui suit pour chaque donnée.

1) j'ai supprimé tous les espaces à gauche de la donnée (parfois y'en a qu'un seul à supprimer) ; exemple en A14 : y'avait " FELIX(v-ri)" (avec 2 espaces devant le "F") ; je l'ai remplacé par "FELIX(v-ri)" (avec aucun espace devant le "F") ; attention : c'est pas pareil, et si y'a une différence, c'est pas trouvé !

2) j'ai ajouté une parenthèse gauche là où tu l'avais oublié : en A6, "MARIE THERESEv-ar)" est devenu "MARIE THERESE(v-ar)" ; idem en C23 : t'as sûrement dû faire un copier/coller, petit coquin ! 😜 mais euh, ça t'as pas trop gêné d'mettre une femme dans la colonne "père" ? elle a dû faire une drôle de tronche et s'retourner dans sa tombe, la pauv' Marie Thérèse ! 😁 😂 🤣 mébon, j'ai quand même laissé vu qu'c'est un fichier fictif ; et puis aussi, p't'être qu'en généalogie, quand y'a pas d'père connu, on met la mère en tant que 1er parent ? (juste histoire de pouvoir « remonter » dans l'arbre généalogique)

3) j'ai ajouté 1 espace devant la parenthèse gauche pour bien séparer le nom (ou les noms) de ce qui est entre parenthèses ; exemple en A4 : "JEAN PHILIPPE(v-x)" est devenu "JEAN PHILIPPE (v-x)" ; c'est quoi, ce "(v-x)" ? apparemment, c'est pour dire par exemple 5ème du nom, en chiffres romains, bien sûr ! tout comme pour le Roi "Louis XVI" (mais pas pour ce Roi Louis) ; tu as tout l'air de vouloir faire la généalogie de la haute noblesse française ! 😄 sauf qu'y'a un truc qui colle pas : il y a aussi "v-ar", "v-ri" et "ri-v" ; mais dans les chiffres romains, y'a ni "a" ni "r" !!! 😭 mébon, si t'as inventé d'autres chiffres romains en plus, ça m'dérange pas ! (si ça peut t'faire plaisir, pourquoi pas ? 😁 😜)

4) puisque j'y étais, j'ai aussi supprimé les espaces superflus en colonne D "mère" ; exemples : en D5:D12 pour "ISABELLE" ; en D17:D18 pour "MARIE HELENE" ; faut vraiment qu'tu deviennes plus rigoureux dans tes saisies de données ! j'ose pas imaginer ton fichier réel avec plein d'autres espaces superflus ; ou plusieurs fois : un espace manquant avant une parenthèse gauche ; ou plusieurs fois : pas de parenthèse gauche du tout ! :eek: :rolleyes:

5) j'ai bien compris que tu mets un ou des espaces à gauche pour éviter qu'une donnée soit collée contre le bord gauche de la cellule, afin que ce soit plus aéré et plus lisible ; mais pour faire ça, c'est autrement que tu dois t'y prendre : ne mets pas d'espace(s) à gauche de la donnée, et utilise l'indentation de cellule ; exemple pour "gina" : fais un clic droit en A20, choisis l'item "Format de cellule" ➯ fenêtre du même nom ; sélectionne le 2ème onglet "Alignement" ; pour "Retrait :" mets 1retrait gauche de 1 ; mais si besoin était, c'est aussi possible de mettre un retrait droit de 1 en choisissant aussi un alignement Horizontal à Droite ; car le Retrait est en fonction de l'Alignement (gauche ou droit) ; si tu mets un nombre plus grand, la marge sera plus grande ; maxi : 250 (en pratique, je mets très souvent 1, parfois 2 à 5) ; pour un alignement Horizontal Centré, le Retrait est toujours 0.​

Regarde la pièce jointe 1097319

si tu as besoin de plus d'infos, n'hésite pas ! 😄
à te lire pour avoir ton avis. 😉
bonjour soan
j ai modifie comme explique maintenant c bon il faut vraiment que je fasse attention
si je veux mettre un autre bouton comme go père je peux reprendre la formule et juste changer le n° de textbox et changer le nom du bouton
je voudrais ajouter une colonne dans le combobox cette a dire le nom et la date de naissance qui correspond dans le fichier d'essais a la colonne H les dates affichées dans la colonne H sont juste pour exemple
 

Pièces jointes

  • Classeur2 test.xlsm
    30.4 KB · Affichages: 5

soan

XLDnaute Barbatruc
Inactif
Bonjour PHV62,

je vais répondre aux 2 questions de ton MP car ça n'a rien de confidentiel, et ça peut aider d'autres lecteurs de cette conversation.

question n° 1 : « à quoi sert la formule "GoParent" car j'avais essayé en copiant GoPère, et en le transformant en GoMère ça fonctionnait »

attention : "GoParent" n'est pas une formule mais une sub ! tu as donc copié/collé la sub GoPère(), puis tu l'as transformée en sub GoMère() ; c'est très bien d'avoir réussi la transformation, surtout que ça fonctionne tout à fait correctement ! 👍 cependant, il n'y a qu'une seule différence entre les 2 subs : soit ça recherche père, soit ça recherche mère (et note bien que pour les deux, la recherche se fait de la même façon, et dans la même colonne A) ; aussi, on peut simplifier en écrivant une seule sub GoParent(chn$) ; chn$ reçoit le paramètre père ou mère, et on fait le job sur chn ; l'appel de la sub est fait par GoParent père ou GoParent mère.​

VB:
Private Sub GoParent(chn$)
  Dim cel As Range, lig&, i As Byte
  Set cel = Ws.Columns(1).Find(chn, , -4163, 1, 1)
  If cel Is Nothing Then Exit Sub
  ComboBox1.ListIndex = -1: lig = cel.Row
  For i = 1 To 8
    Controls("TextBox" & i) = Ws.Cells(lig, i)
  Next i
End Sub

Private Sub cmdGoPère_Click() 'bouton GoPère
  Dim père$: père = TextBox3: If père <> "" Then GoParent père
End Sub

Private Sub cmdGoMère_Click() 'bouton GoMère
  Dim mère$: mère = TextBox4: If mère <> "" Then GoParent mère
End Sub

ainsi, ça évite de dupliquer tout le code de la recherche : il n'apparaît qu'une seule fois dans la sub GoParent(), et on y fait appel 2× : appel depuis cmdGoPère_Click(), et appel depuis cmdGoMère_Click().​

soan
 

soan

XLDnaute Barbatruc
Inactif
question n° 2 : « comment peut-on remplir une cellule spécifique qui correspond a une TextBox ? exemple : la TextBox1 doit s'inscrire dans la cellule A20 ; la TextBox3 en B15 ; la TextBox4 en B25. »

c'est tout simple ; comme ceci :

VB:
Private Sub CommandButton1_Click()
  Range("A20") = TextBox1: Range("B15") = TextBox3: Range("B25") = TextBox4
End Sub

et en utilisant la notation abrégée, ça donne :

VB:
Private Sub CommandButton1_Click()
  [A20] = TextBox1: [B15] = TextBox3: [B25] = TextBox4
End Sub



bien sûr, si la feuille est autre que la feuille active, tu dois la préciser ! exemple :

Code:
Private Sub CommandButton1_Click()
  With Worksheets("Feuil5")
    .Range("A20") = TextBox1: .Range("B15") = TextBox3: .Range("B25") = TextBox4
  End With
End Sub

ou :

VB:
Private Sub CommandButton1_Click()
  With Worksheets("Feuil5")
    .[A20] = TextBox1: .[B15] = TextBox3: .[B25] = TextBox4
  End With
End Sub

soan
 

PHV62

XLDnaute Junior
bonjour soan
j avance bien dans mon projet grâce votre aide
encore une question comment je peux faire pour rajouter en automatique les nom du père mère et les enfants dans la colonne A quand j ajoute une personne
ci joint le fichier en explication
merci
 

Pièces jointes

  • Classeur3 test 04 03.xlsm
    29.3 KB · Affichages: 4

soan

XLDnaute Barbatruc
Inactif
Bonjour PHV62,

ton fichier en retour. :)

fais Ctrl e ➯ le Formulaire s'affiche ; sur le 1er champ "nom prénom :", si tu fais Échap alors que le champ est vide, ça ferme le UserForm ; fais Ctrl e pour l'ouvrir de nouveau, puis saisis ces valeurs :​

Image.jpg


clique sur le bouton ajouter, puis sur le bouton Oui ; ... y'a plus qu'à vérifier les résultats. ;)

soan
 

Pièces jointes

  • Classeur4 test.xlsm
    34.4 KB · Affichages: 5

Discussions similaires

Réponses
27
Affichages
1 K

Statistiques des forums

Discussions
314 628
Messages
2 111 342
Membres
111 107
dernier inscrit
cdel