有点晚了,但有办法在不循环返回数组:
Public Function f(v)
v = Application.Transpose(v) ' 2D to 1D because Join needs 1D array
v = Join(v, ";") ' "1½;2½"
v = Replace(v, "½", ".5") ' "1.5;2.5"
f = Evaluate("{" & v & "}") ' {1.5;2.5}
End Function
更复杂一点,如果它需要为行或单细胞工作过:
Public Function f(v)
Let v = v ' Range to 2D Array or value
If IsArray(v) Then
If UBound(v, 1) = 1 Then
v = Application.Index(v, 1, 0) ' 2D row array to 1D
v = "{" & Join(v, ",") & "}" ' Join needs 1D array
Else
v = Application.Transpose(v) ' 2D column array to 1D
v = "{" & Join(v, ";") & "}" ' ; is row separator
End If
End If
v = Replace(v, "½", ".5") ' "{1.5;2.5}"
f = Evaluate(v) ' {1.5;2.5}
End Function
但最好最快的方法是最有可能与For循环:
Public Function f(v)
Let v = v ' Range to 2D Array or value
If Not IsArray(v) Then f = Val(Replace(v, "½", ".5")): Exit Function
Dim r As Long, c As Long
For r = 1 To UBound(v, 1)
For c = 1 To UBound(v, 2)
v(r, c) = Val(Replace(v(r, c), "½", ".5"))
Next c
Next r
f = v
End Function
在Excel 2016年,TEXTJOIN
函数可用于平坦化的任何范围,以阵列(未测试):
Public Function f(r As Range)
f = r.Worksheet.Evaluate("TEXTJOIN(("","",1," & r.Address & ")") ' "1½,2½"
f = Replace(f, "½", ".5") ' "1.5,2.5"
f = Evaluate("{" & f & "}") ' {1.5,2.5}
End Function
你传入一个'Range'到你的UDF它接受的变体。然后你的UDF试图将'Variant/Range'乘以2并失败(因为你不能对范围进行算术运算)。 – YowE3K
如何克服? – danKV
我认为你需要单独处理'value'中的每个单元格,将结果放入一个Variant数组(它具有与源范围相同的形状),然后将该Variant数组作为UDF的结果返回。但是,除非您可以限制用户输入以及结果会发生什么 - 例如,这会变得困难。你需要允许输入'myUserDefinedFkt((A1:A2,B7))',你是否需要允许使用UDF的结果而不用'SUM'等。 – YowE3K