Microsoft 365 Variable objet ou variable de bloc with non définie

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Olive de BI

XLDnaute Nouveau
Bonjour à tous,
J'ai sur une feuille nommée Bilan un tableau TBilan avec dans une colonne qui a un en-tête "Patient" le nom des patients.
J'ai un formulaire sur d'autres feuilles pour entrer mes nouveaux patients et une combobox dans ce formulaire qui reprend, sous forme de liste déroulante ou en commençant à taper les 1ère lettres le nom des patients déjà enregistrés.
Quand le Tableau TBilan a 2 lignes, même vide pas de problème pour le lancement de mon formulaire et l'ajout de nouveau patient.
S'il n'y a qu'une ligne vide j'obtient le message: Erreur d'exécution '91' variable objet ou variable de bloc With non définie.
Voici le code qui semble poser problème:
Code:
    Dim tBilan As ListObject
    Set tBilan = Range("TBilan").ListObject
    With tBilan
    Me.txtPatient.List = .ListColumns("Patient").DataBodyRange.Value
    End With
La dernière ligne avant End With est celle qui au débogage déclenche l'erreur.
J'ai cru comprendre dans mes recherche que ListObject ne pouvait pas pointer vers quelque chose de vide.
Auriez vous une idée pour solutionner mon problème?
Merci de votre attention
 
Solution
Oui, j'allais proposer à peu près la même chose :
VB:
Dim TTemp()With tBilan
   If .ListRows.Count > 0 Then
      With .ListColumns("Client").DataBodyRange
         If .Rows.Count = 1 Then
            ReDim TTemp(1 To 1, 1 To 1): TTemp(1, 1) = .Value
            CBxClient.List = TTemp
         Else: CBxClient.List = .Value: End If
         End With
   Else: CBxClient.Clear: End If
   End With
Oui, j'allais proposer à peu près la même chose :
VB:
Dim TTemp()With tBilan
   If .ListRows.Count > 0 Then
      With .ListColumns("Client").DataBodyRange
         If .Rows.Count = 1 Then
            ReDim TTemp(1 To 1, 1 To 1): TTemp(1, 1) = .Value
            CBxClient.List = TTemp
         Else: CBxClient.List = .Value: End If
         End With
   Else: CBxClient.Clear: End If
   End With
 
Oui, j'allais proposer à peu près la même chose :
VB:
Dim TTemp()With tBilan
   If .ListRows.Count > 0 Then
      With .ListColumns("Client").DataBodyRange
         If .Rows.Count = 1 Then
            ReDim TTemp(1 To 1, 1 To 1): TTemp(1, 1) = .Value
            CBxClient.List = TTemp
         Else: CBxClient.List = .Value: End If
         End With
   Else: CBxClient.Clear: End If
   End With
Merci Dranreb pour votre temps et votre contribution cela marche parfaitement et répond à ma demande une fois adapté à mes dénominations.
Je vous souhaite une excellente soirée.
Il ne me reste plus qu'à explorer la syntaxe que vous avez employé pour essayer de m'en approprier quelques bribes.
 
Bonjour
après la bataille bien sur
si la plage donnée par le databodyrange n'a q'une ligne sachant que l'on parle de la colonne "Patient"
donc une ligne une seul colonne ca donne 1 seule cellule donc le .value te donnera la valeur de la cellule

donc soit un array soit une valeur
conclusion
soit on met un .list soit on fait simplement un additem
VB:
Dim T
    T = Range("tBilan[Patient]").Value
    If IsArray(T) Then CBxClient.List = T Else CBxClient.AddItem T
Terminé 😉
 
Bonjour.
soit on met un .list soit on fait simplement un additem
Oui, j'avais aussi proposé ça au #13.

Donc, dans le contexte :
VB:
With tBilan
   If .ListRows.Count > 0 Then
      With .ListColumns("Client").DataBodyRange
         If .Rows.Count = 1 Then
            CBxClient.Clear: CBxClient.AddItem .Value
         Else: CBxClient.List = .Value: End If
         End With
   Else: CBxClient.Clear: End If
   End With
 
Dernière édition:
re
si l'on considère que with Tbilan = with sheet(x).listobjects("Tbilan")
alors je reviens sur ce que je martèle souvent
servez vous de range suffixée de la property ".listobject" si il faut

oui ne pas confondre ListObjects et ListObject

ça ne vous empêche pas de travailler en mode Tableaux structurés

pourquoi?:
et bien par ce que un name "Tbilan" il ne peut y en avoir qu'un
et donc ou que vous soyez (sur la feuille parent ou non ) ça matchera
par contre si vous vous servez de listobjects("tbilan") il faudra être sur la feuille concernée ou préfixe par le parent

VB:
With Range("tBilan").ListObject
    If .ListRows.Count > 0 Then
        With .ListColumns("Client").DataBodyRange
            If .Rows.Count = 1 Then
                CBxClient.Clear: CBxClient.AddItem .Value
            Else: CBxClient.List = .Value: End If
        End With
    Else: CBxClient.Clear: End If
End With
 
Le code de son message #1 me semble correct, en tout cas. Moi aussi je déclare souvent un LOt As ListObject, et je l'initialise comme ça m'arrange le mieux. Souvent Set LOt = ActiveSheet.ListObjects(1), mais on peut certes prendre ActiveCell.ListObject, etc.
 
re
et je l'initialise comme ça m'arrange le mieux. Souvent Set LOt = ActiveSheet.ListObjects(1), mais on peut certes prendre ActiveCell.ListObject, etc.
c'est bien ce que je dis justement
ce type de codage exige d’être sur la feuille ou se trouve le listobject

tandis que
range("nom du tableau").value--> te donne le databodyRange
ou
range("nom du tableau[#nom de colone]")--> te donne le databodyRange de la colonne
ou
range("nom du tableau[[#header],[nom de la colonne]]")--> te donne le databodyRange de la colonne avec le header
suffixé par ".listobject" te permet de travailler avec en tant que listobject ou que tu soit 😉
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
3
Affichages
510
Réponses
14
Affichages
1 K
Retour