我有以下名为clsAgent
的vba类模块:
Option Explicit
Private pAgentSheetName As String
Private pAgentSheet As Worksheet
Public Property Get AgentSheetName() As String
AgentSheetName = pAgentSheetName
End Property
Public Property Let AgentSheetName(AgentSheetName As String)
pAgentSheetName = AgentSheetName
End Property
Public Property Get AgentSheet() As Worksheet
AgentSheet = pAgentSheet
End Property
Public Property Let AgentSheet(AgentSheet As Worksheet)
pAgentSheet = AgentSheet
End Property
这是我在不同模块中的类实例化:
Sub test_agent_class()
Dim agent1 As clsAgent
Set agent1 = New clsAgent
Set agent1.AgentSheet = Worksheets(agent1.AgentSheetName)
Debug.Print agent1.AgentSheet.Name
End Sub
但是,当我运行test_agent_class()
时,出现错误:run-time error 9
subscript out of range
。以下行以黄色突出显示:Set agent1.AgentSheet = Worksheets(agent1.AgentSheetName)
。
我看过this answer,但由于agent1.AgentSheetName
是一个字符串,我无法解决问题所在。
我做错了什么?
修改
根据第一个答案我添加了一行:
agent1.AgentSheetName = "agentsFullOutput.csv"
在实例化课后。现在我收到一个错误:
Run-time error '91': Object variable or With block variable not set.
答案 0 :(得分:0)
问题是您尚未为agent1.AgentSheetName
分配字符串。因此,您尝试将agent1.AgentSheet
设置为名称为空字符串的工作表。我怀疑你有这样一张纸。您应该首先为agent1.AgentSheetName
指定一个值。
答案 1 :(得分:0)
由于pAgentSheet
是Worksheet
是一种对象类型,因此您需要使用Set
在Property Let
过程中进行分配。使用Property Set代替Property Let也可能更清楚:
Public Property Set AgentSheet(AgentSheet As Worksheet)
Set pAgentSheet = AgentSheet
End Property
如果您使用Property Let
程序,那么在调用程序时不会使用Set
(但在程序中仍然需要它),因此调用将是agent1.AgentSheet = Worksheets(agent1.AgentSheetName)
如果您使用Property Set
程序,则在调用程序时(以及程序中)必须使用Set
,因此调用将为Set agent1.AgentSheet = Worksheets(agent1.AgentSheetName)
This VB6 answer可能会更清楚地解释事情