Error 451, “Property Let procedure not defined and property Get procedure did not return an object”, is the most bookish message in this family, and it is precise once unpacked. A class property can have up to three procedures: Property Get (read), Property Let (assign a value), and Property Set (assign an object). Error 451 fires when code assigns a plain value to a property that has only a Get, and that Get does not return an object VBA could forward the assignment into. In plain terms: the code tried to write to a property that was built read-only, using the wrong shape of write for it.
Set at the call and the class needs a Property Set. The error means neither route was completed:' Class has only: Public Property Get Rate() As Double
' Caller tries: cfg.Rate = 0.2 ' error 451
' Fix in the class:
Public Property Let Rate(ByVal v As Double)
mRate = v
End Property
If the class visibly has a Property Let and 451 still fires, check the Let signature: its parameter type must match the Get return type's assignment shape. A mismatch (Let taking a different type than the value being assigned) makes the Let unusable for that assignment and produces this error rather than a type mismatch.
What are Property Get, Let, and Set? The three procedures behind a class property in VBA: Get reads the value, Let writes a plain value, Set writes an object reference. A property can have any subset, and the subset defines what callers may do.
Why does the message mention the Get not returning an object? Because of a fallback: assigning to a property whose Get returns an object can forward the assignment to that object's default property. When the Get returns a plain value instead, there is nowhere to forward to, and the missing Let becomes the error.