Excel – 格式值(掩码)

我想这样格式化一个单元格的值:

1234980 – > 1.234980

12237119867,761→12.237.119.867,761

如何准备一个共同的面具,将点设置为千位分隔符和小数点的逗号。 面具应该为任何提供的价值。

定义小数点左边的第一个段。 它会根据需要自动复制。
点之后的八点形状的数量设置点之后的最大小数位数,仅使用所需的数量。

就像是:

#.###,0## 

(我假设这将是有效的您当前的区域设置)。

正如phoog的评论所暗示的,独立于区域的格式是:

 #,###.0## 

(使用它来设置格式使用Cell.NumberFormat = "#,###.0##"


至于某些VBA代码,您可能有Format函数的增强版本,它接受两个语言环境,一个是格式string,另一个用于格式化结果。

将以下内容放在单独的模块中:

 Option Explicit Private Declare Function VarTokenizeFormatString Lib "oleaut32.dll" (ByVal pstrFormat As Long, ByRef rgbTok As Any, ByVal cbTok As Long, ByVal iFirstDay As VbDayOfWeek, ByVal iFirstWeek As VbFirstWeekOfYear, ByVal lcid As Long, ByRef pcbActual As Long) As Long Private Declare Function VarFormatFromTokens Lib "oleaut32.dll" (ByRef pvarIn As Variant, ByVal pstrFormat As Long, ByRef pbTokCur As Any, ByVal dwFlags As Long, ByRef pbstrOut As Long, ByVal lcid As Long) As Long Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long) Private Const S_OK As Long = 0 Private Const E_INVALIDARG As Long = &H80070057 Private Const E_OUTOFMEMORY As Long = &H8007000E Private Const DISP_E_BUFFERTOOSMALL As Long = &H80020013 Private Const DISP_E_TYPEMISMATCH As Long = &H80020005 Public Function FormatForLocale(ByVal Expression As Variant, Optional ByVal Format As String, Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbUseSystemDayOfWeek, Optional ByVal FirstWeekOfYear As VbFirstWeekOfYear = vbUseSystem, Optional ByVal PatternLocaleID As Long = 0, Optional ByVal TargetLocaleID As Long = 0) As String Dim b() As Byte, t As Long Dim hResult As Long Dim pBstrResult As Long, res As String Const CHUNK_SIZE As Long = 256 If TypeOf Expression Is Excel.Range Then Expression = Expression.Value End If ReDim b(1 To CHUNK_SIZE) Do hResult = VarTokenizeFormatString(StrPtr(Format), b(LBound(b)), UBound(b) - LBound(b) + 1, FirstDayOfWeek, FirstWeekOfYear, PatternLocaleID, t) Select Case hResult Case S_OK Exit Do Case E_INVALIDARG Err.Raise 5, , "Some arguments are invalid." Case DISP_E_BUFFERTOOSMALL ReDim b(LBound(b) To UBound(b) + CHUNK_SIZE) Case Else Err.Raise 5, , "Internal error. Unexpected error code returned from system." End Select Loop Select Case VarFormatFromTokens(Expression, StrPtr(Format), b(LBound(b)), 0, pBstrResult, TargetLocaleID) Case S_OK CopyMemory ByVal VarPtr(res), pBstrResult, 4 Case E_OUTOFMEMORY Err.Raise 7 Case E_INVALIDARG Err.Raise 5, , "Some arguments are invalid." Case DISP_E_TYPEMISMATCH Err.Raise 5, , "The argument could not be coerced to the specified type." Case Else Err.Raise 5, , "Internal error. Unexpected error code returned from system." End Select FormatForLocale = res End Function 

现在你有一个函数FormatForLocale ,它模仿默认的VBA Format函数,但是增加了两个额外的参数。 要得到你想要的结果,你可以这样做:

 result = FormatForLocale(123456789, "#,###.0##", , , LOCALE_INVARIANT, LOCALE_GERMAN) 

其中LOCALE_INVARIANTLOCALE_GERMAN是常量,您可以在这里查找。

你也可以从工作表中调用它:

 =FormatForLocale(123456789,"#,###.0##",,,127,3079)