[Catégorie modifiée .Net -> VBA] liaison valeur listbox avec 1 tabeau à copier

Signaler
Messages postés
8
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
-
Messages postés
8
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012
-
Bonjour, et bonne année 2012

Désolé de vous redéranger pour cela. J'ai un soucis avec un programme. Je mets des valeurs dans 3 listbox d'un userform (jusque tout va à peu près bien ) puis à partir de ces termes, j'aimerais que selon le choix, un programme vienne copié collé un tabeau d'une page non active sur la page active avec les critères voulues.

Et le je sèche complet,



J'avais déjà poster un mail il y a quelques jours sans beaucoup de réponse.

Merci d'avance de votre aide et désolé de vous déranger.



Private Sub UserForm_Initialize()

'choix du moteur

Dim i As Integer
Dim Valeurs As Variant
Dim a As Object
Set a = CreateObject("Scripting.Dictionary")
'efface le contenu de la listbox
ListBoxmodmot.Clear
'avec la feuille base de donnée.
With Sheets("base de donnee")
'Pour aller plus vite on charge les valeurs dans un tableau
Valeurs = .Range("B3:B5000").Value
For i = LBound(Valeurs) To UBound(Valeurs)
If Not IsEmpty(Valeurs(i, 1)) Then a(Valeurs(i, 1)) = ""
Next i
End With
If IsArray(Valeurs) Then ListBoxmodmot.List = a.keys



'choix du stade

Dim j As Integer
Dim Valeurss As Variant
Dim f As Object
Set f = CreateObject("Scripting.Dictionary")
ListBoxstadmot.Clear
With Sheets("base de donnee")
Valeurss = .Range("c3:c5000").Value
For j = LBound(Valeurss) To UBound(Valeurss)
If Not IsEmpty(Valeurss(j, 1)) Then f(Valeurss(j, 1)) = ""
Next j
End With
If IsArray(Valeurss) Then ListBoxstadmot.List = f.keys



'choix du type de calcul

Dim k As Integer
Dim Val As Variant
Dim g As Object
Set g = CreateObject("Scripting.Dictionary")
ListBoxcalcmot.Clear
With Sheets("base de donnee")
Val = .Range("d3:d5000").Value
For k = LBound(Val) To UBound(Val)
If Not IsEmpty(Val(k, 1)) Then g(Val(k, 1)) = ""
Next k
End With
If IsArray(Val) Then ListBoxcalcmot.List = g.keys

End Sub


Private Sub ListBoxmodmot_Click()
Range("F7").Value = ListBoxmodmot
End Sub

Private Sub ListBoxstadmot_Click()
Range("f8").Value = ListBoxstadmot
End Sub
Private Sub ListBoxcalcmot_Click()
Range("f9").Value = ListBoxcalcmot
End Sub

Private Sub CommandButton1_Click()

Dim i, j As Integer
Dim c, d, e As Cells



With Sheets("base de donnee").Range("A3:D5000")

c = Sheets("base de donnee").Cells(i, 3)
d = Sheets("base de donnee").Cells(i, 4)
e = Sheets("base de donnee").Cells(i, 5)

Set c = .Find(ListBoxmodmot.Value, lookat:=xlWhole)
Set d = .Find(ListBoxstadmot.Value, lookat:=xlWhole)
Set e = .Find(ListBoxcalcmot.Value, lookat:=xlWhole)



'si e,c,d sont sont sur la même lignes alors on recopie le tableau A11.............faisceau correspondant



End With

End Sub

9 réponses

Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Bonjour,

- Tu développes donc sous VBA/Excel et non sous VB.Net !
Fais STP dorénavant très attenion au chois de la section dans laquelle tu ouvres une dicussion. La présente aurait dû l'être dans la section "Langages dérivés > VBA"

- Nous te serions par ailleurs reconnaissant de bien vouloir présenter sur ce forum des bouts de code indentés et entre balises code (sinon : lecture assez pénible).

J'ai des difficultés à comprendre pourquoi tu utilises des objets dictionnaire (surtout ainsi) !

Peux-tu exposer avec précision ce que tu cherches à faire ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
8
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012

Désolé pour l'erreur de catégorie, je débute à peine donc je suis un peu perdu....

Ben la première partie du programme est bonne, elle copie certaines valeurs du tableau "base de donnée vers la listbox sans case vides et sans doublon. J'ai pris conseil sur cette partie et j'avoue que cela marche comme ça et je n'ai pas essayer de le modifier.

Je bloque la sur le fait que je n'arrive pas à partir des 3 listbox à utiliser comme des choix possibles, en appuyant sur un bouton par rapport à ces paramètres. Aller chercher un tableau dans la base de donné pour le copier dans la feuille calcul .


Désolé encore
et merci de ton aide
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Pour ta 1ere partie, tu alourdis pour rien !
Regarde ce que ferait ceci (exemple) :
Dim tablo
  ListBox1.Visible = False ' pour gagner du temps d'affichage
  ListBox1.Clear
  tablo = Worksheets("Feuil1").Range("A2:C15")
  ListBox1.List = tablo
  For i = ListBox1.ListCount - 1 To 0 Step -1
    If ListBox1.List(i) = "" Then ListBox1.RemoveItem (i)
  Next
  ListBox1.Visible = True

Cela va très vite !

Explique plus en détail et avec précision ton point 2

____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
18038
Date d'inscription
lundi 7 décembre 2009
Statut
Modérateur
Dernière intervention
11 avril 2018
236
Pardon !
C frappé au lieu de A ===>>>
Lire :
tablo = Worksheets("Feuil1").Range("A2:A
15")


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Salut

Moi non plus, je n'ai toujours pas saisi la difficulté que tu rencontres.
Le code présenté fonctionne t-il ?
Donne t-il un résultat malgré tout ?
Donne t-il une erreur ? Laquelle, sur quelle ligne ?

c = Sheets("base de donnee").Cells(i, 3) 
La contenu de i n'est pas initialisé : erreur certaine.

La méthode Find permet en effet de trouver la première occurrence dans un Range, mais s'il ne la trouve pas, la variable assignée restera Nothing : A tester en premier :
Private Sub CommandButton1_Click()
    Dim i As Integer, j As Integer    ' Voir 'Attention 2' plus bas
    Dim maCellC As Cells, maCellD As Cells, maCellE As Cells
    With Sheets("base de donnee").Range("A3:D5000")
        maCellC = .Cells(i, 3)
        maCellD = .Cells(i, 4)
        maCellE = .Cells(i, 5)
        Set maCellC = .Find(ListBoxmodmot.Value, lookat:=xlWhole)
        Set maCellD = .Find(ListBoxstadmot.Value, lookat:=xlWhole)
        Set maCellE = .Find(ListBoxcalcmot.Value, lookat:=xlWhole)
        If Not maCellC Is Nothing And _
           Not maCellD Is Nothing And _
           Not maCellE Is Nothing Then
            ' 'si e,c,d sont sont sur la même lignes
            If maCellC.Row = mCellD.Row And _
               maCellC.Row = mCellE.Row Then
                '  alors on recopie le tableau A11 ...
                ' ## Pas assez précis
            End If
        End If
    End With
End Sub

Attention 1 :
Val ou e sont des mots clé du langage. Tu les utilises pour le nom de variable --> Risque certain de bug !

Attention 2 :
Dim i, j As Integer
Dim c, d, e As Cells
ne signifie pas que i et j seront des Integer, et cde des Cells.
Seuls les derniers de la liste seront du type précisé, les précédents seront de type Variant.
Cela peut fonctionner, mais il y a des risques.
Mieux vaus donner le type de chaque variable
Dim i As Integer, j As Integer
Dim c As Cells, d As Cells, e As Cells

PS : Oui, pour présenter du code, utilise la coloration syntaxique (3ème icone à droite) = plus facile à relire et conserve les indentations.

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
Messages postés
8
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012

Bonjour Jack,

Premièrement merci pour ton attention 2, je ne savais pas

Quand j'exécute ta partie de programme ( qui est très claire selon moi ), on dirait que le programme ne prend pas en compte "as cells"
Le logiciel me mets "erreur de compilation , type défini par l'itulisateur non défini".

Et pour pour le manque de précision : si les 3 varaibles sont sur la même ligne alors il doit recopier le tableau associé (juste à coté) avec juste les valeurs dans le tableau intitulé référence avec A11.........faisceau. de la feuille calcul. Si c'est bien sa que tu me demande.

En tout cas déjà un grand merci pour ton aide
Messages postés
172
Date d'inscription
jeudi 8 décembre 2011
Statut
Membre
Dernière intervention
21 juillet 2013
2
 
Avec As Range ce serait mieux ...

___________________________________________________________________________________________________________________
Comme la vitesse de la lumière est supérieure à celle du son, certains ont l'air brillant avant d'avoir l'air con !
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
75
Si tu as conservé ta variable 'e', c'est normal que cela bugue : 'e' est l'exposant de puissance de 10.

"avec A11.........faisceau"
Moi, ça ne me dit rien.
Pour la recopie, enregistre une macro pendant que tu fais un copier-coller similaire et regarde le code.
Messages postés
8
Date d'inscription
vendredi 6 janvier 2012
Statut
Membre
Dernière intervention
24 février 2012

Oups pardon, c'est un tableau de la feuille "base de donnee" avec qui commence à la colonne "e" jusqu'à "t". et les il y a 10 lignes avec la première qui est à la même hauteur que les 3 conditions ( dans les listbox). Après sa doit dépendre des des conditions, car on a pas les mêmes valeurs selon les critères.
Et c'est ce tableau qui faut recopié dans la feuille ("calcul") dans les céllulle "D19" à "R28".

Merci beaucoup en tout cas de ton aide, sa m'a bien servis....