2016-12-16 110 views
1

我在创建一个函数来计算2点之间的距离,但是当我使用mmult和转置函数时,出现错误,而我使用了sumpriduct函数,它完美地工作,但我只是想了解为什么欧几里德距离VBA(移调函数在VBA中)

你能帮我吗?

Function distancia(RangoA As Range, RangoB As Range) As Long 
Dim s() As Variant 
Dim t() As Variant 
Dim r() As Variant 
    s = RangoA 
    t = RangoB 
    ReDim r(UBound(s), 1) 
    For i = 1 To UBound(s) 
    r(i, 1) = s(i, 1) - t(i, 1) 
Next i 
distancia = Application.MMult(r, Application.Transpose(r)) 


End Function 
+0

可能是因为你要获得一个数组函数,你是否将它作为数组公式输入 - 使用括号? – Sgdva

+1

是的,我做了什么来解决它是使用VarType()函数,我注意到当使用mmult时,它返回一个矩阵数据类型,所以我无法应用平方根或任何其他转换,所以我简单地总结我的矩阵然后我可以应用平方根。当然这相当于使用sumproduct()。 – Moreno

回答

2

请记住,从范围创建的数组总是2D,如果转置它,数组仍然是2D。例如。首先是20x1,转换后是1x20。你应该从二维数组中传递数组中的值,因此;

Application.Transpose(r)(1) 
+0

其实我已经考虑了你在说什么,但我没有工作: 'distancia = Application.MMult(r,Application.Transpose(r))^(1/2)' – Moreno

+0

这是因为你没有复制我的代码 –

+0

我可以通过直接使用我的范围来处理这个问题,而不是将它应用到矩阵中,我的意思是通过循环rangoA(i,j)而不是x = rangoA – Moreno