传递字符串

时间:2013-10-17 15:07:01

标签: vba excel-vba excel

我需要在VBA中执行此excel语句

IF(AND(X2="FMS",O2>=0),1,0)

这就是我在VBA中调用sub的方式,我传递了变量“FMS”

Call passFunction("FMS")

Sub的声明如下

Sub passFunction(var As Variant) 
    Worksheets("Sheet1").range("A1").FormulaR1C1 = "=IF(AND(X2=" & var & ",O2>=0),1,0)"
End Sub

然而,在执行函数之后,这是我在Excel中得到的输出

IF(AND(X2=FMS,O2>=0),1,0)

请注意变量FMS

缺少引号

3 个答案:

答案 0 :(得分:2)

您实际上没有传递引号,您正在使用字符串并传入:FMS

Escaping quotes in a string in VB6

您可以使用“”将引号插入字符串中,例如:(来自链接)

dim sometext as String = "Hello ""Frank"" how are you?"

所以你想要:

Call passFunction("""FMS""")

或者您更改passFunction以在其中添加引号:

Sub passFunction(var As Variant) 
    Worksheets("Sheet1").range("A1").FormulaR1C1 = "IF(AND(X2=""" & var & """,O2>=0),1,0)"
End Sub

答案 1 :(得分:2)

尝试

wksheet.range("A1").Formula = 
"=IF(AND(X2=" & Chr(34) & var & Chr(34) & "," & Range("O2").Address & ">=0),1,0)"

<强>更新

如果var可以是Integer,那么从这一行开始

var = IIf(VarType(var) = vbString, Chr(34) & CStr(var) & Chr(34), CLng(var))

并将上述行修改为

 wksheet.range("A1").Formula = 
"=IF(AND(X2=" & var & "," & Range("O2").Address & ">=0),1,0)"

如果我们想要与整数进行比较,这将有效。如果我们想要抛出一个错误,如果它是一个整数,那么我们可以做

var = IIf(VarType(var) = vbString, CVErr, CLng(var))

如果它可以是整数以外的任何其他东西,那么我们将其概括为

Select Case VarType(var)
    case vbString
        var=Chr(34) & CStr(var) & Chr(34)
    case vbLong, vbInteger
        var=CLng(var) ' Or CVErr depending on what we want to do
    case else
        var=CVErr
End Select
在公式之前

备注:

  • 最后一种情况使var成为N/A并会抛出错误
  • 即使Integer中的VBA类型也会内部投放到Long。因此,最好先使用Long

答案 2 :(得分:1)

PassFunction应该是

Sub PassFunction(var As String)
    Sheets("Sheet1").Range("A1").Formula = "=IF(AND(X2=""" & var & """,O2>=0),1,0)"
End Sub

=之前删除If,除非您不希望计算它。

您可以通过用另一个双引号括起引号来转义字符串中的双引号。

另外,如果要传递字符串变量而不是将参数类型更改为String。字符串比Variant更快。