如何在excel vba类模块中设置readonly属性

时间:2015-04-08 16:04:55

标签: class excel-vba vba excel

我在名为clsAgent的类模块中有以下内容:

Option Explicit
Const AgentEmailCol = 9
Private pAgentSheetName As String
Private pIDRange As Range
Private pAgentID As String
Private pAgentEmail As String

Public Property Get AgentSheetName() As String
    AgentSheetName = pAgentSheetName
End Property

Public Property Let AgentSheetName(AgentSheetName As String)
    pAgentSheetName = AgentSheetName
End Property

Public Property Get IDRange() As Range
    Set IDRange = pIDRange
End Property

Public Property Set IDRange(IDRange As Range)
    Set pIDRange = IDRange
End Property

Public Property Get AgentID() As String
    AgentID = pAgentID
End Property

Public Property Let AgentID(AgentID As String)
    pAgentID = AgentID
End Property


Public Property Get AgentEmail() As String
    AgentEmail = WorksheetFunction.VLookup(Me.AgentID, Me.IDRange, AgentEmailCol, False)
End Property

在名为clsWorkingRange的班级中我有:

Option Explicit

Private pSheetName As String
Private pColNum As Integer
Private pTargetRange As Range

Public Property Get SheetName() As String
    SheetName = pSheetName
End Property

Public Property Let SheetName(SheetName As String)
    pSheetName = SheetName
End Property


Public Property Get ColNum() As Integer
    ColNum = pColNum
End Property

Public Property Let ColNum(ColNum As Integer)
    pColNum = ColNum
End Property


Public Property Get TargetRange() As Range
    Set TargetRange = pTargetRange
End Property

Public Property Set TargetRange(TargetRange As Range)
    Set pTargetRange = TargetRange
End Property


Private Function Get_Rows_Generic(work_sheet_get As String, column_num As Integer)
'worksheet is the name of a sheet in the form of a string
    Dim ws As Worksheet:             Set ws = Worksheets(work_sheet_get)
    Dim rows_count As Long:        rows_count = ws.Cells(rows.Count, column_num).End(xlUp).Row
    Get_Rows_Generic = rows_count
End Function

Public Function set_range(sheet_name As String, col1 As Integer) As Range
'   returns the range of a given column using all the rows in a street
    Dim rows1 As Long
    rows1 = Get_Rows_Generic(sheet_name, 1)
    Dim range1 As Range ' range of first search
    With Worksheets(sheet_name)
        Set range1 = .Range(.Cells(1, col1), .Cells(rows1, col1)) ' set the range being searched first
    End With

    Set set_range = range1
End Function

我有一个名为clsWorkingSheet的课程:

Option Explicit

Private pSheetName As String
Private pSheet As Worksheet

Public Property Get SheetName() As String
    SheetName = pSheetName
End Property

Public Property Let SheetName(SheetName As String)
    pSheetName = SheetName
End Property

Public Property Get Sheet() As Worksheet
    Set Sheet = pSheet
End Property

Public Property Set Sheet(Sheet As Worksheet)
    Set pSheet = Sheet
End Property

在一个单独的模块中,我有以下内容:

Sub test_agent_class()

Dim agent_Sheet As clsWorkingSheet
Set agent_Sheet = New clsWorkingSheet

agent_Sheet.SheetName = "agentsFullOutput.csv"
Set agent_Sheet.Sheet = Worksheets(agent_Sheet.SheetName)

Dim agent_Range As clsWorkingRange
Set agent_Range = New clsWorkingRange

Set agent_Range.TargetRange = agent_Range.set_range(agent_Sheet.SheetName, 1)

Dim agent_Individual As clsAgent
Set agent_Individual = New clsAgent

Set agent_Individual.IDRange = agent_Range.TargetRange
        Debug.Print agent_Individual.IDRange.Address

agent_Individual.AgentID = "ObjectID(52d56512763f4a1c608b4753)"
        Debug.Print agent_Individual.AgentID
        Debug.Print agent_Individual.AgentEmail

end sub

我收到以下错误:Run-time error '1004': Method 'AgentEmail' of object 'clsAgent' failed

¸

1 个答案:

答案 0 :(得分:0)

这里的一切看起来都很好。我自己测试了它,并且我认为你应该这样做。

我唯一看错的是,如果您的agent_Range.TargetRange列少于9列,那么您在vlookup中查找的内容为Const AgentEmailCol = 9

根据您更新的问题/代码:

看起来clsWorkingRange.set_range()函数中的这一位只返回一列的范围。您无法在1列大小的范围内执行从第9列获取的vlookup。您需要确保将agent_Range.TargetRange设置为至少9列宽的内容。检查Debug.Print agent_Individual.IDRange.Address的输出以确认。