Excel VBA函数采取2种不同的数据types,并通过类模块的集合进行循环

我有以下子工作,但获得#VALUE! 更改后的错误分为function。
工作分项如下

Sub Get_Tier2(ByVal myCategory As String, ByVal myMSRP As Double) Dim ProductTiers As Collection Dim pt As ProductTier Dim result As String Dim CIDTierCount As Integer CIDTierCount = ThisWorkbook.Worksheets("CIDTier").Range("A:A").CurrentRegion.Rows.Count Set ProductTiers = New Collection For i = 2 To CIDTierCount Set pt = New ProductTier pt.Category = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("B") pt.Tier = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("C") pt.MSRP_Low = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("D") pt.MSRP_High = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("E") ProductTiers.Add pt Next For Each pt In ProductTiers If StrComp(pt.Category, myCategory) = 0 And pt.MSRP_Low < myMSRP And myMSRP < pt.MSRP_High Then result = pt.Tier() MsgBox result Exit Sub Else 'do nothing End If Next End Sub 

当我改变子function,并尝试在Excel中使用,它会返回我#VALUE! 在Excel中

 Function Get_Tier(ByVal myCategory As String, ByVal myMSRP As Double) As String Dim ProductTiers As Collection Dim pt As ProductTier Dim result As String Dim CIDTierCount As Integer CIDTierCount = ThisWorkbook.Worksheets("CIDTier").Range("A:A").CurrentRegion.Rows.Count Set ProductTiers = New Collection For i = 2 To CIDTierCount Set pt = New ProductTier pt.Category = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("B") pt.Tier = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("C") pt.MSRP_Low = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("D") pt.MSRP_High = ThisWorkbook.Worksheets("CIDTier").Rows(i).Columns("E") ProductTiers.Add pt Next For Each pt In ProductTiers If StrComp(pt.Category, myCategory) = 0 And pt.MSRP_Low < myMSRP And myMSRP < pt.MSRP_High Then Get_Tier = pt.Tier() Exit Function Else Get_Tier = "no match" End If Next End Function 

Class Module ProductTier如下所示

 Private pCategory As String Private pTier As String Private pMSRP_Low As Double Private pMSRP_High As Double Public Property Get Category() As String Category = pCategory End Property Public Property Let Category(Value As String) pCategory = Value End Property Public Property Get Tier() As String Tier = pTier End Property Public Property Let Tier(Value As String) pTier = Value End Property Public Property Get MSRP_Low() As String MSRP_Low = pMSRP_Low End Property Public Property Let MSRP_Low(Value As String) pMSRP_Low = Value End Property Public Property Get MSRP_High() As String MSRP_High = pMSRP_High End Property Public Property Let MSRP_High(Value As String) pMSRP_High = Value End Property 

和CIDTier选项卡上的数据
B栏:ProductA
C列:1级
D栏:0
E栏:300

罪魁祸首

 CIDTierCount = ThisWorkbook.Worksheets("CIDTier").Range("A:A").CurrentRegion.Rows.Count 

如果你在这一行上抛出一个debugging标记并打印什么

 ThisWorkbook.Worksheets("CIDTier").Range("A:A").CurrentRegion.Rows.Count 

返回,你得到1048576 。 这将溢出Integer,你试图把它放进去。

可能的scheme

从你在做什么,看起来你想要一个行数,你可以尝试改变代码如下:

 CIDTierCount = Worksheets("CIDTier").UsedRange.Rows.Count 

为什么这个工作

在Excel中,每个工作表都有一个被定义为UsedRange的范围。 此范围从A1到格式化或包含数据的最右侧列,格式化或包含数据的最低行。