VBA Error Code Object Required — Have Triple checked but still not working

痴心易碎 提交于 2019-12-22 18:44:15

问题


The Bold and Italicized lines below continue to return to me the "Run Time Error'424': Object Required. I am working on this as part of a self learn class, and I have tripled checked to make sure I am entering the code properly and am still returning this error. I tried looking at other examples of this error on here, but none were helpful to this instance because I do not know the code well enough yet.

Thank you!

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

回答1:


You just need to change .Text to .Value




回答2:


Changing .Text for .Value will fix it, but in case you're wondering how "Object required" even remotely makes sense as an error message, here's why.

You know the syntax for implicit value assignment:

foo.Bar = 42

The explicit value assignment syntax is still supported, but obsolete/deprecated:

Let foo.Bar = 42

This assignment calls the Property Let accessor of the Bar property of the foo object, which could look something like this:

Public Property Let Bar(ByVal value As Long)
    internalBar = value
End Property

Public Property Get Bar() as Long
    Bar = internalBar
End Property

In the case of Range.Text, the property might look something like this:

Public Property Get Text() As String
    Text = GetStringRepresentationOfValue
End Property

Notice there's no Property Let accessor, so this:

someRange.Text = "foo"

Isn't legal, because the Text property doesn't expose a Property Let accessor.

So what's the deal with object required? Getting to it.

But first you need to know what a default member is. You see every class module can define a "default member". For collections that member is usually the Item property, by convention.

This means whether you do this:

foo = myCollection.Item(12)

Or that:

foo = myCollection(12)

You get the exact same foo, exactly the same way - the two are exactly the same.. except the latter implicitly calls the default member, and the former explicitly does so.

A class' default member is determined by a hidden member attribute that you can only see if you export the class module and open it in a text editor:

Public Property Get Item(ByVal Index As Long) As Variant
Attribute Foo.VB_UserMemId = 0
    Item = internalCollection(Index)
End Property

Only 1 member in a class can be the default.

So what the error message is saying, is that when it sees this:

foo.Bar = 42

And knows that Bar is a read-only property that only exposes a Property Get accessor, then the only way for this code to be legal, is if Bar returns an object that has a default member that can be assigned to take that value.

And since Range.Text returns a String and not an Object, VBA complains that an object is required.




回答3:


Perhaps

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

Same for

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


来源:https://stackoverflow.com/questions/46717384/vba-error-code-object-required-have-triple-checked-but-still-not-working

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!