none
3桁ごとにコンマを打つはずが、外国人スタッフのOSではドットが打たれてしまう RRS feed

  • 質問

  • 初めまして。VBA初心者のため、見当違いな質問をお許し下さい。

    現在、アジア圏の現地法人で仕事をしていて現地のローカルスタッフが仕事で使うファイルをVBAで作っています。

    VBAのユーザーフォームで金額を入れると自動的に3桁の数字がカンマで打たれるように下記の設定をしたのですが、

    Private Sub txtAmtTransfer_Change()

      If IsNumeric(Me.txtAmtTotal.Text) Then

          Me.txtAmtTotal.Text = Format(Me.txtAmtTotal.Text, "#,##0")

      End If


    End Sub

    現地のスタッフ曰くユーザーフォームに数字の入力をすると例えば、5000だったら5.000となぜかドットが自動的に打たれて、ユーザーフォームからエクセルのセルに入力内容が反映されるときは「5」となぜかドット以下の桁数が切り捨てられて表示される事象が起きています。

    ローカルスタッフの国では3桁区切りをドットで小数点の箇所をカンマで表記することが慣例な国なのでスタッフのOSの設定が3桁区切りをドットで表記している可能性がありますが、何とか入力した通りの数字と3桁ずつの表記がカンマ表記になるようなコードの書き方がありましたらご教示のほどをお願い致します。

    2019年12月29日 3:01

すべての返信

  • Windows 自体の表示形式の問題ですね。

    コントロール パネルの「日付、時刻、または数値の形式の変更」から確認してください。
    (「地域」のダイアログの「形式」タブの「追加の設定」に数値の表示形式があります)



    Hebikuzure aka Murachi Akira


    2019年12月29日 10:05
  • 3桁区切りと小数点の両方の設定をドットにしてみたら、

    そのような現象になりました。

    2019年12月29日 10:24
  • 何とか入力した通りの数字と3桁ずつの表記がカンマ表記になるようなコードの書き方がありましたら

    つまり OS の地域設定を 無視して、アプリケーション固有の統一書式(今回は日米系)で扱うということですね。

    Application.International(XlApplicationInternational.xlThousandsSeparator)
    Application.International(XlApplicationInternational.xlDecimalSeparator)
    などを使えば、OS 基準の桁区切り記号や小数点記号を得ることができますので、FormatNumber 関数の結果を Replace 関数で置き換えるというのは如何でしょうか。

    Option Explicit
    
    Public Sub Test()
        Dim value As Currency
        value = 1234567890.123@
        
        'イタリア語環境だと "1.234.567.890"
        '日本語・英語の場合 "1,234,567,890"
        Debug.Print Format(value, "##,##,##0.000")
        Debug.Print FormatNumber(value, 3)
        
        'イタリア語環境だと "1,234,567,890"
        '日本語・英語の場合 "1,234,567,890"
        Debug.Print FormatNeutralNumber(value, 3)
    End Sub
    
    Public Function FormatNeutralNumber(ByVal value As Variant, Optional digit As Long = 0) As String
        Dim textLocal As String
        textLocal = FormatNumber(value, digit, GroupDigits:=vbTrue)
        Dim textNeutral As String
        textNeutral = textLocal
        '小数点記号と桁区切り記号の補正
        textNeutral = Replace(textNeutral, Application.International(XlApplicationInternational.xlDecimalSeparator), ChrW(0), Compare:=vbBinaryCompare)
        textNeutral = Replace(textNeutral, Application.International(XlApplicationInternational.xlThousandsSeparator), ",", Compare:=vbBinaryCompare)
        textNeutral = Replace(textNeutral, ChrW(0), ".", Compare:=vbBinaryCompare)
        '地域設定によっては、これだけでは不十分ですが、とりあえず今回はここまで
        FormatNeutralNumber = textNeutral
    End Function
    


    イタリア語圏、ドイツ語圏、スペイン語圏、ポルトガル語圏あたりでは「1.234.567,89」のように、 3 桁ごとにピリオド、小数点にカンマを使いますので、上記ではこれらの地域設定であることを想定しています。

    一方、日英米は「1,234,567.89」表記が基本ですが、米国の一部では「1,234,567·89」のように小数点記号がミドルドットで表現される地域もあります。スイス圏だと「1’234’567.89」形式の区切りが使われます。

    少しややこしいのが、ロシア圏やフランスあたりの「1 234 567,89」表記。区切りに使われるのが ChrW(&H20) の空白の場合と、ChrW(&HA0) の改行無し空白(Non-breaking-space) が用いられる場合とがあります。後者の場合、日本語 Shift_JIS 環境だと文字化けすることがあるので要注意です。

    さらに厄介なのが、インド、バングラディシュ、パキスタンあたり。記号自体は小数点= . および桁区切り= , で日本同様であり、国際表記の「1,234,567.89」も利用されますが、桁区切り位置が「12,34,567.89」形式(Lahk/Crore)も良く使われます。最初は3桁で、それ以降は2桁区切りという変則的な仕様ですが、ここまで追従させると面倒かな…。

    この他、負数表現の差異などもありますね。日付書式に至ってはもっと面倒。

    ご存じとは思いますが、OS の標準書式は [コントロール パネル] の「地域」から設定されます。
    (コントロール パネルが カテゴリ 表示の時は、[時計と地域] から)

    数値書式の詳細は、上記 [地域] ダイアログにて、形式の [追加の設定] ボタンから見ることができます。

    2019年12月30日 0:06
  • 文字列の中の","と"."を入れ替えたいということでしょうか? であれば例えば

    Sub test()
        x = "1,555,000.123"
        y = Replace(x, ",", "a")
        Z = Replace(y, ".", ",")
        y = Replace(Z, "a", ".")
        Debug.Print x, y
    End Sub
    退避させるための”a”は文字列に含まれない文字

    2020年1月2日 9:27