Changing .Text for .Value corrigera, mais au cas où vous vous demandez comment « Objet requis » fait même à distance sens comme un message d'erreur, voici pourquoi .
Vous connaissez la syntaxe pour affectation de valeur implicite:
foo.Bar = 42
La syntaxe affectation de valeur explicite est toujours prise en charge, mais obsolète/désapprouvée:
Let foo.Bar = 42
Cette mission appelle la Property Let
accesseur de la propriété Bar
de l'objet foo
, qui pourrait ressembler à ceci:
Public Property Let Bar(ByVal value As Long)
internalBar = value
End Property
Public Property Get Bar() as Long
Bar = internalBar
End Property
Dans le cas de Range.Text
, la propriété pourrait ressembler à ceci:
Public Property Get Text() As String
Text = GetStringRepresentationOfValue
End Property
avis il n'y a pas accesseur Property Let
, donc ceci:
someRange.Text = "foo"
est pas légal, parce que la propriété Text
n'expose pas un accesseur Property Let
.
Alors, quel est le problème avec objet requis? Arriver à ça.
Mais vous devez d'abord savoir ce qu'est un membre par défaut. Vous voyez tous les modules de classe peut définir un "membre par défaut". Pour les collections, ce membre est généralement la propriété Item
, par convention.
Cela signifie que vous faites ceci:
foo = myCollection.Item(12)
Ou que:
foo = myCollection(12)
Vous obtenez exactement la même foo
, exactement de la même manière - les deux sont exactement les mêmes .. sauf le dernier implicitement appelle le membre par défaut, et l'ancien explicitement le fait.
Une classe membre par défaut est déterminé par un membre caché attribut que vous ne pouvez voir si vous exportez le module de classe et l'ouvrir dans un éditeur de texte :
Public Property Get Item(ByVal Index As Long) As Variant
Attribute Foo.VB_UserMemId = 0
Item = internalCollection(Index)
End Property
Seulement 1 membre dans une classe peut être la valeur par défaut.
Alors, que le message d'erreur dit, est que quand il voit ceci:
foo.Bar = 42
Et sait que Bar
est une propriété en lecture seule qui expose seulement un accesseur Property Get
, alors la seule façon pour ce code est légal si Bar
renvoie un objet qui a un membre par défaut pouvant être affecté pour prendre cette valeur.
Et depuis Range.Text
renvoie une String
et non un Object
, VBA se plaint que un objet est nécessaire.
Désolé, les lignes avec le *** .... ***. Je n'ai pas réalisé que le code ne me permettrait pas de l'afficher en caractères gras ou en italique ici ... – EricHH11
'.Text' est une propriété en lecture seule. Vous voulez '.Value' –
Vous pouvez ajouter des commentaires (-) à la partie du code que vous voulez que nous regardions – kazzi