5

Мой папа увлекся астрологией, поэтому ему нужно сделать для нее расчеты - и в большинстве книг используется неменклатура Degrees Minutes Seconds - есть ли способ установить Excel или Open Office Calc для обработки вычислений в терминах DMS?

Изменить: в настоящее время мы используем Excel 2007

Edit2: я подозреваю, что установка open office / libre office будет вариантом, и, возможно, не будет никакого способа сделать это в MS Excel - поэтому, расширяя вопрос, Office 2007 предпочтительнее, но в значительной степени подойдет любая обычная электронная таблица Windows.

Редактировать 3: Очевидно, использование времени в качестве обходного пути не позволяет умножение - что необходимо в этом случае

3 ответа3

2

Из коробки Excel не поддерживает то, что вы просите. Могут быть плагины, которые помогут с этим, но вместо этого я хотел бы предложить немного обойти:

Вы можете отформатировать числа как время, чтобы Excel (и, возможно, OOo и LibreOffice) отображал и вычислял нужные значения с правильными делениями, основами и т.д.

Использование следующего пользовательского формата (Excel, OOo и LibreOffice будут иметь эквиваленты, но у меня нет копии для проверки) также отобразит их с правильными символами. [h] предотвращает сброс часов на ноль, поскольку он достигает 24, позволяя произвольно большие углы. Если вы хотите, чтобы начальные нули, то просто удвойте каждую букву.

[h]º m' s\"

Они могут быть добавлены вместе, и т.д., По мере необходимости (в конце концов, это просто цифры внизу). Однако это будет работать только в том случае, если конечный результат будет положительным; Excel не будет отображать отрицательные времена.

Если вам нужно преобразовать это значение в значение в десятичных градусах, вам просто нужно умножить на 24, потому что "день" в формате времени Excel имеет значение 1 (то есть час равен 1/24 и т.д.).

Просто убедитесь, что ячейка, в которую входит эта формула, имеет нормальное форматирование, а не время:

=A1*24

Кроме того, вы также можете извлечь определенные компоненты из значения времени, используя следующее:

=INT(A1*24)    returns degrees
=MINUTE(A1)    returns minutes
=SECOND(A1)    returns seconds
1

Нет никакого способа сказать Excel переключаться между радианами и градусами при использовании функций, таких как, например,

=SIN(DEGREES)

так что вам придется либо делать явные преобразования в каждой формуле, например,

=SIN(RADIANS(DEGREES + MINUTES/60 + SECONDS/3600))

или вы можете создать пользовательскую формулу в VBA, как

Function SinDMS(Deg As Double, Min As Double, Sec As Double) As Double

    SinDMS = Sin((3.1415 * 2 * (Deg + Min / 60 + Sec / 3600)) / 360)

End Function

(Но это будет довольно медленно, если будет много расчетов)

1

Вот два макроса, которые делают работу для моей астрономической таблицы. Значения направления (град, мин, сек) форматируются как текст. Если ячейка A1 содержит -77° 26' 09.5" , я могу ввести =DMS2Real(A1) в ячейку A2, которая затем отобразит -77.4359722222 . =Real2DMS(A2) в A3 обратит преобразование.

Введите функции макросов через Инструменты> Макросы> Упорядочить макросы> LibreOffice Basic> Стандарт (или там, где вы хотите их хранить).

Обратите внимание, что десятичные градусы не являются значениями радиана, требуемыми функциями триггера.

' Convert degrees, minutes, seconds to a single real number and back. 

' Tested in LibreOffice Calc 5.1.6.2
' Based on  https://support.microsoft.com/en-gb/help/213449/how-to-convert-degrees-minutes-seconds-angles-to-or-from-decimal-angle


Function DMS2Real(Degree_DMS As String) As Double  ' -77° 26' 09.5" -> -77.4359722222
    ' use double precision floating-point.
    Dim degrees As Double
    Dim minutes As Double
    Dim seconds As Double
    Dim sign As Integer

    ' Set degree to value appearing before "°" in argument string.
    degrees = Val(Left(Degree_DMS, InStr(1, Degree_DMS, "°") - 1))

    ' Only positive value is computed. Sign of result is changed in final statement
    '  i.e. -7° 8' 9"  means (-7 - 8/60 - 9/3600)
    If degrees < 0 Then
        degrees = degrees * -1
        sign = -1
    Else 
        sign = 1
    End If

    ' Set minutes to the value between the "°" and the "'"
    '  of the text string for the variable Degree_Deg divided by 60.
    ' The Val function converts the text string to a number.
    minutes = Val(Mid(Degree_DMS, InStr(1, Degree_DMS, "°") + 2, InStr(1, Degree_DMS, "'") - InStr(1, Degree_DMS, "°") - 2)) / 60
    ' Set seconds to the number to the right of "'" that is
    ' converted to a value and then divided by 3600.
    seconds = Val(Mid(Degree_DMS, InStr(1, Degree_DMS, "'") + 2, Len(Degree_DMS) - InStr(1, Degree_DMS, "'") - 2)) / 3600
    DMS2Real =  sign * (degrees + minutes + seconds)
End Function


Function  Real2DMS(dms)    ' -77.4359722222 -> -77° 26' 9.5"
    DIM sign As String
    ' allow for negative values
    If dms < 0 Then
        dms = dms * -1
        sign = "-"
    Else 
        sign = " "
    End If

    'Set degree to Integer of Argument Passed
    Degrees = Int(dms)
    'Set minutes to 60 times the number to the right
    'of the decimal for the variable Decimal_Deg
    Minutes = (dms - Degrees) * 60
    'Set seconds to 60 times the number to the right of the
    'decimal for the variable Minute
    Seconds = Format(((Minutes - Int(Minutes)) * 60), "0.0")
    'Returns the Result of degree conversion
    '(for example, 10.46 = 10~ 27  ' 36")
    Real2DMS = sign & Degrees & "° " & Int(Minutes) & "' " & Seconds + Chr(34)
End Function

Sub Main
End Sub

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .