Microsoft 365 vba

PHV62

XLDnaute Junior
voici une partie de code vba qui sert a remplir mes textbox par rapport a combobox1
je souhaiterais modifier ce code afin de remplir les textbox mais également des combobox

merci pour votre aide si vous le pouvez

Private Sub ComboBox1_Change() 'liste déroulante
'si flag = 1, sortir, car c'est un appel implicite depuis la sub cmdModif_Click()
'MAIS AVANT de sortir, on met flag à 0, sans quoi choisir un nouvel item dans la
'liste déroulante ne mettra pas à jour les 7 TextBox !
If flag = 1 Then flag = 0: Exit Sub

'sinon, c'est que flag = 0, et donc on fait le traitement habituel qui suit.

'si la liste déroulante ne montre pas d'item, sortir !
If ComboBox1.ListIndex = -1 Then Exit Sub

'changement d'un item de la liste déroulante => on met à jour les 7 TextBox
Dim lig&, i As Byte: lig = ComboBox1.ListIndex + 2
For i = 1 To 240
Controls("TextBox" & i) = Ws.Cells(lig, i)
Next i
End Sub
 

Dranreb

XLDnaute Barbatruc
Si l'objet ComboBoxLiées ne supporte que les ComboBox au RowSource non renseigné, le ControlsAssociés, lui, supporte indifféremment les TextBox, ComboBox, CheckBox, même Image, dans une certaine mesure Label et les Frame contenant des OptionButton.
 

Dranreb

XLDnaute Barbatruc
Non, je ne vais pas passer par une programmation plus compliquée que celle qui utilise ma fourniture.
Tout se définit dans la Sub UserForm_Initialize.
Vous ne vous occupez plus de rien ensuite pour la gestion des contrôles.
Le genre d'instruction qui fait votre boucle c'est CAs.ValeurDepuis TVL
CAs étant le nom du ControlsAssocié et TVL un Tableau des Valeurs de la Ligne.
 
Dernière édition:

soan

XLDnaute Barbatruc
Inactif
Bonjour PHV62, Dranreb,

je veux bien essayer de t'aider, mais pour ça, il faut 2 choses :

1) envoie un fichier exemple sans données confidentielles ; taille maximum : 1 Mo (même si tu le zippes)

2) tu as écrit : « je souhaiterais modifier ce code afin de remplir les textbox mais également des combobox » ; précise mieux ce que tu veux : remplir les textbox et les combobox ; oui, mais comment ? je veux dire : à partir de quelles données ? il s'agit bien d'un transfert des données d'une feuille de calcul dans les contrôles d'un UserForm, n'est-ce pas ? si oui :
* pour la source : quel est le nom de la feuille de calcul ? quelles sont les cellules de cette feuille qui sont concernées ? par exemple : feuille "Feuil3" ; donnée "nom du grand-père" de la cellule D5.
* pour la destination : nom du UserForm ; nom des contrôles qui devront contenir les données ; exemple : UserForm1 ; TextBox1 ou ComboBox1



tu as indiqué la sub ComboBox1_Change() ; si j'me souviens bien, c'était une liste déroulante d'un UserForm pour choisir une personne parmi d'autres membre de la généalogie ; donc quand on choisit une personne, il faudrait afficher en dessous d'autres données concernant cette personne ; exact ? ou c'est autre chose ?

s'il s'agit d'autre chose, alors ce ne sera peut-être pas la sub ComboBox1_Change() qui est concernée ; peut-être par exemple la sub UserForm_Initialize().​

soan
 

PHV62

XLDnaute Junior
bonjour soan
j ai joint un programme exemple les problèmes sont:
j ai essayer de modifier mais quelque soucis
1° quand je remplir la textbox1 et les combobox 3 4 5 6 7 8 dans l userform2 ensuite je fais ajouter avec le bouton "cmdAdd" j'ai un message erreur et l erreur se trouve ligne 89 mais les renseignement sont bien range dans la "FEUIL"

2° quand je veux sélectionner un nom dans la liste du combobox1 il indique une erreur ligne 26

3° j ai modifier dans la formule cmdAdd afin de remplir automatiquement la feuil "BASE"
quand je fais ajouter les renseignement s ajoute bien dans la feuil "BASE" mais avec un espace de 3 lignes entre chaque enregistrement comment faire pour supprimer les 3 lignes vide de ce faite les combobox 3 4 5 6 7 8 n affiche qu une ligne alors que dans les propriété des combobox en lignerow il y a 30

4° dans le programme dans la formule cmdModif dans la ligne 109 il y a le même défaut que la ligne 26

essais et tu verra les problèmes apparaitre

merci d avance
 

Pièces jointes

  • FAMILLE essais combobox.xlsm
    239.5 KB · Affichages: 11

soan

XLDnaute Barbatruc
Inactif
Bonjour PHV62, Dranreb,

j'suppose que tu dois avoir un écran vraiment très large et bien haut pour pouvoir afficher en entier ton très grand formulaire UserForm2 ! comme mon écran est plus petit que le tien, j'ai dû beaucoup modifier la présentation du UF pour qu'il tienne en entier sur mon écran ; sans ça, je ne pouvais pas cliquer sur la liste déroulante de Combobox 1 ! de plus, je ne voyais qu'une petite partie des champs de droite !

pour tes images du dossier "E:\GENEALOGIE\photo\", j'ai dû désactiver (mettre en commentaire) le code VBA correspondant car je n'ai pas ce dossier ; ce sera à toi de le réactiver.

tu as demandé beaucoup d'choses ! j'ai tout fait sauf ton point 3) ➯ j'ai fait plein d'modifs dans le code VBA de UserForm2 ➯ relis-le en entier !


pour ton point 3) :

* sur la feuille "BASE", à gauche de la colonne "PÈRE", tu n'as pas mis de colonne "N°" comme sur "FEUIL" : est-ce normal ou c'est un oubli ? s'il faut vraiment qu'il y aie 2 feuilles, elles devraient avoir la même structure ; mais d'un autre côté, je pense que c'est mieux avec une seule feuille et pas deux ... à moins que tu aies une bonne raison de le faire, que je ne connais pas.

* sur la même feuille "BASE", pourquoi donc laisses-tu des lignes vides entre les noms (par exemple lignes 5 à 7), alors que tu ne l'as pas fait sur "FEUIL" ? il faut éviter les lignes vides intercalaires entre les lignes de données !

c'est pour ces raisons que je n'ai pas voulu m'occuper de ta feuille "BASE" : c'est selon ce que tu choisiras de faire en fonction de mes infos ci-dessus ; et si tu décides de supprimer la feuille "BASE", c'est inutile que je modifie le code VBA pour la prendre en compte.​



à toi de faire tous les tests ; je pense que ça devrait être ok, mais au cas où y'aurait un problème, n'hésite pas à m'en parler. :) je vais arrêter mon PC bientôt, alors je lirai ta réponse cet après-midi, ou ce soir ; mais rien ne presse : ça peut attendre demain, ou même après-demain ; alors profites-en pour bien tester le tout !

soan
 

Pièces jointes

  • FAMILLE essais combobox.xlsm
    202.2 KB · Affichages: 6

PHV62

XLDnaute Junior
bonjour soan je vous remercie pour la réponse désolé de n avoir pas répondu avant pas regarder les modif dans mon prog maintenant c est fait et tout fonctionne correctement j ai adapte le programme envoyé au mien quel petite adaptation pour le problème de base je l ai supprime mais j ai fait une feuille ville avec une liste de ville et de profession et comme cela ca fonctionne

encore merci pour l aide
phv62

PROBLEME RESOLU GRACE A SOAN
 

PHV62

XLDnaute Junior
bonjour soan
encore une question j utilise cette formule

Private Sub TextBox100_Change()
'TextBox100.Text = UCase(TextBox100.Text) 'Forcer la majuscule
'End Sub

il y aurai une formule pour regrouper cette formule sur plusieurs textbox car j ai 127 lignes a écrire

merci
phv62
 

soan

XLDnaute Barbatruc
Inactif
Bonjour PHV62,

1) ta sub peut s'écrire ainsi :

VB:
Private Sub TextBox100_Change()
  TextBox100 = UCase$(TextBox100) 'Forcer la majuscule
End Sub



2) pour par exemple 6 subs TextBox100_Change() à TextBox105_Change(), tu pourrais faire ceci :​

VB:
Option Explicit

Private Function EnMaj(chn$) As String 'Forcer la majuscule
  EnMaj = UCase$(chn)
End Function

Private Sub TextBox100_Change()
  TextBox100 = EnMaj(TextBox100)
End Sub

Private Sub TextBox101_Change()
  TextBox101 = EnMaj(TextBox101)
End Sub

Private Sub TextBox102_Change()
  TextBox102 = EnMaj(TextBox102)
End Sub

Private Sub TextBox103_Change()
  TextBox103 = EnMaj(TextBox103)
End Sub

Private Sub TextBox104_Change()
  TextBox104 = EnMaj(TextBox104)
End Sub

Private Sub TextBox105_Change()
  TextBox105 = EnMaj(TextBox105)
End Sub

mais comme la fonction EnMaj() contient une seule instruction courte et rapide à exécuter, ça n'en vaut pas la peine ! surtout qu'en terme de rapidité d'exécution, le temps de traiter l'unique instruction UCase$() directement dans la sub TextBox10X_Change() sera plus court que la somme de ces 3 temps : celui de l'appel de la sub EnMaj() + celui du traitement de UCase$() dans la sub EnMaj() + celui du retour à la sub appelante TextBox10X_Change() ; aussi, il vaut mieux utiliser ce code VBA :

VB:
Private Sub TextBox100_Change()
  TextBox100 = UCase$(TextBox100)
End Sub

Private Sub TextBox101_Change()
  TextBox101 = UCase$(TextBox101)
End Sub

Private Sub TextBox102_Change()
  TextBox102 = UCase$(TextBox102)
End Sub

Private Sub TextBox103_Change()
  TextBox103 = UCase$(TextBox103)
End Sub

Private Sub TextBox104_Change()
  TextBox104 = UCase$(TextBox104)
End Sub

Private Sub TextBox105_Change()
  TextBox105 = UCase$(TextBox105)
End Sub



3) quand tu utilises _Change(), ça fait bien sûr la mise en majuscules à chaque changement de la TextBox, donc pour chaque caractère tapé, modifié, ou supprimé ; si c'est vraiment ça que tu veux : ok ; mais y'a aussi la possibilité de laisser l'utilisateur faire sa saisie sans la modifier, puis ensuite, c'est au moment de quitter la TextBox que tu la met en majuscules via _Exit() ; exemple pour la TextBox100 :
VB:
Private Sub TextBox100_Exit(ByVal Cancel As MSForms.ReturnBoolean)
  TextBox100 = UCase$(TextBox100)
End Sub



4) j'crois bien qu'y'aurait aussi une façon de faire différente via un Module de Classe : ça serait du genre : pour tout contrôle de type TextBox, si le nom du TextBox est "TextBox100" à "TextBox105", alors mettre en majuscules ; mais j'suis pas doué avec les Modules de classe, alors au cas où tu s'rais tenté d'utiliser ce système, je laisse à un autre contributeur qui s'y connaît bien là-dessus le soin de te faire le code VBA adéquat. ;)



bonne chance pour la suite de ton projet, et pour tes moments de loisirs, je te suggère de jouer au jeu des 7 familles : « dans la famille PHV, je voudrais l'arrière-arrière-arrière-grand-père ». 😄 😂 🤣

soan
 

patricktoulon

XLDnaute Barbatruc
bonjour
si l'on veux contraindre x textbox en majuscule touche maj bloqué ou pas on peut faire avec une petites classe control et on peut le faire en interne dans un userform
exemple j'ajoute 14 textbox directement enfant de mon userform1
et bien la classe interne se résumera a ceci
VB:
Public WithEvents TxtB As MSForms.TextBox
Dim cls(1 To 14) As New UserForm1


Private Sub TxtB_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger): KeyAscii = Asc(UCase(Chr(KeyAscii))): End Sub

Private Sub UserForm_Activate()
For i = 1 To 14: Set cls(i).TxtB = Me.Controls("TextBox" & i): Next
End Sub

et rien n’empêche d'utiliser les events d'origine pour d'autre action a faire
 

Discussions similaires

Réponses
6
Affichages
202