Variable objet ou variable de bloc with non définie

Bonjour Eric Kergresse,

Merci pour ces précieux renseignements. Dans l'hypothèse où il serait nécessaire de déclarer les variables, quelles seraient les variables à déclarer et le type qui leur serait attribuées ?

Bonnes journée et continuation. Je serai de retour ici vers 11 heures.

Vous personnellement, vous êtes pour la déclaration des variables 1) dans chaque procédure où elles sont utilisées; 2)dans un module une fois pour toutes ? Moi, personnellement, je suis partisan de la solution 2).

Dans des temps anciens, je déclarais toutes mes variables public. Maintenant, je les déclare au niveau de la procédure et je transmets les valeurs par paramètres dans les sous procédures, c'est beaucoup plus lisible lorsque vous avez un code complexe.

Merci. Et pour ce qui est des variables à déclarer et le type qui devrait leur être attribuées (projet de jacques) ?

Dans le programme de Jacques; feuille Dictionnaire, comment fait-il pour :

1) créer un text box ?

2) pour écrire dedans ?

Je n'y arrive pas.

Mettez votre code avec l'icone </> dans le menu ou un fichier.

Bonjour Eric Kergresse,

Le fichier de Jacques. Il s'agit de la feuille Dictionnaire (ce sera valable également pour les autres feuilles) dans laquelle il y a un text box1 lequel est rempli. Je viens de voir que c'est avec une ancienne version d'excel (1997-

2003).

Il n'y a pas de textbox dans son fichier.

J'ai ajouté un textbox dans le 1er userform.

Private Sub ListBox1_Click()

      TextBox1 = ListBox1.Value

End Sub

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.TextBox1 = ""
  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

Feuille dictionnaire, cellule E1, clic n'importe où : à gauche de la barre des formules, apparaît Text box 1. À moins que pour vous, "Il n'y a pas de textbox dans son fichier." signifie qu'il n'existe pas de code. Dans ce cas, pourquoi alors cette mention apparaît ?

En supposant que mon dico existe réellement, est-il possible de le charger pour voir son contenu ? Si oui, comment procéder ?

J'ai trouvé une réponse à une question posée : comment remplir les textes boxes de chaque feuille. Par contre, il n'y pas moyen de désactiver la modification du texte.

Salut,

En regardant le code fourni, tu peux constater que le dictionnaire va conserver les valeurs unique de la colonne "B"

Voici un bout de code, pour le vérifier, dans le Array tu as deux fois la valeur "aa1" si tu lances le pas à pas avec F8 tu te rendras compte que "aa1" ne figure plus qu'une fois. on se sert de cela pour charger des listes déroulantes avec des valeurs uniques

Sub TestDictionary()
Dim Ele
    With CreateObject("scripting.dictionary")
        For Each Ele In Array("aa1", "aa2", "aa1", "aa3", "aa4", "aa2")
            .Item(Ele) = Ele & "_content"
        Next

        For Each Ele In .Keys
            Debug.Print Ele, .Item(Ele)
        Next
    End With
Next
End Sub

Résultat :

image

Tu peux voir le contenu du dico en itérant sur les valeurs Keys et Item.

Pour le processeurs des version 2021 et 365 il y a possibilité de charger les liste déroulantes directement. Si l'on a par exemple un tableau vt_Contacts avec une colonne Nom. On charge avec la méthode Evaluate. Qui renvoie pour l'exemple une liste Unique triée.

ComboBox1.List = Evaluate("SORT(UNIQUE(vt_Contacts[Nom]))")

Bonjour Jean-Paul,

Les valeurs uniques de la colonne "B" : la colonne B de quelle feuille ? Je n'ai rien vu concernant aa1, aa2, etc.

Tu peux voir le contenu du dico en itérant sur les valeurs Keys et Item. Je suis toujours aussi nul en matière de déduction : comment itérer sur les valeurs Keys et Item ?

Je suis vous Excel 2010.

Bonjour,

Dans les feuilles FonctionTableur et CompteSansDoublonsCritère, il n'y a pas de bouton Go ni de bouton exécution ou de tout autre nom. Ma question : comment ces deux feuilles se remplissent-elles .

D'avance merci pour votre réponse.

Salut,

la colonne B de quelle feuille ?

Je n'ai pas ouvert le classeur, mais d'après le code fourni par Eric, le code se situe au niveau de la méthode Initialise d'un UserForm.

la colonne B de quelle feuille ?

Il est vrai que sans plus de spécification c'est la colonne "B" de la feuille active qui va être parcourue. Pour éviter ce genre de désagrément tu dois spécifier le nom de la feuille. Feuil1.Range("B:B") ou mieux passer par un tableau structuré Range("vt_Contacts[Nom]") qui est quand même plus parlant.

Objet Dictionary | Microsoft Learn

Bonjour Jean-Paul,

vt_contacts : c'est le nom du tableau (que signifie vt ?). [Nom] : le nom de la colonne concernée dans ledit tableau ?

Quelles serait le nom des colonnes nécessaires ? Combien de colonnes devraient être prévues ? Quel serait le contenu de chaque colonne ?

Le nom du tableau (ou de la feuille) devrait être spécifié dans l'userform_Initialize ou dans une procédure personnelle ?

Étant donné ma nullité en matière de déduction et de programmation, un exemple détaillé me serait très utile. Je comprends ce qui est dit, comment faire, etc., je le dis franchement. Par contre, je ne comprends pas ce qui est dit et comment procéder, tout aussi franchement, je le dis. J'ai horreur de faire semblant de tout comprendre, de tout connaître, de savoir tout faire, au risque d'agacer certains d'avoir affaire à une telle nullité comme moi. D'ailleurs, si cela était le cas, je ne serais pas obligé de demander de l'aide.

Salut le fil,

que signifie vt ?

Rien en soit, c'est ma façon de différencier les tableaux, préfixe "vt_" pour les tableaux, "vr_" pour les champs nommés, "vs_" pour les feuilles système.

Je peux par exemple cacher tous les champs nommés d'un seul coup.

Function DisplaySystemNames(Display As Boolean, Optional Prefix As String)
    On Error GoTo Catch
    If Prefix = vbNullString Then Prefix = "vr_"
    Dim Ele As Name
    For Each Ele In ThisWorkbook.Names
        With Ele
            If .Name Like Prefix & "*" Then .Visible = Display
        End With
    Next Ele

Catch:
    If Error > 0 Then DisplaySystemNames = Err.Number & " " & Err.Description
End Function

Le nom du tableau (ou de la feuille) devrait être spécifié dans l'userform_Initialize ou dans une procédure personnelle ?

Il vaut mieux regrouper les affectations dans un module, si tu dois changer le nom d'un tableau tu ne la change que dans le module

Bonjour Jean-Paul,

Dim d 'Create a variable

Set d = CreateObject("Scripting.Dictionary")

d.Add "a", "Athens" 'Add some keys and items

d.Add "b", "Belgrade"

d.Add "c", "Cairo"

que représente d : le nom du tableau ? le nom du dico ?

Re,

il va falloir revoir les base du Late et Early Binding et des affectation d'objets

Pour une variable l'affectation se fait directement exemple :

Dim MachaineString As String
MaChaineString = "Ma chaine string"

Si la variable na pas été affectée elle est égale pour un String à vbNullString, pour un Long à 0, pour un Boolean à False, etc...

Pour un objet tu dois utiliser Set exemple :

Dim MyRange as Range
Set MyRange = Range("A1:B10"

Si l'objet n'a pas été affecté il est égal à Nothing

Ici on va travailler en Late Binding (Liaison tardive) le compilateur ne sais pas ce que représente d, on va donc le dimensionner en objet

Dim d as Object
' // On affecte à d, un Objet Dictionary
Set d = CreateObject("Scripting.Dictionary")

que représente d : le nom du tableau ?

Donc non ce n'est pas un tableau mais un Objet Dictionary.

Un peu de lecture :

Liaison précoce et tardive - Visual Basic | Microsoft Learn

Dim Dic_Produits 'Create a variable Un dim pour chaque dic_produits ? ou un seul dim ?

8tests-ccm-thev.zip (299.19 Ko)
8menusv2.xlsm (105.02 Ko)

Set Dic_Produits_MMR_Desserts = CreateObject("Scripting.Dictionary")

Dic_Produits_MMR_Desserts.Add "DMR01", "Pomme dessert midi retraite" Add some keys and items

Set Dic_Produits_DS_Desserts = CreateObject("Scripting.Dictionary)

Dic_Produits_DS_Desserts.Add "DS01", "Pomme dessert soir"

set Dic_Produits_DWE_Desserts=CreateObject("Scripting.Dictionary")

Dic_Produits-DWE_Desserts.Add "DWE01","Ananas"

Dic_Produits-DWE_Desserts.Add "DWE02","Autres fruits"

Mon dictionnaire pourrait-il avoir cette forme (voir la feuille Liste, tableau structuré TabProduits et l'UserForm UF01_Création, procédure tbDateMenu)

Dans le fichier menusv2.xlsm, il y a une erreur lors de l'exécution.

Bonsoir Eric Kergress,

À toutes utiles, je vous signale que le dictionnaire sera à utiliser uniquement dans le fichier MENUSV2.xlsm, pour la création des articles menus.

Bonnes fin de soirée, nuit et continuation. Prenez bien soin de vous.

Rechercher des sujets similaires à "variable objet bloc definie"