Separador Ultimate 1000 usando VBA

Aug 16 2020

Tenho tentado obter uma solução VBA para o separador 1000, pois no meu caso não é possível usar a fórmula e deve ser feito com código personalizado. A solução atual é obtida do Formato de Número de Resposta com Separador de Milhares e Decimal, se necessário

Aqui está o código:

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

Está funcionando para números como 1000, mas não funciona para 1000000. Além disso, 1000000000 não funcionará. Atualmente estou trabalhando em uma solução, mas se alguém tiver algo a compartilhar, ficaria grato.

Em caso de uso de solução original:

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

Respostas

5 SuperSymmetry Aug 16 2020 at 19:40

Eu acho que vba precisa do separador de milhares que é definido em suas configurações regionais. Já que é uma vírgula no seu caso, você pode fazer algo assim

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

Outra abordagem é ler o separador do registro. Isso deve funcionar em diferentes configurações regionais.

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

Editar função alterada para usar Application.Internationalconforme sugerido por @RonRosenfeld.

1 TinMan Aug 16 2020 at 23:38

Você precisa estender seu formato de número para incluir os números maiores.

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