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

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

Dranreb

XLDnaute Barbatruc
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
 

Olive de BI

XLDnaute Nouveau
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.
 

patricktoulon

XLDnaute Barbatruc
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é ;)
 

Dranreb

XLDnaute Barbatruc
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:

patricktoulon

XLDnaute Barbatruc
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
 

Dranreb

XLDnaute Barbatruc
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.
 

patricktoulon

XLDnaute Barbatruc
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 ;)
 

Discussions similaires

Statistiques des forums

Discussions
312 207
Messages
2 086 238
Membres
103 162
dernier inscrit
fcfg