Dim codeStart As String
codeStart = Evaluate("CELL(""address"",OFFSET(" & startRange & ",2,0,1,1))")
Dim agentTotal As String
agentTotal = Evaluate("CELL(""address"",INDEX(" & startRange & ":" & _
"$A$10000,MATCH("" Total*""," & startRange & ":$A$10000,0)))")
Dim numberOfCodes As String
numberOfCodes = Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")")
MsgBox numberOfCodes
当使用Msgbox
我尝试将numberOfCodes设置为几种不同的变量类型,并将CInt
放在Evaluate
前面,但没有骰子......有什么想法?
答案 0 :(得分:3)
执行以下声明时
Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")")
它返回Variant
(Evaluate
将始终返回的内容)但是,因为您正在使用ROW
(可以返回数组),它将返回{{ 1}}(如果只返回一行)或Variant/Variant(1 To 1)
(如果返回x行)。
通常情况下,Variant/Variant(1 To x, 1 To 1)
可以转换为Variant
或String
(如果值允许)但是,因为在这种情况下它是Integer
数组,所以无法转换为单个值。
在您的情况下,以下代码可行:
Variant
或
Dim numberOfCodes As Variant
numberOfCodes = Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")")
MsgBox numberOfCodes(1)
但另一种方式就是简单地说:
Dim numberOfCodes As Integer
numberOfCodes = Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")")(1)
MsgBox numberOfCodes
但是这种简化可能会更进一步。例如,您使用代码Dim numberOfCodes As Long
numberOfCodes = Range(agentTotal).Row - Range(codeStart).Row
来查找地址,但您确实在行号之后,因此您可以忽略它并将Evaluate("CELL(""address"",OFFSET(" & startRange & ",2,0,1,1))")
计算为
numberOfCodes
您还可以使用
删除numberOfCodes = Range(agentTotal).Row - Range(startRange).Row - 2
AgentTotal
只计算从numberOfCodes = Application.Match(" Total*", _
Range(startRange, "$A$10000"),0) - 3
到“总计”的行数(包括)和减去3(以排除两个标题(?)和总计)。
答案 1 :(得分:0)
我将采用这些评估,然后使用.Row并将它们传递给整数,并从codeStartRow中减去agentTotalRow。现在工作得很好。