Variable objet ou variable de bloc with non définie

Bonjour à toutes et à tous,

Dans le fichier TESTS CCM THEV.xlsm, tout ce qui concerne dic_produits était prévu pour la création des menus midi retraite, des menus journaliers et des menus viande midi weekend.

Dans le fichier MENUSV2;XLLSM, je tente vainement d'employer également dic_produits pour la création des articles menus. Actuellement, j'ai le message d'erreur Variable objet ou variable de bloc with non définie. Peut-être le nom des dic_produits est-il incorrect ou des instructions sont absentes.

D'avance merci à la personne qui pourra m'apporter la solution à ce problème.

Fichiers MENUSV2.XLSM et TESTS CCM THEV.xlsm :

11menusv2.xlsm (90.77 Ko)
9tests-ccm-thev.zip (299.19 Ko)

Bonjour,

Vous avez obligé la déclaration de vos variables obligatoire avec Option Explicit en tête du module (c'est très bien). Il vous faut tester le débogage pour vérifier qu'elles sont bien déclarées ou qu'il n'y a pas d'erreur de syntaxe dans leur nom.

Le test indique que la variable dic_produits_MMR_dessert n'est pas déclarée. Idem pour la variable Clé. Enfin, il manque le mot code Next J dans votre boucle

Je n'ai pas testé votre code.

Nb : Il vaut mieux éviter les caractères accentués dans le nom de vos variables.

Option Explicit

Dim dic_produits_MMR_légumes As Object, dic_produits_MMR_viandes As Object, dic_produits_MMR_dessert As Object
Dim dic_produits_DMR_dessert As Object
Dim dic_produits_MJ_légumes As Object, dic_produits_MJ_Viandes As Object, dic_produits_MJ_desserts As Object
Dim dic_produits_MVMW_viandes
Dim Clé As Range

Sub Générationdic_produits()
Dim j As Integer
    Set dic_produits_MMR_légumes = CreateObject("Scripting.dictionary")
    Set dic_produits_MMR_viandes = CreateObject("Scripting.dictionary")
    Set dic_produits_MMR_dessert = CreateObject("Scripting.dictionary")
    Set dic_produits_MJ_légumes = CreateObject("Scripting.dictionary")
    Set dic_produits_MJ_Viandes = CreateObject("Scripting.dictionary")
    Set dic_produits_MJ_desserts = CreateObject("Scripting.dictionary")
    Set dic_produits_MVMW_viandes = CreateObject("Scripting.dictionary")

    With [TabProduits].ListObject
            For j = 1 To .ListRows.Count
                Clé = .ListColumns("Nom produit").DataBodyRange(j)
                If .ListColumns("Code produit").DataBodyRange(j) Like "DMR*" Then dic_produits_MMR_dessert(Clé) = "DMR"
           Next j
    End With
End Sub

Bonjour Eric Kergresse,

Merci pour votre réponse. Je l'ai imprimée et je vais modifier mon code en conséquence. Si problème pas résolu, je me permettrai de reprendre contact avec vous.

Bonjour Eric Kergresse,

J'ai modifié mais le problème n'est pas résolu. L'erreur se trouverait dans la procédure Private Sub cbNomArticlesMenus_Change()
Me.tbCodeArticlesMenus = dic_produits_DMR(cbNomArticlesMenus.Value)
Me.tbCodeArticlesMenus = dic_produits_MMR_légumes(cbNomArticlesMenus.Value)

le Me.tbCodeArticlesMenus = dic_produits_DMR(cbNomArticlesMenus.value) se colore en jaune. Quand je passe la souris sur cette ligne, J'ai ceci :

Me.tbCodeArticlesMenus="".

7menusv2.xlsm (91.01 Ko)
capture

Visiblement, cette variable n'est toujours pas déclarée, vous n'utilisez toujours pas le débogage ?

A quel moment chargez vous vos variables dictionnaire ? Faites apparaître la fenêtre Exécution, pour voir les résultats des debug.print.

Je ne suis pas un pro des variables dico, mais sauf erreur de ma part, elles ne s'utilisent pas comme une variable tableau. Il faut d'abord charger leurs propriétés Keys ou Items dans une variable tableau justement. Voir le site de Jacques BOISGONTIER qui utilisait couramment ces variables.

capture1

Je vais essayer avec ces nouvelles indications.

Nouveau fichier modifié avec toujours le même problème mais il a changé de ligne et je n'ai rien en passant la souris sur cette ligne.

9menusv2.xlsm (88.24 Ko)

Faut-il modifier quelque chose dans la feuille Liste création articles menus ? Peut-on voir si les dictionnaires sont créés ou pas ? Si oui, comment procéder ?

Bonjour Eric Kergresse,

Une question : faut-il prévoir, dans la procédure private sub cbNomArticlesMenus_Change, des instructions telles que celles qui y figurent actuellement pour tout (DS, DW, LSLM, LSMJ, etc..) ? Dans les dim, faut-il en prévoir d'autres ou en supprimer (quel est en définitive le meilleur dim à retenir) ? Même chose pour tout les if, set dico, me.

D'avance merci pour votre réponse.

Bonjour,

le crosposting (poster sur plusieurs forums) est interdit sur ce forum.
Pas sympa de monopoliser des helper alors que ça sera peut-être déjà résolu ailleurs...
eric

Bonjour,

A quoi servent vos variables dico ?

S'il s'agit de construire des menus, il suffirait de partir d'une liste d'ingrédients chargés dans une listbox et que vous pourriez sélectionner et ordonner dans une autre listbox. Puis de qualifier votre menu selon le jour de la semaine ou de la période de la journée. La validation de la boite de dialogue viendrait exporter la liste des ingrédients dans une table Menus.

"À quoi servent vos variables dico ?" : je n'en sais rien. Quelqu'un m'a proposé cela sans aucune explication quant au but recherché et à leur utilité.

Il ne s'agit pas de menus avec des recettes (donc des ingrédients à utiliser) mais de choses que je vais manger tel midi, tel soir, tel weekend, etc.

On se sert de variables dico pour charger des données sans doublons dans leur partie Keys. Cela pourrait vous servir dans le cas où vous auriez un tableau des recettes et vous voudriez filtrer une recette (un repas) en particulier.

Je pense que vous pourriez utiliser un userform plus convivial en chargeant directement des Listbox. Si vous avez été sur le site de Jacques, vous avez ce genre de solution sous forme de liste à liste.

Sinon, je ne vois pas la différence entre une recette de restaurant avec ce que vous voulez faire.

La création articles menus servira pour créer les menus midi retraite, menus journaliers et menus viandes midi weekend à partir de l'user form UF02_CréationMenus qui n'est pas encore créé. Ce que je souhaite, ça ressemble plus à des menus restaurant qu'à des recettes avec ingrédients..

Je vais certainement abandonner le dictionary car j'en ai marre d'avoir toujours la même erreur à des endroits différents. dic-produits_DMR est bien déclarée en dim dic_produits_DMR as Object. Si je mets .keys dans le dim, cela ne marche pas. Alors quelqu'un me dit comment rectifier cette soi-disant erreur ou je laisse tomber. Je ne comprends pas pourquoi tant de choses à faire alors que dans TEST CCM THEV, pour la création des menus midi retraite, menus journaliers, menus viandes midi weekend, pour dictionary, il n'y a rien de tout cela.

Si je passe la souris sur Set TabDico, = Vide; sur les deux instructions suivantes : Incompatibilité de type

8menusv2.xlsm (105.02 Ko)

Bonjour Eric Kergresse,

J'ai regardé le site mentionné plus haut mais il n'y a rien concernant la création des dictionnaires. En supposant que cela soit utile (dans TESTS CCM THEV, cela fonctionne correctement sans qu'on ait recours à une création des dictionnaires, si ce n'est le Scripting.dictionary), comment procéder : une feuille à part, un formulaire à part, quelles sortes de colonnes, etc.

Si vous trouvez une solution au problème, je vous remercie de la tester s'il vous plaît et de me la faire parvenir à votre convenance (soit l'écrire ici ou, mieux, de modifier le fichier et de m'en refaire retour). D'avance merci pour votre compréhension. Dans l'hypothèse où ne le sauriez pas, mais je ne suis aucunement un professionnel et, défaut majeur, je n'ai aucunement l'esprit de déduction.

Il faut regarder dans la partie de Dictionary du site.

Elle se trouve à droite de l'écran ?

Si vous souhaitez vraiment utiliser des variables dico :

capture capture1

Merci. C'est bien ce que j'avais fait mais cela ne m'a pas inspiré, à moins de tenter de créer l'exemple, ce que je n'ai pas fait.

Private Sub UserForm_Initialize()
Set MonDico = CreateObject("Scripting.Dictionary")
For Each c In Range([b2], [B65000].End(xlUp))
If Not MonDico.Exists(c.Value) Then MonDico.Add c.Value, c.Value
Next c
temp = MonDico.items
'--
Call tri(temp, LBound(temp), UBound(temp))
Me.ComboBox1.List = temp
End Sub
Private Sub ComboBox1_Change()
Me.ListBox1.Clear
For Each c In Range("b2", [B65000].End(xlUp))
If c = Me.ComboBox1 Then
Me.ListBox1.AddItem c.Offset(0, -1)
End If

Next c
End Sub

Un exemple de code de Boisgontier :

le fait de mettre set MonDico=CreateObject("Scripting.dictionary) a-t-il pour conséquence de créer un dictionnaire portant le nom MonDico ?

Me.ComboBox1.list = temp : que signifie Temp ?

Un peu partout il y a c. Savez-vous ce que signifie c : est le nom du disque dur ? ou autre chose (dans ce cas, précisez cet autre chose). D'avance merci.

le fait de mettre set MonDico=CreateObject("Scripting.dictionary) a-t-il pour conséquence de créer un dictionnaire portant le nom MonDico ?

Set MonDico instancie la variable mais ne la remplit pas.

Me.ComboBox1.list = temp : que signifie Temp ?

Une variable dico comporte deux parties : Une clé (Keys) et un contenu variable (Items). Dans le contexte, Temp correspond aux items. C'est un tableau de données, celui-ci est directement chargé dans la combobox1 avec .list.

Un peu partout il y a c. Savez-vous ce que signifie c : est le nom du disque dur ? ou autre chose (dans ce cas, précisez cet autre chose).

Dans le contexte, C est une variable Range (C comme cellule). Nb : Jacques n'avait pas l'habitude de typer ses variables, de ce fait elles étaient toutes de type variant.

Rechercher des sujets similaires à "variable objet bloc definie"