Utiliser des variables définis dans userform sur vlookup
Bonjour,
j'ai un problème vba, suis débutant en programmation:
Public nbrofficer As Long
Public numerotelephone As String
Public initial As String
Public listeofficer As Range
Sub generateur()
Application.Workbooks("fax_gen.xls").Worksheets("officer").Activate
'ici je selection le nombre d'employer listé sur la feuille officer de mon doc excell
nbrofficer = Application.Workbooks("fax_gen.xls").Worksheets("officer").Range("A2", Range("A2").End(xlDown)).Count
i = 1
For i = 1 To nbrofficer
UserForm1.combobox_officer.AddItem Cells(i + 1, 1)
Next
' ici je peuple ma combo box avec les initials des employés sur mon userform de la colonne A
UserForm1.Show
' à ce niveau j'a rempli ma combo box avec les initial des employés
' ci dessous ce trouve le sub de mon user form ou il y a un bouton de commande ok ainsi que ma combo box
Public Sub bouton_OK_Click()
initial = UserForm1.combobox_officer.Value
UserForm1.Hide
End Sub
' je suppose que en fonction de ce que j'ai choisi dans ma combo box, ma variable initial va prendre la valeur de la chaine de caractere de la combobox
' ensuite je reviens sur ma procédure sub generateur je veux utilisé la valeur de la variable initial enfin de déterminer le numéro de téléphone de l'employé qui se trouve dans la collone 2 - l'erreur ressorti est run time error '5'
'invalid procedure call or argument (c'est callé sur la ligne de code listeofficer....
listeofficer = Application.Workbooks("fax_gen.xls").Worksheets("officer").Range("A2", Range("B2").End(xlDown))
numerotelephone = Application.WorksheetFunction.VLookup(initial, listeofficer, 2, False).Value
msgbox numerotelephone
JE CRAQUUUUEEE HELLLLPPP PLLLLLSSSS
MERCI
Bonjour
Avant de craquer, joins ton fichier
oui dsl, merci banzai64
je voudrais voir aparaitre le numero correspondant apparaitre
merci beaucouppp maitre
mais je ne comprend pas ce qu'est "me."
peux tu m'expliquer ce que cela represente?
et pourquoi met tu une .row à la fin de Ws.Range("A" & Rows.Count).End(xlUp).Row ?
et encore une fois parce que je suis vrmt naze lol
peux tu m'expliqué le raisonement de cette fonction:
Set Ws = Sheets("officer")
With Me.initialofficer
.Clear
.ColumnCount = 2
.ColumnWidths = "-1;0"
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
.List(.ListCount - 1, 1) = J
Next J
End With
Bonjour
Quelques explications
Meremplace l'objet que tu manipules, dans ce cas c'est Userform1
Ws.Range("A" & Rows.Count).End(xlUp).Row Row indique la ligne, et ce code retourne la dernière cellule non vide de la colonne A
Set Ws = Sheets("officer")
With Me.initialofficer
.Clear
.ColumnCount = 2
.ColumnWidths = "-1;0"
For J = 2 To Ws.Range("A" & Rows.Count).End(xlUp).Row
.AddItem Ws.Range("A" & J)
.List(.ListCount - 1, 1) = J
Next J
End WithGrosso modo
On affecte à la variable WS la feuille (c'est plus facile à manipuler que de marquer chaque fois Sheets("officer") )
Ensuite on initialise la ComboBox (initialofficer) avec nombre de colonnes et largeur des colonnes
Puis on remplit cette ComboBox (comme tu faisais dans ta macro)
Particularité: Je note dans une colonne (cachée car largeur = 0) de la ComboBox le numéro de ligne de la valeur que je viens d'ajouter
Pour trouver des renseignements sur la signification de tel ou tel code
Tu places ton curseur sur le mot et tu appuies sur F1
Bonjour Banzai64,
en fait je rencontre un autre problème, ton code me permet d'afficher la donnée de la colonne B en fonction de mon choix de la colonne A.
J'ai compris la logique d'ajouter un colonne "d'indexation" invisible des items dans la combo box pour ensuite s'en servir dans le module1 (très futé).
Mais je ne comprend pas comment fonctionne la ligne
me.combobox_counterparty.column(1)malgré l'aide Excel - comment cette ligne peux retourner une valeur long correspondant a la ligne choisi? ca ne devrait pas plutot etre row(j)?
.List(.ListCount - 1, 1) = jà quoi ca sert puisse que tu a déjà mis les items dans la combo box?
je suis naze....
Merci beaucoup en tout cas
Bonjour
Explication:
C'est dans ce sens que cela fonctionne
1er)
.List(.ListCount - 1, 1) = jUne fois que j'ai rajouté l'item dans la ComboBox, dans la colonne cachée j'y note la ligne (Row)
2ème)
me.combobox_counterparty.column(1)Je récupère dans la colonne 1, la valeur que j'avais "cachée" , elle correspond à la ligne (Row) où se trouve l'item et cette valeur est transmise à la variable
1) ok j'ai compris mais comment savoir que c'est la collonne 1 qu'on doit remplir?
on défini que la list fait 2 colonne mais de -1 à 0 donc la collone 1 ne devrait pas exister
2)du coup (en règle générale) une fois que la combobox est rempli, l'objet combobox prend la valeur en surbrillance??
je comprend que dalle
Private Sub UserForm_Initialize() ('défini la valeur de la combobox- comment la remplir)
Dim j As Long ('J correspond à un nombre)
With Me.combobox_officer ('on va définir les propriétés et appliquer des méthodes à la combobox)
.Clear (on vide la combobox au cas ou il y aurait déjà des valeurs)
.ColumnCount = 2 (on dit que dans la combobox il va y avoir 2 colonne de données)
.ColumnWidths = "-1;0" (on dit que la première colonne sera -1 (donc invisible) et on dit que la seconde colonne sera "0")
For j = 2 To Sheets("officer").Range("A" & Rows.Count).End(xlUp).Row (on dit que j commence par 2 et va jusqu'à la ligne correspondant à la celllule la plus au dessus en partant de la cellule la plus en bas de la colonne A -> déjà là je comprend pas puisque row retourne un plage et non un nombre
.AddItem Sheets("officer").Range("A" & j)
.List(.ListCount - 1, 1) = j (on dit que sur l'item qu'on vient d'ajouter, la colonne 1 = j (indexation des lignes)) comment sait-on que c'est 1 et pas 0 ou -1 la colonne puisque la largeur à été défini de -1 à 0?
Next j
End With
End Sub
Public Sub bouton_OK_Click()
Dim initial As Long
If Me.combobox_officer.ListIndex = -1 Then (ca veut dire que si l'index n'a pas été choisi alors msgbox)
MsgBox "choisir les initiales de créateur du fax"
Exit Sub
End If
initial = Me.combobox_officer.Column(1) (est ce qu'on aurait pas pu mettre juste column(0) ou je sais pas trop quoi pour avoir l'initial de l'officer en tant que string?)( si je comprend bien au moment ou on fait notre choix dans la liste box quand on fait tourner la macro, la macro combobox prend la valeur selectionner?) et la fonction colomn permet en fait de retourner la valeur contenue dans la colonne 1 et correspondant à l'item selectionné
End Sub
compliqué tout ca....
Bonjour
C'est presque ça
.ColumnWidths = "-1;0" (on dit que la première colonne sera -1 (donc invisible) et on dit que la seconde colonne sera "0")
.ColumnWidths = "-1;0" (on dit que la première colonne aura une largeur standard (-1) la 2ème colonne aura une largeur de 0)
For j = 2 To Sheets("officer").Range("A" & Rows.Count).End(xlUp).Row (on dit que j commence par 2 et va jusqu'à la ligne correspondant à la celllule la plus au dessus en partant de la cellule la plus en bas de la colonne A -> déjà là je comprend pas puisque row retourne un plage et non un nombre
For j = 2 To Sheets("officer").Range("A" & Rows.Count).End(xlUp).Row (on dit que j commence par 2 et va jusqu'à la dernière ligne non vide de la colonne A (en fait on se place sur la dernière cellule de la colonne et on remonte pour trouver une cellule non vide))
If Me.combobox_officer.ListIndex = -1 Then(ca veut dire que si l'index n'a pas été choisi alors msgbox)
If Me.combobox_officer.ListIndex = -1 Then (ça veut dire que l'information contenue dans la ComboBox ne fait partie des possibilités)
initial = Me.combobox_officer.Column(1) (est ce qu'on aurait pas pu mettre juste column(0) ou je sais pas trop quoi pour avoir l'initial de l'officer en tant que string?)( si je comprend bien au moment ou on fait notre choix dans la liste box quand on fait tourner la macro, la macro combobox prend la valeur selectionner?) et la fonction colomn permet en fait de retourner la valeur contenue dans la colonne 1 et correspondant à l'item selectionné
initial = Me.combobox_officer.Column(1) (En mettant column(0) on aurait retourné juste ce qui y avait d'inscrit dans la ComboBox, mais tu as besoin de savoir le numéro de la ligne (pour récupérer le numéro de téléphone) c'est pour cela que l'on retourne la valeur qui est stockée dans la 2ème colonne)
Petit info
Modifies le code suivant
[barrer].ColumnWidths = "-1;0"[/barrer]
.ColumnWidths = "-1;-1"ben en fait je peux comprendre le truc de column même si je trouve ca bizarre mais comment mon noueau fichier qui est le meme ne me retourne pas pas ma valeur?
je craaaquueee, c'est misére pour faire utiliser une variable ,défini dans un userform, dans un module ...
Bonjour
Tu n'as pas essayé avec "-1;-1" tu as essayé avec "-1;1"
.ColumnWidths = "-1;-1"Sinon dans tes macros Sub gener() et Private Sub truc_Click() tu supprimes la déclaration de la variable initial : Dim initial As Long
Dans le module1 avant ta macro Sub gener() tu rajoutes
Public initial As Longj'ai enfin compris lol
c'est la propriété columnwidth que j'avais pas saisi, je pensais que ca allait de -1 à 0, alors que en fait c'est premiere collone = -1 (largeur non spécifié) et la seconde 0 (invisible)
merci pour votre patience, super prof. j'ai juste envie de vous payer pour me former . MERCIII