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到格式化或包含数据的最右侧列,格式化或包含数据的最低行。