Разделитель Ultimate 1000 с использованием VBA

Aug 16 2020

Я пытаюсь получить решение VBA для разделителя 1000, поскольку в моем случае невозможно использовать формулу и это должно выполняться с помощью специального кода. Текущее решение взято из формата чисел ответа с разделителем тысяч и десятичным числом, если необходимо

Вот код:

Function CustomFormat(InputValue As Double) As String
    CustomFormat = Format(InputValue, "# ###")
    If (Right(CustomFormat, 1) = ".") Then
        CustomFormat = Left(CustomFormat, Len(CustomFormat) - 1)
    End If
End Function

Он работает для таких чисел, как 1000, но не работает для 1000000. Также 1000000000 не будет работать. В настоящее время я работаю над решением, но если кому-то есть чем поделиться, я буду признателен.

В случае использования оригинального решения:

Function CustomFormat(InputValue As Double) As String
    CustomFormat = Format(InputValue, "#,###.##")
    If (Right(CustomFormat, 1) = ".") Then
        CustomFormat = Left(CustomFormat, Len(CustomFormat) - 1)
    End If
End Function

Ответы

5 SuperSymmetry Aug 16 2020 at 19:40

Я думаю, что vba нужен разделитель тысяч, который определен в ваших региональных настройках. Поскольку в вашем случае это запятая, вы можете сделать что-то вроде этого

Function CustomFormat(InputValue As Double) As String
    CustomFormat = Format(InputValue, "#,###")
    If (Right(CustomFormat, 1) = ".") Then
        CustomFormat = Left(CustomFormat, Len(CustomFormat) - 1)
    End If
    CustomFormat = Replace(CustomFormat, ",", " ")
End Function

Другой подход - прочитать разделитель из реестра. Это должно работать в разных региональных настройках.

Function CustomFormat(InputValue As Double) As String
    Dim sThousandsSep As String
    Dim sDecimalSep As String
    Dim sFormat As String
    
    sThousandsSep = Application.International(xlThousandsSeparator)
    sDecimalSep = Application.International(xlDecimalSeparator)
    
    ' Up to 6 decimal places
    sFormat = "#" & sThousandsSep & "###" & sDecimalSep & "######"
    
    CustomFormat = Format(InputValue, sFormat)
    If (Right$(CustomFormat, 1) = sDecimalSep) Then CustomFormat = Left$(CustomFormat, Len(CustomFormat) - 1)
    End If
    
    ' Replace the thousands separator with a space
    ' or any other character
    CustomFormat = Replace(CustomFormat, sThousandsSep, " ")
End Function

Изменить измененную функцию для использования Application.Internationalв соответствии с предложением @RonRosenfeld.

1 TinMan Aug 16 2020 at 23:38

Вам необходимо расширить числовой формат, чтобы включить в него более крупные числа.

### ### ## 0 ","