工作表作为vba类模块属性 - 运行时错误9

时间:2015-04-07 19:48:34

标签: class excel-vba vba excel

我有以下名为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. 

2 个答案:

答案 0 :(得分:0)

问题是您尚未为agent1.AgentSheetName分配字符串。因此,您尝试将agent1.AgentSheet设置为名称为空字符串的工作表。我怀疑你有这样一张纸。您应该首先为agent1.AgentSheetName指定一个值。

答案 1 :(得分:0)

由于pAgentSheetWorksheet是一种对象类型,因此您需要使用SetProperty 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可能会更清楚地解释事情