私は、セルの値をこのように書式を設定したいと思います:エクセル - フォーマット値(マスク)
1234,980 - > 1.234,980
12237119867,761 - > 12.237.119.867,761
ドットを1000個の区切り文字と小数点用のカンマに設定する共通のマスクを作成する方法。マスクは、指定された任意の値に対して機能します。
私は、セルの値をこのように書式を設定したいと思います:エクセル - フォーマット値(マスク)
1234,980 - > 1.234,980
12237119867,761 - > 12.237.119.867,761
ドットを1000個の区切り文字と小数点用のカンマに設定する共通のマスクを作成する方法。マスクは、指定された任意の値に対して機能します。
小数点の左側に最初のセグメントを定義します。必要に応じて自動的に複製されます。
ドットの後の八重奏の数は、ドットの後の桁の最大桁数を設定します。必要な桁数だけが使用されます。以下のような
何か:
#.###,0##
(私はそれがあなたの現在のロケールに対して有効だろうと仮定しています)。
phoogのコメントで示唆したように、ロケールに依存しないフォーマットは次のようになります。いくつかのVBAコードについては
#,###.0##
(Cell.NumberFormat = "#,###.0##"
を使用して書式を設定するために使用)
、あなたは2つのロケールを受け入れるFormat
関数の拡張バージョンを持つことができます.1つはフォーマット文字列であり、もう1つはフォーマット結果に使用されます。別のモジュールで、次の
場所:
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_INVARIANT
とLOCALE_GERMAN
あなたはhereを調べることができます定数です。
あなたにもワークシートからそれを呼び出すことができます。
=FormatForLocale(123456789,"#,###.0##",,,127,3079)
を、私は###、正しいフォーマット文字列が実際に '#だろうと思います0 ##' '、'本培養を表しているため。 '.'は文化特有の小数点区切りを表します。フランス語のローカリゼーション設定などのコンピューターでワークシートを開くと、結果の数字は "1.234,567"のようになります – phoog
@phoog形式を設定する方法によって異なります。インタフェースを使用している場合は、現在のロケールに完全に依存します(たとえば、ロシア語のロケールでは '####、0#'に設定する必要があります)。あなたがコードからフォーマットを設定しているなら、あなたは正しいです、 '#、###。0#'は事です。私はそれを追加します。 – GSerg
ありがとう。文化に依存せずにText()関数で使用したいと思います。フォーマット "#。###、0 ##"を使用すると、 "12237119.867,761"と表示されます。まだ2つのドットが欠落しています。私は何か間違っているのですか? – Cosmo