Следующая пользовательская функция работает для сотрудников в США, но когда ее используют сотрудники во Франции, они получают #ЗНАЧ! ошибка, говорящая о том, что значение в формуле имеет неправильный тип данных. Это даже не должно быть возможно, потому что функция принимает варианты.
К вашему сведению, цель этой функции — округлить значение до соответствующего количества значащих цифр в соответствии с нашими бизнес-правилами — встроенная функция ОКРУГЛ не делает этого правильно для нас.
Function ROUNDSF(num As Variant, sigs As Variant) As String
Dim exponent As Integer
Dim decplace As Integer
Dim fmt_left As String
Dim fmt_right As String
Dim numround As Double
If IsNumeric(num) And IsNumeric(sigs) Then
If sigs < 1 Then
' Return the " #NUM " error
ROUNDSF = CVErr(xlErrNum)
Else
numround = WorksheetFunction.Text(num, "." & _
String(sigs, "0") & "E+000")
If num = 0 Then
exponent = 0
Else
'Round is needed to fix a ?truncation?
'problem when num = 10, 100, 1000, etc.
exponent = Round(Int(Log(Abs(numround)) / Log(10)), 1)
End If
decplace = (sigs - (1 + exponent))
If decplace > 0 Then
fmt_right = String(decplace, "0")
fmt_left = "0."
Else
fmt_right = ""
fmt_left = "0"
End If
ROUNDSF = WorksheetFunction.Text(numround, _
fmt_left & fmt_right)
End If
Else
' Return the " #N/A " error
ROUNDSF = CVErr(xlErrNA)
End If
End Function
Я подумал, что это проблема, связанная с местными настройками, где в США мы разделяем десятичные дроби точкой (1,5), а во Франции — запятой (1,5). Однако во Франции они изменили свои настройки Excel, чтобы они соответствовали правилам США. Я также вижу, что в то время как в США мы разделяем аргументы запятой ROUNDSF(arg1, arg2) - во Франции они разделяются точкой с запятой ROUNDSF(arg1; arg2), однако Excel автоматически переводит эти запятые в точки с запятой, когда французы открывают та же самая рабочая тетрадь, что и у американцев. Я подозреваю, что есть ЧТО-ТО вроде такой локальной настройки, которая вызывает эту проблему, но без полета во Францию и работы на французской локальной машине мне было бы очень сложно отладить это.
Они изменили свои настройки Excel или настройки региона своего компьютера?
@FlexYourData, мы все используем Office 365
@Rory Во Франции они поменяли настройки Excel, а не настройки компьютера, поэтому между ними могут возникнуть некоторые разногласия.


В «Параметры Excel»> «Дополнительно» вы можете изменить разделители во время тестирования.
Здесь я изменил свои настройки (я в США) на те, которые используются во Франции:
Ваша функция, кажется, работает для меня, поэтому я задаюсь вопросом, является ли #VALUE! ошибка, которую они получают, заключается в том, что они пытаются выполнить некоторые вычисления, используя результат. Поскольку вместо запятой там точка, это будет проблемой. Кроме того, поскольку результатом является текст, такие функции, как СУММ, СРЗНАЧ, МИН и т. д., не дадут правильных результатов.
Формула округления до значащих цифр:
=ROUND(value,figures-(1+INT(LOG10(ABS(value)))))
Таким образом, вам может быть удобнее сохранить это как функцию LAMBDA в диспетчере имен, как я сделал здесь, и научить пользователей использовать форматы ячеек для добавления любых начальных или конечных нулей.
Да, во Франции сделали, по сути, обратное тому, что сделали вы. Я подозреваю, что есть какая-то проблема с их настройками Excel, не согласующимися с настройками их компьютера. Ваш =ROUND(значение,цифры-(1+INT(LOG10(ABS(значение)))))) определенно может работать, я думаю, что это может быть обходной путь, который кто-то уже пытается.
И ошибка VALUE не возникает из-за каких-либо дополнительных вычислений, она просто исходит из них с использованием = ROUNDSF (значение, цифры) - который отлично отображается, когда я смотрю на него, но получает для них ошибку.
Проблема в том, что их системные настройки по-прежнему используют запятые для десятичных знаков, а не точки. Таким образом, несмотря на то, что Excel отображает точки, потому что они изменили свои настройки, вычисления в фоновом режиме выполняются с запятыми. Итак, проблема в VBA, где есть жестко запрограммированные периоды, такие как:
numround = WorksheetFunction.Text(num, "." & _
и
fmt_left = "0."
Либо замена их запятыми, либо изменение системных настроек на американский английский вместо европейского английского решает проблему.
Спасибо Рори в комментарии выше за идею.
Вы можете использовать
Application.International (xlDecimalSeparator)
чтобы получить строку для десятичного разделителя вместо того, чтобы жестко кодировать ее как "."
Какую версию Excel вы оба используете?