Renvoyer la valeur d'une cellule en fonction d'une autre, dans un userform

19suivi-bc.zip (1.09 Mo)
Bonjour,

Je souhaite disposer dans le userform de l'information "temps de traitement pour avoir EJ" (information en colonne ED) et "temps de traitement du BC" (information en colonne EE).
Bien entendu, en fonction du BC que je sélectionne dans le le userform.
Ex: Si je sélectionne le BC 602 qui est sur la ligne 692, doivent être renvoyés dans le Userform les données en ED692 et EE692.

Merci d'avance à tous pour votre aide.

Bonjour,

Il existe l'équivalent d'INDEX EQUIV en VBA. Voici un exemple :

vcherchee = "BC602"
vrenvoyee = application.index(range("ED:ED"), application.match(vcherchee, range("EJ:EJ"), 0)) & " " & _
            application.index(range("EE:EE"), application.match(vcherchee, range("EJ:EJ"), 0))
myctrl.value = vrenvoyee

On cherche donc vcherchee dans EJ et on renvoie la valeur à la ligne correspondante dans ED (et dans EE en conacténant avec un espace).

Il faudra bien entendu adapter ces lignes qui permettent de comprendre le fonctionnement. Le passage par une variable temporaire (vrenvoyee) n'est absolument pas nécessaire. La variable vcherchee sera alimentée sera donc la valeur obtenue suite à la sélection sur votre userform.

Cdlt,

Bonjour,

Je vous remercie pour cette réponse. Ceci étant, je suis novice en Excel et je ne sais comment transposer ce code dans visual basic.

Concernant la recherche, ce n'est pas uniquement BC602, mais cela peut être n'importe quel Bon de Commande que je serai amené à sélectionner dans le menu déroulant de l'UserForm (ComboBox1). Pour résumer, j'ai besoin de savoir en fonction du Bon de commande que je sélectionne, quel est 1/ Le temps de traitement pour l'obtention de l'EJ (EJ=Engagement Juridique) (c'est l'information qui est en colonne ED et 2/ Le temps de traitement complet du Bon de commande (c'est l'information qui est en colonne EE).

J'ai besoin que ces informations soit reportées dans le UserForm en face du Label "Delai EJ (Jour)" (dans l'encadré rouge) et "Délai de Traitement (jour)" (dans l'encadré vert)

Merci d'avance pour votre aide.

userform

Bonjour,

C'est pour ça qu'il faut adapter un peu le code.

Quel est le nom de la combobox (liste déroulante) où est sélectionné le BC ?

Quel est le nom du contrôle (textbox probablement) où est affichée l'info obtenue suite à la recherche ?

Cdlt,

Le nom de la ComboBox est ComboBox1

Pour le nom du TextBox, il n'y en avait pas, je vais l'ajouter

Pour le délai EJ : Ce sera le Label30 avec dans Caption TempsEJ

Pour le délai du traitement du BC : Ce sera le Label31 avec dans Caption TempsBC

userform
Voici comment est le code actuellement : (j'ai inséré votre code en ayant essayé de l'adapter, mais ne suis pas sur du tout si c'est le bon emplacement ou la bonne adaptation)

Option Explicit

Dim Ws As Worksheet

Private Sub Label3_Click()

End Sub

Private Sub TextBox1_Change()

End Sub

Private Sub TextBox11_Change()

End Sub

'Pour le formulaire

Private Sub UserForm_Initialize()

Dim J As Long
Dim I As Integer

Set Ws = Sheets("BC") 'Correspond au nom de l'onglet dans le fichier Excel

 With Me.ComboBox1

    For J = 1 To Ws.Range("H" & Rows.Count).End(xlUp).Row
       .AddItem Ws.Range("H" & J)
    Next J

 End With

With Me.ComboBox1

vcherchee = "ComboBox1"
vrenvoyee = Application.Index(Range("ED:ED"), Application.Match(vcherchee, Range("H10:H2000"), 0)) & " " & _
            Application.Index(Range("EE:EE"), Application.Match(vcherchee, Range("H10:H2000"), 0))
myctrl.Value = vrenvoyee

 For I = 1 To 18
     Me.Controls("TextBox" & I).Visible = True
 Next I

End Sub

'Pour la liste déroulante BC

Private Sub ComboBox1_Change()

Dim Ligne As Long
Dim I As Integer

If Me.ComboBox1.ListIndex = -1 Then Exit Sub

  Ligne = Me.ComboBox1.ListIndex + 1

  For I = 1 To 18
     Me.Controls("TextBox" & I) = Ws.Cells(Ligne, I + 115)
  Next I

End Sub

'Pour le bouton Nouveau bon de commande

Private Sub CommandButton1_Click()

Dim L As Integer

 If MsgBox("Confirmez-vous l'insertion d'un nouveau BC ?", vbYesNo, "Demande de confirmation d'ajout") = vbYes Then
     L = Sheets("BC").Range("h1048576").End(xlUp).Row + 1 'Pour placer le nouvel enregistrement à la première ligne de tableau vide

     Range("H" & L).Value = ComboBox1
     Range("DL" & L).Value = TextBox1
     Range("DM" & L).Value = TextBox2
     Range("DN" & L).Value = TextBox3
     Range("DO" & L).Value = TextBox4
     Range("DP" & L).Value = TextBox5
     Range("DQ" & L).Value = TextBox6
     Range("DR" & L).Value = TextBox7
     Range("DS" & L).Value = TextBox8
     Range("DT" & L).Value = TextBox9
     Range("DU" & L).Value = TextBox10
     Range("DV" & L).Value = TextBox11
     Range("DW" & L).Value = TextBox12
     Range("DX" & L).Value = TextBox13
     Range("DY" & L).Value = TextBox14
     Range("DZ" & L).Value = TextBox15
     Range("EA" & L).Value = TextBox16
     Range("EB" & L).Value = TextBox17
     Range("EC" & L).Value = TextBox18

 End If

End Sub

'Pour le bouton Modifier

Private Sub CommandButton2_Click()

Dim Ligne As Long
Dim I As Integer

   If MsgBox("Confirmez-vous les modifications apportées ?", vbYesNo, "Demande de confirmation de modification") = vbYes Then
     If Me.ComboBox1.ListIndex = -1 Then Exit Sub

         Ligne = Me.ComboBox1.ListIndex + 1

     For I = 1 To 18
         If Me.Controls("TextBox" & I).Visible = True Then
            Ws.Cells(Ligne, I + 115) = Me.Controls("TextBox" & I)
         End If
     Next I
   End If

End Sub

'Pour le bouton Quitter

Private Sub CommandButton3_Click()

   Unload Me

End Sub

Voici un essai en déplaçant (et en modifiant un peu) la partie du code en question vers la macro combobox1_change

Private Sub UserForm_Initialize()

Dim J As Long
Dim I As Integer

Set Ws = Sheets("BC") 'Correspond au nom de l'onglet dans le fichier Excel

 With Me.ComboBox1

    For J = 1 To Ws.Range("H" & Rows.Count).End(xlUp).Row
       .AddItem Ws.Range("H" & J)
    Next J

 End With

For I = 1 To 18
     Me.Controls("TextBox" & I).Visible = True
 Next I

End Sub

'Pour la liste déroulante BC

Private Sub ComboBox1_Change()

Dim Ligne As Long
Dim I As Integer

If Me.ComboBox1.ListIndex = -1 Then Exit Sub

  Ligne = Me.ComboBox1.ListIndex + 1

with Sheets("BC")
    For I = 1 To 18
        Me.Controls("TextBox" & I) = .Cells(Ligne, I + 115)
    Next I
    me.label30 = Application.Index(.Range("ED10:ED2000"), Application.Match(Me.ComboBox1.value, .Range("H10:H2000"), 0))
    me.label31 = Application.Index(.Range("EE10:EE2000"), Application.Match(Me.ComboBox1.value, .Range("H10:H2000"), 0))
end with

End Sub

Ici, je suppose que la feuille avec les données est "BC" et que les valeurs à renvoyer dans les 2 labels sont en colonne ED et EE.

Cdlt,

La feuille avec les données est bien BC et les valeurs à renvoyer dans les 2 labels sont bien en colonne ED et EE.

Je viens de transposer le code, mais cela génère un débogage lorsque j'ouvre le userform :(

nouveau code

Lorsque vous ouvrez l'userform ? Et quel est le message d'erreur ?

Déjà, vous pouvez essayé de rajouter .caption après les 2 noms de label.

Il faut bien que la valeur sélectionnée soit présente en H10:H2000...

Cdlt,

Bonjour,

Le message d'erreur n'est pas lorsque j'ouvre le Useform mais lorsque je sélectionne un Bon de Commande. J'ai mis en PJ le message qui s'affiche ainsi que la ligne en jaune après avoir cliqué sur ok. Il se passe la même chose si je mets .Caption après le label comme vous me l'avez suggéré.

Les valeurs sélectionnées sont bien entre H10 et H2000 (c'est la colonne du fichier ou sont listés les Bons de Commande)

photo1
photo2
photo3

Bonjour,

Merci pour ces images, j'ai pu voir le message sous tous les angles .

Où est passée la ligne with sheets("BC") dans le code juste avant la ligne For ?

Il n'y a pas (ou peu) de raisons de rencontrer un bug ici à première vue...

Cdlt,

Effectivement, j'ai fait ce matin un mauvais copier/coller...

Ceci étant, j'ai toujours un message d'erreur, différent cette fois-ci (PJ) toujours pareil, lorsque je sélectionne un Bon de Commande (j'ai essayé avec plusieurs BC mais tjs le même message )

photo4
photo5

C'est déjà plus rassurant...

Pouvez-vous essayer ce code édité à l'instant :

Private Sub ComboBox1_Change()

Dim Ligne As Long
Dim I As Integer

If Me.ComboBox1.ListIndex = -1 Then Exit Sub

  Ligne = Me.ComboBox1.ListIndex + 1
  
with Sheets("BC")
    For I = 1 To 18
        Me.Controls("TextBox" & I) = .Cells(Ligne, I + 115)
    Next I
    me.label30 = cstr(Application.Index(.Range("ED10:ED2000"), Application.Match(Me.ComboBox1.value, .Range("H10:H2000"), 0)))
    me.label31 = cstr(Application.Index(.Range("EE10:EE2000"), Application.Match(Me.ComboBox1.value, .Range("H10:H2000"), 0)))
end with

End Sub

Cdlt,

Alors cette fois-ci, il n'y a plus de message d'erreur au niveau du code, mais apparait "Erreur 2042" au niveau des valeurs rapportées (PJ)

photo6

Et ainsi :

Private Sub ComboBox1_Change()

Dim Ligne As Long
Dim I As Integer

If Me.ComboBox1.ListIndex = -1 Then Exit Sub

  Ligne = Me.ComboBox1.ListIndex + 1

with Sheets("BC")
    For I = 1 To 18
        Me.Controls("TextBox" & I) = .Cells(Ligne, I + 115)
    Next I
    me.label30 = cstr(Application.Index(.Range("ED10:ED2000"), Application.Match(Me.ComboBox1.value * 1, .Range("H10:H2000"), 0)))
    me.label31 = cstr(Application.Index(.Range("EE10:EE2000"), Application.Match(Me.ComboBox1.value * 1, .Range("H10:H2000"), 0)))
end with

End Sub

Pfff Trop FORT !!!

Impeccable !!! Merci beaucoup pour l'aide

Si vous étiez dans le sud est, je vous payerais bien une bonne bouteille de rouge ou autre pour trinquer !

Super ! Je suis content que ça marche !

Je vais passer mes vacances dans le Var cet été ! Alors je prends note !

Bonne continuation !

Rechercher des sujets similaires à "renvoyer valeur fonction userform"