0

我需要在 VBA 中执行这个 excel 语句

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

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

Call passFunction("FMS")

子声明如下

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 缺少引号

4

3 回答 3

2

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

在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
于 2013-10-17T15:18:27.913 回答
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

在公式之前。

笔记:

  • 最后一种情况是varasN/A并且会抛出一个错误
  • 甚至 in 的类型IntegerVBA内部也被强制转换为Long. 所以最好先使用Long
于 2013-10-17T15:20:43.770 回答
1

You PassFunction should be

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

Remove the = from before If unless you do not want it to be calculated.

You can escape the double quotes in a string by wrapping the quotes with another double quote.

Also, if you are passing a String Variable than change the parameter type to String. Strings are faster than Variant.

于 2013-10-17T15:22:35.490 回答