Liste en cascade trié (Erreur de compilation dans ligne de code)

WISEDOME

XLDnaute Junior
Bonsoir à tous les experts de ce forum,

Je travaille actuellement sur une application pour mon service achats, et j'ai du mal à avancer depuis quelques jours à cause d'un code que j'ai du mal à adapter.

En effet il s'agit d'alimenter deux combobox en cascade trié. après quelques recherches, j'ai découvert le code de Jacques Boisgontier que j'ai vite fait d'adapter à mon projet. Le seul hic, est qu'à l'exécution du code, le message suivant apparait "Erreur de compilation, Tableau attendu".

Je vous serez sincèrement reconnaissant de m'aider à comprendre ce qui se passe et à m'enlever cette épine qui m'empêche d'avancer dans mon projet.(Je vous ai joint un extrait de mon fichier pour vous aider à mieux comprendre mon problème au cas ou je n'arrive pas à me faire comprendre.

A toutes fins utiles, je souligne que je travaille avec les versions 2007 et 2010 d'excel.

Merci d'avance.

Wisedome.
 

Pièces jointes

  • Liste en cascade avec éléments triés.xlsm
    22.5 KB · Affichages: 40

Dranreb

XLDnaute Barbatruc
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Bonjour.
temp est déclaré comme une variable élémentaire As Long. Elle ne saurait être utilisée comme tableau.
De plus elle semble destinée à accueillir les familles alors il serait plus judicieux de la déclarer:
VB:
Dim temp() As String
Remarque: j'utilise personnellement une technique complètement différente.
Elle implique un module spécialisé normal et 3 modules de classes, mais ils ne sont pas à retoucher. En contrepartie le code dans l'userform est considérablement plus simple.
Je vous équipe votre classeur de tout ça si ça vous intéresse, mais re-joignez le au format .XLS car la conversion chez moi des .XLSM fabrique des classeurs vérolés.
À +
 
Dernière édition:

WISEDOME

XLDnaute Junior
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Bonjour Dranreb,

J'ai modifié la déclaration de temp, mais toujours le même message.
Je te renvois le fichier au format demandé (.xls).

Merci encore pour t'être penché(e) sur mon cas.

WISEDOME.
 

Dranreb

XLDnaute Barbatruc
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Bonjour.
Tout de suite 2 erreurs:
Dim Ws As Worksheets
Dim temp As String
1) - Ws est déclaré comme une collection Workheets et ne peut donc recevoir un objet Worksheet
2) - temp est toujours scalaire au lieu d'être tableau
VB:
Dim Ws As Worksheet
Dim Temp() As String
Je vous recommande par ailleurs de toujours commencer vos noms de variables par une majuscule dans les déclarations, et de les taper toujours en minuscule dans le code, afin d'être immédiatement alerté, par la non correction de la casse, de ce que votre variable n'est pas déclarée.
Mais plus bas, ça ne va pas: incompatipilité de type. Temp exige d'être déclaré:
VB:
Dim Temp() As Variant
Je continue les tests. Mais est-ce bien utile. Ne voulez vous pas que je vous installe mon système de gestion automatique des ComboBox ?

P.S. Plus loin dans Famille_Change en remplaçant Ws.Range("MAGASIN") par Ws.Range("ListeFamilles"),
et en ayant reporté la déclaration de Ws en tête du module, ça à l'air de marcher. Mais avec ça il reste la SousFamille_Change à écrire. Qu'est-ce que vous voulez y faire ?
À +
 
Dernière édition:

WISEDOME

XLDnaute Junior
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Comme indiqué plus haut, c'est un code emprunté à J. BOISGONTIER que j'essaie d'adapter à mon fichier. Je vous serez très reconnaissant de m'aider à démasquer toutes les coquilles de mon code, ou à défaut me proposer une solution qui resoudra mon problème et m'aidera à finaliser mon projet.

Je prendrai volontier toute autre proposition!
Cdlt.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Bonjour,


Voir PJ

Code:
Dim f, a()
Private Sub UserForm_Initialize()
  Set f = Sheets("base")
  Set MonDico = CreateObject("Scripting.Dictionary")
  a = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value
  For i = LBound(a, 2) To UBound(a, 1)
    MonDico(a(i, 2)) = ""
  Next i
  temp = MonDico.keys
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.Famille.List = temp
End Sub

Private Sub famille_click()
  Me.SousFamille.Clear
  Set MonDico = CreateObject("Scripting.Dictionary")
  For i = LBound(a, 1) To UBound(a, 1)
     If a(i, 2) = Me.Famille Then MonDico(a(i, 3)) = ""
  Next i
  temp = MonDico.keys
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.SousFamille.List = temp
End Sub

JB
 

Pièces jointes

  • Copie de Liste en cascade avec éléments triés-1.xlsm
    24.9 KB · Affichages: 34

Dranreb

XLDnaute Barbatruc
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Alors je vous ai équipé le classeur des 3 modules de classes et d'un module ordinaire spécialisé.
Je vous ai mis une copie du Userform1 en UserForm2 qui les utilise.
Voyez la différence de style…
À +
 

Pièces jointes

  • Liste en cascade avec éléments triés-2.xls
    199 KB · Affichages: 61

WISEDOME

XLDnaute Junior
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Bonjour JB,

C'est parfait, ça marche exactement comme je le voulais. Cependant j'ai une suggestion et une préoccupation:

- La suggestion: Il serait plus interressant que tu commentes d'avantage tes codes pour faciliter la compréhension à nous autres débutants qui apprécions particulièrement tes posts et sommes fervents consommateurs de tes productions (Formation Excel VBA JB).

- La préoccupation: Voudrais tu stp m'expliquer le rôle du "C" dans la ligne "a = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value", ainsi que la partie du code permet de faire le trie dans les combobox; ou à défaut m'aiguiller sur des liens qui me permettront d'en apprendre d'avantage sur la manipulation de l'objet Dictionary, vu que j'en aurai besoin d'adapter ton code dans mon application sur des paires (Pays/Villes; Acheteur/Catégorie; Demande/Nature).

Merci mille fois.

A Toi Dranreb;

J'apprécie beaucoup ton aide, je prendrais le temps de comprendre ton code surtout qu'il me permet de mettre la zone de saisie en surbrillance en plus de répondre à ma requête.

Merci infiniment à tous.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

a = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value transfère la BD dans un tableau a() pour accélérer l'exécution si la BD est importante.

Une version sans tableau

Code:
Dim f
Private Sub UserForm_Initialize()
  Set f = Sheets("base")
  Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In f.Range("B2:B" & f.[B65000].End(xlUp).Row)   ' on explore la colonne de niveau 1
    MonDico(c.Value) = ""                                    ' on ajoute l'élément de la famille au dictionnaire
  Next c
  temp = MonDico.keys      'les clés du dico dans la table temp()
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.Famille.List = temp
End Sub

Private Sub famille_click()
  Me.SousFamille.Clear
  Set MonDico = CreateObject("Scripting.Dictionary")
  For Each c In f.Range("B2:B" & f.[B65000].End(xlUp).Row)      ' on explore la colonne de niveau 1
     If c = Me.Famille Then MonDico(c.Offset(, 1).Value) = ""       ' si famille alors on ajoute l'élément de la sous-famille au dictionnaire
  Next c
  temp = MonDico.keys        'les clés du dico dans la table temp()
  Call Tri(temp, LBound(temp), UBound(temp))
  Me.SousFamille.List = temp
End Sub

Objet dictionary

Les tris et sous-totaux


Menus en cascade

JB
 

Pièces jointes

  • Copie de Liste en cascade avec éléments triés-2.xlsm
    27.4 KB · Affichages: 41
Dernière édition:

WISEDOME

XLDnaute Junior
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

C'est Cool JB!

Je vais vraiment me regaler ce WE.

Sans vouloir abuser de ta solicitude, je remarque que lorsque je passe en mode Option Explicit, le code se plante, et fonctionne à nouveau lorsque je désactive ce mode. Cela est-il lié à un problème de déclaration de variables? Si oui, je te pries de me donner la synthaxe exacte de déclaration de toutes les variables contenues dans ton code (de préférence celui avec la ligne: a = f.Range("A2:C" & f.[A65000].End(xlUp).Row).Value). Juste ça, et je déclare resolu mon problème.

Cordialement.
 

BOISGONTIER

XLDnaute Barbatruc
Repose en paix
Re : Liste en cascade trié (Erreur de compilation dans ligne de code)

Voir les mêmes prg avec Option Explicit

JB
 

Pièces jointes

  • Copie de Copie de Liste en cascade avec éléments triés-1.xlsm
    26.3 KB · Affichages: 49
  • Copie de Copie de Liste en cascade avec éléments triés-2.xlsm
    26.8 KB · Affichages: 45

Discussions similaires

Réponses
28
Affichages
1 K
Réponses
3
Affichages
530
Réponses
8
Affichages
418
Réponses
34
Affichages
943

Statistiques des forums

Discussions
312 330
Messages
2 087 349
Membres
103 526
dernier inscrit
HEC