将整数结果传递给整数类型变量时键入不匹配

时间:2017-04-15 20:13:55

标签: vba excel-vba excel

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前面,但没有骰子......有什么想法?

2 个答案:

答案 0 :(得分:3)

执行以下声明时

Evaluate("ROW(" & agentTotal & ")-ROW(" & codeStart & ")")

它返回VariantEvaluate将始终返回的内容)但是,因为您正在使用ROW(可以返回数组),它将返回{{ 1}}(如果只返回一行)或Variant/Variant(1 To 1)(如果返回x行)。

通常情况下,Variant/Variant(1 To x, 1 To 1)可以转换为VariantString(如果值允许)但是,因为在这种情况下它是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。现在工作得很好。