Excel 当计算结果为零时,如何跳过一行?

Excel 当计算结果为零时,如何跳过一行?,excel,excel-formula,Excel,Excel Formula,我有一个关于excel的问题…无论如何,这是我的数据: 我想通过相互比较来计算这4个位置的最短距离,但当它满足相同的坐标时,我想跳过计算…例如,我想知道位置A和位置B、C之间的最短距离,或者D等等,但我不想将位置A和它本身进行比较,因为这样会得到零结果……你知道如何使用excel公式来做吗?无论如何,第二列是纬度,第三列是经度,我想把结果放在经度列的右边 下面是我想要得到结果的公式: =INDEX(6370.97327862*((2*ASIN(SQRT((SIN((RADIANS(C3)-RA

我有一个关于excel的问题…无论如何,这是我的数据:

我想通过相互比较来计算这4个位置的最短距离,但当它满足相同的坐标时,我想跳过计算…例如,我想知道位置A和位置B、C之间的最短距离,或者D等等,但我不想将位置A和它本身进行比较,因为这样会得到零结果……你知道如何使用excel公式来做吗?无论如何,第二列是纬度,第三列是经度,我想把结果放在经度列的右边

下面是我想要得到结果的公式:

=INDEX(6370.97327862*((2*ASIN(SQRT((SIN((RADIANS(C3)-RADIANS(C3:C6))/2)^2)+COS(RADIANS(C3))*COS(RADIANS(C3:C6))*(SIN((RADIANS(D3)-RADIANS(D3:D6))/2)^2))))),MATCH(MIN(SQRT((C3:C6)^2+(D3:D6)^2)),SQRT((C3:C6)^2+(D3:D6)^2),-1),1)
非常感谢您的帮助,谢谢

编辑:

以下是作为文本的输入:

location A  15.20613944 120.5797483

Location B  15.21214563 121.777773

Location C  15.30023000 120.6565657

Location D  15.28993333 120.9067895

如果您想要一个严格的公式:

=MIN(IFERROR(1/(1/(ROUND(ACOS(SIN(RADIANS($B$2:$B$5))*SIN(RADIANS(B2))+COS(RADIANS($B$2:$B$5))*COS(RADIANS(B2))*COS((RADIANS(C2))-(RADIANS($C$2:$C$5))))*3443.89849,3))),1E+99))
根据不同的版本,退出编辑模式时可能需要使用Ctrl-Shift-Enter而不是Enter


如果您想要稍微简单一点的东西,请使用vba:

基于中的用户定义函数,我添加了引用多个函数的功能:

Function CrowFlies(dlat1 As Range, dlon1 As Range, dlat2 As Double, dlon2 As Double) As Double()
    Pi = Application.Pi()
    
    
    earthradius = 3443.89849  'nautical miles
    
    Dim dlatArr() As Variant
    dlatArr = dlat1.Value
    
    Dim dlonarr() As Variant
    dlonarr = dlon1.Value
    
    Dim out() As Double
    ReDim out(1 To UBound(dlonarr, 1))
    Dim i As Long
    For i = 1 To UBound(dlonarr, 1)
        
        lat1 = dlatArr(i, 1) * Pi / 180
        lat2 = dlat2 * Pi / 180
        lon1 = dlonarr(i, 1) * Pi / 180
        lon2 = dlon2 * Pi / 180
    
        cosX = Sin(lat1) * Sin(lat2) + Cos(lat1) _
          * Cos(lat2) * Cos(lon1 - lon2)
        out(i) = earthradius * Application.Acos(cosX)
    Next i
    
    CrowFlies = out
End Function
然后是一个简单的调用:

=MIN(IFERROR(1/(1/ROUND(CrowFlies($B$2:$B$5,$C$2:$C$5,B2,C2),3)),1E+99))
根据不同的版本,退出编辑模式时可能需要使用Ctrl-Shift-Enter而不是Enter


此函数接收两个位置输入(目标行的
Lat
Lon
),然后将这些值与表中存在的所有其他坐标进行比较。输出将显示最近的位置以及由列分隔的距离(n mi)

注意:这是假设您的纬度完整列表存在于
列C
列D


公共函数最短距离位置(Lat作为范围,Lon作为范围)作为字符串
变暗lr为长
尺寸xLat作为范围,xLon作为范围
lr=范围(“A”和Rows.Count).End(xlUp).Row
双精度Pi
将变暗转换为双精度
调暗Temp1为双精度,Temp2为双精度,Temp3为双精度
调暗Temp4为双精度,Temp5为双精度,Temp6为双精度
暗温回答为双温
将最短距离设置为双精度
作为字符串的Dim位置
Pi=工作表函数.Pi
换算=3443.8985
最短距离=4000
对于i=2至lr
如果我坐在那排
设置xLat=范围(“B”和“i”)
设置xLon=范围(“C”和“i”)
Temp1=Sin(纬度*Pi/180)
Temp2=Sin(xLat*Pi/180)
Temp3=Cos(纬度*Pi/180)
Temp4=Cos(xLat*Pi/180)
Temp5=Cos(xLon*Pi/180-Lon*Pi/180)
Temp6=工作表函数.Acos(Temp1*Temp2+Temp3*Temp4*Temp5)
临时回答=转换*临时回答6
如果温度回答<最短距离,则
最短距离=临时应答
位置=范围(“A”和“i”)
如果结束
如果结束
接下来我
最短距离位置=位置&“,”和最短距离
端函数


如果只需要距离,可以修改最后一行。我只是想说明一下,你可以得到最小距离和位置(似乎你都想要)。

你会用什么公式来计算位置A和位置b之间的距离?你打算如何比较A和b,A和C,A和D?你用什么公式得出的结果是零?我想比较,例如,a和B之间的最短距离,C,把结果放在经度列的右边…问题是当我想这样做时,它会给出零结果,因为公式会使位置A与自身进行比较…我还想比较位置B和A,C,D之间的最短距离,把结果放在经度栏的右边,请展示你尝试过的公式。我在平面几何中问的原因是很久以前的事了,但你不能使用毕达哥拉斯定理:
SQRT((Bx Ax)^2+(By Ay)^2)
?通常我并不介意被超越,但这是一个艰难的过程,我根本没有注意到你已经发布了一个解决方案哈哈。在公式解决方案上也做得很好。这个花了我很多时间研究。我只是把方程引导成一个循环。猜测你的解决方案会在更大的数据集上破坏我的(时间方面的)。很想知道解决方案输出中微小差异的来源thoProb地球半径的差异(3443.89849与我在网上找到的来源的3443.8985相比)你好,当我尝试按照你的第一个例子使用这个excel公式时,我得到了1E+99:=MIN(I误差(1/(1/(圆形)(ACOS)(SIN(弧度($B$2:$B$5))*SIN(弧度(B2))+COS(弧度($B$2:$B$5))*COS(弧度(B2))*COS((弧度(C2))-(弧度($C$2:$C$5)))*3443.89849,3)),1E+99))@DeadlyKitten999他的方程式对我很有用。您是否用CTRL+SHIFT+ENTERlol确认了公式对不起,我的错误..如果您理解了公式,您可以为临时变量指定更有意义的名称。我在建立这个方程时根本不了解方程的工作原理。相反,我只是在现有方程上实现了一个循环,以查找两点之间的距离。thx可提供帮助!!超级的!!:D
Public Function Shortest_Distance_Location(Lat As Range, Lon As Range) As String

Dim lr As Long
Dim xLat As Range, xLon As Range
lr = Range("A" & Rows.Count).End(xlUp).Row

Dim Pi As Double
Dim Convert As Double
Dim Temp1 As Double, Temp2 As Double, Temp3 As Double
Dim Temp4 As Double, Temp5 As Double, Temp6 As Double
Dim Temp_Answer As Double
Dim Shortest_Distance As Double
Dim Location As String

Pi = WorksheetFunction.Pi
Convert = 3443.8985
Shortest_Distance = 4000

For i = 2 To lr
    If i <> Lat.Row Then
        
        Set xLat = Range("B" & i)
        Set xLon = Range("C" & i)
        
        Temp1 = Sin(Lat * Pi / 180)
        Temp2 = Sin(xLat * Pi / 180)
        Temp3 = Cos(Lat * Pi / 180)
        Temp4 = Cos(xLat * Pi / 180)
        Temp5 = Cos(xLon * Pi / 180 - Lon * Pi / 180)
        Temp6 = WorksheetFunction.Acos(Temp1 * Temp2 + Temp3 * Temp4 * Temp5)
        Temp_Answer = Convert * Temp6
        
        If Temp_Answer < Shortest_Distance Then
            Shortest_Distance = Temp_Answer
            Location = Range("A" & i)
        End If
        
    End If
Next i

Shortest_Distance_Location = Location & ", " & Shortest_Distance
        
End Function