一、采用替换算法
懒人办法,直接通过Excel替换功能完成计算。假设Excel中有这样一串数据:
现希望将它变成小数形式。打开Excel替换对话框,不断进行替换——
- 将
°
替换成+
- 将
"E
(或''E
)替换成/3600
。"N
同理。 - 将
'E
替换成/60
。'N
同理。 - 将
'
替换成/60+
。 - 将
119+
替换成=119+
。30+
同理。也可以用Excel的CONCAT
函数将等号与每个单元格的内容连接起来。
二、采用VBA
运行以下宏即可。
' transform format for longtitude and latitude
Function min(a, b)
If a > b Then
min = b
Else
min = a
End If
End Function
Sub long_la()
Dim Rng As Range
Set Rng = Selection
For Each Cell In Rng
' No data
If Cell.Value = "" Then
Cell.Value = "NA"
End If
' Has data
If Cell.Value <> "NA" Then
Dim Str As String
Dim temp As Integer
Dim cho As Integer
Dim Res As Double
Str = Cell.Value
' °
temp = InStr(1, Str, "°")
If temp <= 0 Then
cho = MsgBox("行" + CStr(Cell.Row) + ",列" + _
CStr(Cell.Column) + " :没有符号'°'", vbCritical)
GoTo fail
End If
Res = Val(Mid(Str, 1, temp - 1))
Str = Mid(Str, temp + 1)
'分
Dim temp1 As Integer
Dim temp2 As Integer
Dim temp3 As Integer
temp1 = InStr(1, Str, "'")
If temp1 <= 0 Then
temp1 = 999
End If
temp2 = min(temp, InStr(1, Str, "‘"))
If temp2 <= 0 Then
temp2 = 999
End If
temp3 = min(temp, InStr(1, Str, "’"))
If temp3 <= 0 Then
temp3 = 999
End If
temp = min(min(temp1, temp2), temp3)
If temp <> 999 Then
Res = Res + Val(Mid(Str, 1, temp - 1)) / 60
End If
Str = Mid(Str, temp + 1)
'秒
Dim temp4 As Integer
Dim temp5 As Integer
Dim temp6 As Integer
temp1 = InStr(1, Str, """")
If temp1 <= 0 Then
temp1 = 999
End If
temp2 = InStr(1, Str, "’‘")
If temp2 <= 0 Then
temp2 = 999
End If
temp3 = InStr(1, Str, "‘’")
If temp3 <= 0 Then
temp3 = 999
End If
temp4 = InStr(1, Str, "‘‘")
If temp4 <= 0 Then
temp4 = 999
End If
temp5 = InStr(1, Str, "’’")
If temp5 <= 0 Then
temp5 = 999
End If
temp6 = InStr(1, Str, "''")
If temp6 <= 0 Then
temp6 = 999
End If
temp = min(min(min(min(min(temp1, temp2), temp3), temp4), temp5), temp6)
If temp <> 999 Then
Res = Res + Val(Mid(Str, 1, temp - 1)) / 3600
End If
Cell.Value = Res
End If
Next
fail:
End Sub