NavList:
A Community Devoted to the Preservation and Practice of Celestial Navigation and Other Methods of Traditional Wayfinding
Excel functions for DMS - decimal conversion - second try
From: Michael Dorl
Date: 2004 Nov 19, 10:47 -0600
From: Michael Dorl
Date: 2004 Nov 19, 10:47 -0600
George pointed out some problems with my previous functions for dms/decimal conversion functions for Excel so here's another try. I believe the -0 12 34 problem has been corrected and the DECtoDMS function now does the right things with negative angles. Also I added some code to prevent nonsense like 1 60 60 from arising. They passed my cursory testing so let's see what George can find now :-) Some comments first.... 1) To add the functions from excel TOOLS - MACROS - VISUAL BASIC once Visual basic starts, you may have to add a Module if you don't already have one in your sheet INSERT MODULE 2) Set the format of any cell containing a dms angle to text (FORMAT CELLS) otherwise you will have trouble entering angles starting with a - sign. Probably you want to set the whole column or row. 3) You can add leading spaces to dms angle BUT only one space may separate the components; no trailing space are allowed. 4) a dms angle must have exactly three components. If not, the function will return an error. So here are the functions Function DMStoDEC(s As String) As Double Dim parts() As String Dim Degrees As Integer Dim Minutes As Integer Dim Seconds As Double Dim sign As Integer Dim zzzz As String s = LTrim(s) parts = Split(s, , , vbBinaryCompare) If UBound(parts) <> 2 Then ' 2 because array starts at 0 Error (9999) End If Degrees = parts(0) If Degrees < 0 Then sign = -1 Degrees = -Degrees Else If Left(s, 1) = "-" Then sign = -1 Else sign = 1 End If End If Minutes = parts(1) Seconds = parts(2) DMStoDEC = sign * (Degrees + Minutes / 60# + Seconds / 3600#) End Function Function DECtoDMS(A As Double) As String Dim Degrees As Integer Dim Minutes As Integer Dim Seconds As Double Dim sign As String If A < 0 Then A = -A sign = "-" Else sign = "" End If Degrees = Int(A) A = 60 * (A - Degrees) Minutes = Int(A) Seconds = 60# * (A - Minutes) Seconds = Round(Seconds, 3) Seconds = Int(Seconds * 1000#) Seconds = Seconds / 1000# If Seconds >= 60 Then Seconds = Seconds - 60 Minutes = Minutes + 1 If Minutes >= 60 Then Minutes = Minutes - 60 Degrees = Degrees + 1 End If End If DECtoDMS = sign & Degrees & " " & Minutes & " " & Seconds End Function