Ларс столкнулся с проблемой при использовании функции ATAN2 в макросе. Он разработал довольно сложный набор инструкций, только для того, чтобы VBA выдало ошибку при попытке использовать функцию ATAN2. Он смог упростить макрос, чтобы воссоздать проблему:

Sub Test()

Dim A As Double

Dim C As Double     Dim E As Double

A = 5908     C = 0     C = -C     E = 180 / WorksheetFunction.Pi

MsgBox E * WorksheetFunction.Atan2(C, A)

End Sub

Когда код выполняется, ошибка генерируется в строке, где выполняется ATAN2. Ларсу было интересно, что именно вызвало проблему.

Проблема, по-видимому, связана с тем, как вы управляете переменной C. Сначала вы определяете C как ноль, а затем отрицаете это значение. Нет такой вещи, как отрицательный ноль, и когда вы пытаетесь отрицать значение, Excel, по-видимому, блокируется, когда это значение впоследствии используется в формуле.

Один из способов решения проблемы — просто изменить способ преобразования C для учета нулевых значений. Измените макрос так, чтобы он выглядел так:

Sub Test()

Dim A As Double

Dim C As Double     Dim E As Double

A = 5908     C = 0     If C <> 0 Then C = -C     E = 180 / WorksheetFunction.Pi

MsgBox E * WorksheetFunction.Atan2(C, A)

End Sub

Теперь макрос будет работать нормально, потому что вы выполняете преобразование на C, только если оно не равно нулю.

Также кажется, что ошибка возникает только в том случае, если C определен как значение с плавающей запятой. Если вы измеряете C как целое число, то исходный макрос не генерирует ошибку. Это может указывать на то, что проблема связана с тем, как внутреннее представление несуществующего отрицательного нуля с плавающей запятой. Поскольку тип данных Integer имеет дело исключительно с целыми числами, такой проблемы с представлением не возникает.

Вы также можете избавиться от проблемы, если объявите C как тип данных Variant или полностью удалите строку объявления (что означает, что VBA по умолчанию объявляет C как вариант при первом использовании).

_Примечание: _

Если вы хотите узнать, как использовать макросы, описанные на этой странице (или на любой другой странице на сайтах ExcelTips), я подготовил специальную страницу, содержащую полезную информацию.

link: / excelribbon-ExcelTipsMacros [Щелкните здесь, чтобы открыть эту специальную страницу в новой вкладке браузера].

ExcelTips — ваш источник экономичного обучения Microsoft Excel.

Этот совет (2892) применим к Microsoft Excel 97, 2000, 2002 и 2003.