Функция Excel VBA работает в США, но не во Франции

Следующая пользовательская функция работает для сотрудников в США, но когда ее используют сотрудники во Франции, они получают #ЗНАЧ! ошибка, говорящая о том, что значение в формуле имеет неправильный тип данных. Это даже не должно быть возможно, потому что функция принимает варианты.

К вашему сведению, цель этой функции — округлить значение до соответствующего количества значащих цифр в соответствии с нашими бизнес-правилами — встроенная функция ОКРУГЛ не делает этого правильно для нас.

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 21.12.2022 15:37

Они изменили свои настройки Excel или настройки региона своего компьютера?

Rory 21.12.2022 15:46

@FlexYourData, мы все используем Office 365

Connor Baush 21.12.2022 16:59

@Rory Во Франции они поменяли настройки Excel, а не настройки компьютера, поэтому между ними могут возникнуть некоторые разногласия.

Connor Baush 21.12.2022 16:59
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
4
61
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

В «Параметры Excel»> «Дополнительно» вы можете изменить разделители во время тестирования.

Здесь я изменил свои настройки (я в США) на те, которые используются во Франции:

Ваша функция, кажется, работает для меня, поэтому я задаюсь вопросом, является ли #VALUE! ошибка, которую они получают, заключается в том, что они пытаются выполнить некоторые вычисления, используя результат. Поскольку вместо запятой там точка, это будет проблемой. Кроме того, поскольку результатом является текст, такие функции, как СУММ, СРЗНАЧ, МИН и т. д., не дадут правильных результатов.

Формула округления до значащих цифр:

=ROUND(value,figures-(1+INT(LOG10(ABS(value)))))

Таким образом, вам может быть удобнее сохранить это как функцию LAMBDA в диспетчере имен, как я сделал здесь, и научить пользователей использовать форматы ячеек для добавления любых начальных или конечных нулей.

Да, во Франции сделали, по сути, обратное тому, что сделали вы. Я подозреваю, что есть какая-то проблема с их настройками Excel, не согласующимися с настройками их компьютера. Ваш =ROUND(значение,цифры-(1+INT(LOG10(ABS(значение)))))) определенно может работать, я думаю, что это может быть обходной путь, который кто-то уже пытается.

Connor Baush 21.12.2022 17:01

И ошибка VALUE не возникает из-за каких-либо дополнительных вычислений, она просто исходит из них с использованием = ROUNDSF (значение, цифры) - который отлично отображается, когда я смотрю на него, но получает для них ошибку.

Connor Baush 21.12.2022 17:04

Проблема в том, что их системные настройки по-прежнему используют запятые для десятичных знаков, а не точки. Таким образом, несмотря на то, что Excel отображает точки, потому что они изменили свои настройки, вычисления в фоновом режиме выполняются с запятыми. Итак, проблема в VBA, где есть жестко запрограммированные периоды, такие как:

numround = WorksheetFunction.Text(num, "." & _

и

fmt_left = "0."

Либо замена их запятыми, либо изменение системных настроек на американский английский вместо европейского английского решает проблему.

Спасибо Рори в комментарии выше за идею.

Ответ принят как подходящий

Вы можете использовать

Application.International (xlDecimalSeparator)

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

Другие вопросы по теме

Выбрать несколько листов для печати одновременно
Подписание не работает с сертификатом подписи кода DigiCert EV
Можно использовать dlookup на паблике в vba?
VBA Изменить размер формы в соответствии с данными временного значения ячейки
Если текст затенен, я хочу изменить цвет текста на красный и отменить тень
Переименуйте файл, прежде чем прикреплять его к электронному письму Outlook
Вложенный макрос записывает текущую защиту документа, позволяет найти и заменить, а затем при необходимости повторно применяет защиту - получая ошибку времени выполнения 4605
VBA excel фильтрует совпадающую строку перед 1-м '_' и совпадающую строку после 2-го '_'
Обновите существующий макрос поиска и замены (на уровне папки), чтобы он также работал с подпапками, и хотел бы, чтобы всплывающее окно разрешало прямой ввод адреса папки, если это возможно
Вставить номер страницы с добавлением некоторого количества страниц