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

Olive de BI

XLDnaute Nouveau
Bonjour.
Testez If .ListRows.Count > 0 Then
En effet si la condition est fausse les DataBodyRange ne sont pas initialisés.
Bonjour Dranreb,
J'ai modifié mon code et je n'ai plus l'erreur si mon tableau TBilan est vide mais quand j'ajoute une entrée j'ai maintenant une erreur 381: Impossible de définir la propriété LIst.Index de table de propriété non valide.
Je ne mets sûrement pas au bon endroit votre proposition.
Auriez-vous plus de précision?
Merci
Code:
Private Sub UserForm_Initialize()
    Dim tBilan As ListObject
    Set tBilan = Range("TBilan").ListObject
    With tBilan
    If .ListRows.Count > 0 Then
    Me.txtPatient.List = .ListColumns("Patient").DataBodyRange.Value
    End If
    End With
    'Déclaration des variables
    Dim NouvelID As Long
    Dim ws As Worksheet
    Me.cboMois.SetFocus
    Me.lblMessage = "Veuillez choisir un mois pour le nouveau patient"
    cboMois.ListIndex = Month(Now()) - 1
End Sub
 

Dranreb

XLDnaute Barbatruc
Dans ce cas particulier DatabodyRange ne correspond qu'à une seule cellule, et du coup sa Value n'est plus un tableau. Vous auriez peut être intérêt à le tester aussi, et faire :
VB:
With tBilan
   Select Case .ListRows.Count
      Case 0: CBxPatient.Clear
      Case 1: CBxPatient.List = Array(.ListRows(1).Range.Value)
      Case Else: CBxPatient.List = .ListColumns("Patient").DataBodyRange.Value
      End Select
   End With
 
Dernière édition:

Olive de BI

XLDnaute Nouveau
Merci pour la rapidité de votre réponse.
J'ai essayé sans succès.
Je vous joins le fichier de mon projet. C'est beaucoup de bricolage alors il y a certainement pas mal d'incohérences.
J'espère que cela pourra aider à la résolution.
Merci encore.
Je viens de trouver!
C'est bien If .ListRows.Count > 0 Then qui solutionne le problème en remplaçant 0 par 1.

@Dranreb Un grand merci pour votre solution!
 

Olive de BI

XLDnaute Nouveau
Mince, c'est bien vrai!
Ce n'est qu'à partir de l'insertion d'une deuxième entrée que la 1ère apparait!
Mettre 1 solutionne les erreurs mais ne permet pas de renseigner la combobox lorsqu'il y a une seule ligne.
Très bizarre!
Je vous joins le fichier du coup...
Si jamais vous avez le temps.
Merci
 

Pièces jointes

  • projet 01 - Copie.xlsm
    142 KB · Affichages: 3

Dranreb

XLDnaute Barbatruc
Bizarre.
Essayez :
VB:
      Case 1: CBxPatient.Clear: CBxPatient.AddItem .ListRows(1).Range.Value

Ou … non je m'étais trompé … Peut être :
Code:
      Case 1: CBxPatient.List = Array(.ListColumns("Patient").DataBodyRange.Value)
 
Dernière édition:

Discussions similaires

Statistiques des forums

Discussions
313 289
Messages
2 096 847
Membres
106 764
dernier inscrit
END