2017-10-12 4 views
2

Les lignes en gras et en italique ci-dessous continuent à me renvoyer le "Run Time Error'424": Object Required.Je travaille dans le cadre d'un J'ai appris trois fois pour vérifier que je saisis correctement le code et je suis toujours en train de retourner cette erreur J'ai essayé d'examiner d'autres exemples de cette erreur ici, mais aucun n'a été utile à cette instance parce que je ne connais pas le Code assez bien encore.Objet de code d'erreur VBA requis --- J'ai triplé mais ne fonctionne toujours pas

Merci!

Sub FirstArray() 

Dim Fruit(2) As String 

Fruit(0) = "Apple" 
Fruit(1) = "Banana" 
Fruit(2) = "Cherry" 
***Range("A1").Text = "First Fruit: " & Fruit(1)*** 

Dim Veg(1 To 3) As String 

Veg(1) = "Artichoke" 
Veg(2) = "Broccoli" 
Veg(3) = "Cabbage" 
***Range("B1").Text = "First Veg:" & Veg(1)*** 

Dim Flower() As String 
ReDim Flower(1 To 3) 

Flower(1) = "Azalea" 
Flower(2) = "Buttercup" 
Flower(3) = "Crocus" 
***Range("C1").Text = "Final Flower:" & Flower(3)*** 





End Sub 
+0

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

+2

'.Text' est une propriété en lecture seule. Vous voulez '.Value' –

+0

Vous pouvez ajouter des commentaires (-) à la partie du code que vous voulez que nous regardions – kazzi

Répondre

4

vous avez juste besoin de changer pour .Text.Value

+0

Merci beaucoup, cela a corrigé mon problème! – EricHH11

+0

Alternativement, il suffit de * drop * le '.Text' et de laisser l'affectation se faire sur le membre par défaut * de l'objet' Range', ce qui arrive à pointer vers ... sa 'Value'. (Personnellement, je préfère explicitement faire référence à '.Value') –

0

Peut-être

Range("B1") = "First Veg:" & Veg(1) 

Même chose pour

Range("C1") = "Final Flower:" & Flower(3) 
3

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.

+1

J'ai répondu à la question et cela m'a toujours été très utile. Donc merci d'avoir pris le temps d'expliquer. – jcarroll