【问题标题】:Euclidian distance VBA (Transpose function in VBA)欧几里得距离 VBA(VBA 中的转置函数)
【发布时间】:2026-01-16 11:00:02
【问题描述】:

我正在尝试创建一个计算 2 点之间距离的函数,但是当我使用 mmult 和 transpose 函数时出现错误,而我使用 sumpriduct 函数它工作得很好,但我只是想了解原因

你能帮帮我吗?

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

【问题讨论】:

  • 可能是因为您要获得一个数组函数,所以您是否将其作为数组公式输入 - 带括号 - ?
  • 是的,我解决它的方法是使用 VarType() 函数,我注意到在使用 mmult 时,它返回一个矩阵数据类型,所以我无法应用平方根或任何其他转换,所以我简单地对我的矩阵求和,然后我可以应用平方根。当然这相当于使用 sumproduct()。

标签: vba excel macros


【解决方案1】:

请记住,从范围创建的数组始终是二维的,如果您转置它,数组仍然是二维的。例如。首先是 20x1,转置后是 1x20。因此,您应该将数组中的值作为二维数组传递;

Application.Transpose(r)(1)

【讨论】:

  • 其实我已经考虑过你说的但我没有工作:distancia = Application.MMult(r, Application.Transpose(r)) ^ (1 / 2)
  • 我可以通过直接处理我的范围来处理这个问题,而不是通过循环 rangoA(i,j) 而不是 x=rangoA 将其添加到矩阵中