Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10全般 : Excel 2013)
カンマや通貨が設定してあるかの判断
投稿日時: 19/12/19 23:36:52
投稿者: 咲くや

Excelのテストの採点マクロを作っています。
 
カンマや通貨の設定がしてあるかの判断をしたいのですが、
設定の仕方が色々あるので、セル.NumberFormatLocalに
"," や "\" があるか、InStr関数で判断しようとしました。
カンマは判断できるのですが、"\"がどうしてもヒットしません。
 
If Instr( セル.NumberFormatLocal , "\") > 0 then 
 ・・・・・
 
Left関数を使ってもイコールにはなりません。
If Left(セル.NumberFormatLocal,1) = "\" ) then
 ・・・・・
 
 
・¥マークの書き方が何かあるのでしょうか。
 
・他に何かカンマや通貨の設定がしてあるか、簡単な調べ方があれば
 教えて下さい。
 
よろしくお願いします。
 
 
 

回答
投稿日時: 19/12/20 00:03:47
投稿者: simple

たしかに
If Left(セル.NumberFormatLocal,1) = "\" then
は素通りしますね。
 
If Asc(Left(セル.NumberFormatLocal,1) = 92 then
とするとかでしょうか。
(Option Compere Textとモジュールの先頭に置くと、同一視されるが、これも意味が不明。)
 
# \は backslashの代用としても使われるので、そのあたりの国別対応の関係なんだろうか。
# どなたかスッキリした説明をいただければ。

回答
投稿日時: 19/12/20 09:47:00
投稿者: 半平太

「Local」だとUNICODEにされるらしいので、Local無しのプロパティにしたらどうですか?
 
>セル.NumberFormatLocal
  ↓
 セル.NumberFormat

回答
投稿日時: 19/12/20 10:14:47
投稿者: WinArrow
投稿者のウェブサイトに移動

姑息な代案
 
    Range("B1").Formula = "=Cell(""Format"",A1)"
    If Range("B1").Value = "C0-" Then
        MsgBox "OK"
    End If

回答
投稿日時: 19/12/20 10:29:47
投稿者: WinArrow
投稿者のウェブサイトに移動

少し真面目な代案
 
    If Asc(Left(Range("A1").NumberFormatLocal, 1)) = 92 Then MsgBox "¥だよ"

回答
投稿日時: 19/12/20 11:12:54
投稿者: simple

>「Local」だとUNICODEにされるらしいので、
そうでしたか。知りませんでした。ありがとうございます。
でも、それでなぜ不一致になるのか、私は実はよくわかっていないのです。
 
>Local無しのプロパティにしたらどうですか?
なるほど、"$"と比較するということですか。
日本人としては釈然としないですが、可能ではありますね。
 
WinArrowさんの指摘で、私の記述ミスが判明。
誤)If Asc(Left(セル.NumberFormatLocal,1) = 92 then
正)If Asc(Left(セル.NumberFormatLocal,1)) = 92 then

回答
投稿日時: 19/12/20 11:42:08
投稿者: 半平太

>>「Local」だとUNICODEにされるらしいので、
>そうでしたか。知りませんでした。ありがとうございます。
>でも、それでなぜ不一致になるのか、私は実はよくわかっていないのです。
::
>なるほど、"$"と比較するということですか。
 
ごめんなさい、文字コードを調べたら、そうなっているのかなと思ってしまいました。
私の勘違いかも知れません。(もう一度調べてみます)
 
また、"$"と比較するなんてマズいので、取り下げます。m(__)m
 

回答
投稿日時: 19/12/20 11:50:08
投稿者: sk

半平太 さんの引用:
「Local」だとUNICODEにされるらしい

その辺りの動作は実行環境によって異なるようですね。
 
咲くや さんの引用:
Instr( セル.NumberFormatLocal , "\") > 0

咲くや さんの引用:
Left(セル.NumberFormatLocal,1) = "\"

例えば Windows 7 / Excel 2010 環境だとどちらも True となりますが、
Windows 10 / Excel 2016 環境だと逆にどちらも False となりました。
 
また、Left(セル.NumberFormatLocal,1) の戻り値を
AscW 関数に渡した場合、前者の環境では 92 を返すのに対し、
後者の環境では 165 を返しているのを確認出来ました。
(ちなみに Asc 関数ならどちらの環境でも 92 を返す)

回答
投稿日時: 19/12/20 12:19:12
投稿者: simple

皆様 ご教示頂きありがとうございます。
私の環境は Win7,Excel2010ですが、
Left(セル.NumberFormatLocal,1) = "\"
はFalseになり、AscWは165となりました。
あれえ。
 
半平太さんのご指摘どおりでした。
直接文字列同士を比較するなら、"\"ではなく、
If Left(セル.NumberFormatLocal,1) = ChrW(165) Then
などとしなければいけないということですね。

回答
投稿日時: 19/12/20 12:30:22
投稿者: 半平太

私の環境ですと(Windows 10 / Excel 2010)
 
"\"の文字コードは、AscもAscwも「92」でした。
一方、 Left(.NumberFormatLocal, 1) は Ascが「92」、AscWが「165」でした。
 

 関数    \     Left(NumberFormatLocal, 1)  
 Asc  →  92            92 
 AscW →  92           165 

つまり、"\"に見えるUNIDODEは少なくとも2つ存在し、Localの書式には、
通常とは別の文字(AscW165)がセットされる・・・と言うことなんですかねぇ。

回答
投稿日時: 19/12/20 12:47:43
投稿者: simple

引用:
つまり、"\"に見えるUNIDODEは少なくとも2つ存在し、Localの書式には、
通常とは別の文字(AscW165)がセットされる・・・と言うことなんですかねぇ。

そのように思います。
 
そして、VBEはUnicode非対応のため、165の\を直接、コード内に書くことはできない。
どうしても文字列どうしの比較をコードに書くとすれば、
・ワークシート上に入れた165の\を変数に取り込んで比較するか、
・ChrW(165)などと比較するか、
ということになると思います。
 
ご教示いただき、腹に落ちた気がします。# 質問者じゃないけど得した気がする。

回答
投稿日時: 19/12/20 13:50:55
投稿者: WinArrow
投稿者のウェブサイトに移動

私の環境
Windows10 Excel2007
では
Dim MM As String
 
    MM = Left$([A1].NumberFormatLocal, 1)
    Debug.Print MM
    Debug.Print Asc(MM)
    Debug.Print AscW(MM)
    Debug.Print Hex(AscW(MM))
 
上から順番に
 
\
92
165
A5
となりました。
 
へえ〜・・・そうなんだ。
 

回答
投稿日時: 19/12/21 01:23:36
投稿者: チオチモリン

とりあえず ↓ なのではどうでしょうか
 
Sub Test()
    Dim W1 As String, WE As String
    W1 = ActiveCell.NumberFormatLocal
    ActiveCell.NumberFormatLocal = "\0"
    WE = Left(ActiveCell.NumberFormatLocal, 1)
    ActiveCell.NumberFormatLocal = W1
     
    Debug.Print Range("A1").NumberFormatLocal
    Debug.Print InStr(Range("A1").NumberFormatLocal, WE)
End Sub
 
実行結果は
\#,##0;[赤]\-#,##0
 1
となりました。

投稿日時: 19/12/22 23:06:15
投稿者: 咲くや

色々検証ありがとうございます。
"\"かどうか判断するには文字列ではなく、コードで、
ということがわかりました。
それもWinやExcelのバージョンによって違うと(^^;)
ありがとうございます。
 
他に、通貨(¥と,)の設定がしているか
判断できる方法がありましたらお願いします。
 

回答
投稿日時: 19/12/23 09:26:57
投稿者: simple

If InStr(セル.NumberFormatLocal, ",") > 0 _
   Or InStr(セル.NumberFormatLocal, ChrW(165)) > 0 Then
もしくは、
If InStr(セル.NumberFormatLocal, ",") > 0 _
   Or Asc(Left(セル.NumberFormatLocal, 1)) = 92 Then
はあなたの環境で動作するはずですけど、それではご不満ですか?
それほど色々な方法は無いと思いますけどねえ。
数値の書式を管理する方法を複数持つインセンティブはMS社には無いでしょう。

回答
投稿日時: 19/12/23 09:48:05
投稿者: simple

カンマかつ1文字目が"\"ということなら、Orじゃなく Andでしたか。

回答
投稿日時: 19/12/23 10:47:53
投稿者: 半平太

>他に、通貨(¥と,)の設定がしているか
>判断できる方法がありましたら
  
ちょっと、話の流れが理解しにくいんですけど、
ほとんど出尽くしじゃないですか?
  
改めて読み返してみると
チオチモリンさんの実験が無意味(失礼)かな? と思う程度です。 (※)
「\」で設定しても、LocalにはChrW(165)が設定されるので
  
Sub Test() ’
    ActiveCell.NumberFormatLocal = "\0"
    Debug.Print AscW(Left(ActiveCell.NumberFormatLocal, 1)) '165が返る
End Sub
  
Winのバージョンの違いで困っていると言うことなら
92か165のどっちのコード番号もあり得るので
  
    NF = セル.NumberFormatLocal
    IF (NF Like "\*,*") Or (NF Like ChrW(165) & "*,*") Then
  
そもそも、
書式設定で「\」が先頭にあるかどうかをチェックする動機は何ですか?
その事情説明があると、もっと他の方法も知りたいと言う意図が理解できるかもですが・・
望む書式を強制的に設定してしまえば、チェック自体が不要とも思いますし。
 
(※)チオチモリンさんの反論があるかも知れませんので、すぐには閉じない様にお願いします。

回答
投稿日時: 19/12/23 10:50:34
投稿者: たらのり

おはようございます
 
チオチモリン さんのコード:
 

Sub Test()
    Dim W1 As String, WE As String
    W1 = ActiveCell.NumberFormatLocal             ' (1) 元の書式を退避する
    ActiveCell.NumberFormatLocal = "\0"           ' (2) 書式を設定する
    WE = Left(ActiveCell.NumberFormatLocal, 1)    ' (3) (2) で指定した通貨記号を取得
    ActiveCell.NumberFormatLocal = W1             ' (4) 元の書式を復帰する
     
    Debug.Print Range("A1").NumberFormatLocal
    Debug.Print InStr(Range("A1").NumberFormatLocal, WE)  ' (5) (3) で取得した文字で判定
End Sub 

(2) は、書式の文字列がかならずしも円記号で始まっていない場合のケア
(3) は、円記号の内部表現のコード(造語デスw)を取得して (5) で判定に使用
(5) では、かならずしも先頭の円記号を検索していない
 
と、最初は ?? と感じたものの、あとからジワジワくるコードでした。
僕にとっては。曲解もあるかもしれませんが、、、

回答
投稿日時: 19/12/23 11:02:41
投稿者: 半平太

たらのりさんへ
 
>あとからジワジワくるコードでした。
 
どう、ジワジワ来たんですか?
 
何のテストをしている(と思った)のですか?

回答
投稿日時: 19/12/23 15:40:18
投稿者: 半平太

ようやく私にも分かりました。(ジワジワ来ました)
 
テスト前に設定されていた先頭文字コードが何であろうとも、
新規設定の\と同じ文字と判定されるなら、\が設定されている、と言える。
 
と言うロジックですね。なるほどです。
 
ただ、同じと判定されなければ\ではないと言えるかどうかは
私は、ちょっと自信がないです。多分、問題ないのでしょうけど。

回答
投稿日時: 19/12/23 16:25:13
投稿者: 半平太

咲くやさんにお訊きします。
 
ちょっとマニアックとは思うんですが
先頭文字が「全角の¥の場合」、真偽判定はどうするのでしょうか?
 
※ チェックの意図が不明瞭なのでちょっと気になってきました。
 
流石にそこまでは考えなくていいんでしょうか?

回答
投稿日時: 19/12/23 19:14:35
投稿者: たらのり

おつかれさまです
 
半平太 さん
たぶん認識は僕と一致していると思います。
 
最初僕は、ユーザー定義でパターンを設定すれば、円記号が
かならずしも文字列の先頭にないことがあるのではと考えたの
ですが、そもそもユーザー定義で任意に指定したパターンを
「通貨」と考えてよいものかと思うようになりました。
この判断は、質問者に委ねられることになると思います。
 
それから、手元に Windows PC がなかったので、先の発言の
時点では机上(画面上)でしか確認をしていませんでしたが、
出社後に(こっそり)実行してみたところ、僕の環境(※)では
期待通りの結果にはなりませんでした
(最後の Debug.Printの行の出力は 0 でした)。
 
先にも発言がありますが、結果は環境に依存するようですね。
 
※ Windows7(32)、Excel2013

回答
投稿日時: 19/12/23 21:39:35
投稿者: チオチモリン

>最後の Debug.Printの行の出力は 0 でした。
そうですか
>...結果は環境に依存するようですね。
A1の表示形式に\が含まれているのに0なんですよね。
うーん。私にはわかりません。
 
ちなみに私の環境は 7(64):2010(64),7(64):365(64) です。
いずれも表示形式が
\#,##0;[赤]\-#,##0 の時(リボンの通貨表示形式ボタンをクリックで設定)は
 1 となりましした。

回答
投稿日時: 19/12/23 23:43:23
投稿者: simple

チオチモリンさんの提案は、要するに、ChrW(165)みたいなことをせずに、
Unicodeの"\"文字との文字列比較をしたい、ということだと思料。
ただし、コードの可読性の観点からは、意図が直ぐには分かりにくい面があるかもしれない。
  
# もっとも、コード中に二度も"セル.NumberFormatLocal"を書いてしまって、
# DRY原則(Don't Repeat Yourself)に反するコードを書く人からは言われたくないだろうが。
# 自分で全体のコードを書くときは、こうはしないだろうけど(言い訳)。
  
ところで、「通貨」の定義ですけど、
\ を付けるかどうかはオプションですよね。
"\"なしだって通貨メニューを使って操作してますよ、通貨でしょ?という反論もありうる。
  
それに、通貨書式の特徴はカンマがあることだが、
それを言えば、「会計」だってカンマを含んでいるわけで、
「会計」はカンマを含んでいるから正解なのかどうなのか。
  
この辺は、「Excelのテスト」の採点者としての見解に依るのでしょう。
なにか他にありませんかという方針の方が
どういう見解をお持ちなのか、聞いてみたいですね、単なる興味ですが。

回答
投稿日時: 19/12/24 08:31:11
投稿者: 半平太

>Excelのテストの採点マクロを作っています
 
すみません。冒頭に目的が書かれていたんですね (-_-;)
 
なら、ユーザー定義を心配するレベルの被験者は居ないハズなので、
これでいいんじゃないですか?
 ↓
If Replace(セル.NumberFormatLocal, ChrW(165), "\") Like "\*,*" Then

回答
投稿日時: 19/12/24 10:19:57
投稿者: simple

私が勘違いしているのかな。
半平太さんの案でOKでしょうけど、
もともと、頭の1文字をAsc関数で判断して92であればという判定と、
カンマ判定を組み合わせる手法で目的自体は達成しているはず、
というのがわたしの理解。
 
議論に一向に加わらずに傍観している質問者さんが不思議です。
もっと他に、は無いです。

回答
投稿日時: 19/12/24 11:22:11
投稿者: 半平太

simple さん
 
ほぼほぼ私宛ですね。
 
>カンマ判定を組み合わせる手法で目的自体は達成しているはず、
>というのがわたしの理解。
 
おっしゃる通りです。
勘違いさせていたらすみません。
他の人の解決策が使えないと言うつもりは無かったです。
 
>他に、通貨(¥と,)の設定がしているか
>判断できる方法がありましたらお願いします。
 
VBAで採点するような立場と技量を持つ人が、
元凶が分かったあの時点で、更に「まだ何かないか?」と
言ってくる話の流れは、正直言ってよく解らないです。
実務目的からして、解決策は幾つも要らないハズですしねぇ。
 
もしかしたら、Localの文字の判定とは無関係に、
通貨書式を設定したと分かる(ウルトラC級の)解決策が他にあれば・・、
と言う趣旨なのかも知れないと思ったりもするんですけど。

回答
投稿日時: 19/12/24 11:54:57
投稿者: simple

いえいえ、質問者さんに宛てて書いております。
半平太さんの回答はOKですよね。
それにもともと十分に回答もあるのに、なぜ他に、というのが解せなかったのです。

回答
投稿日時: 19/12/24 11:58:07
投稿者: simple

書式に包括的に名前をつけて保存するような(名前定義のような)メカニズムがあれば、
それを利用したいということなんでしょうかね。
ご指摘のとおり、そういうものは無いですよね。

回答
投稿日時: 19/12/24 14:25:27
投稿者: チオチモリン

simpleさん
>書式に包括的に名前をつけて保存するような(名前定義のような)メカニズム
それって「スタイル」では?と思ったのですが「スタイル」とは又違うものなのでしょうか?
 
たらのりさん
もしまだ見ておられましたら、後学のために
Debug.Print Range("A1").NumberFormatLocal で表示された値と 
それに含まれる「\」の文字コード(Asc())
及び 2019/12/21 1:23:36 のコード中の
WE = Left(ActiveCell.NumberFormatLocal, 1) の次行に
Debug.Print ASC(WE)を 追加したときにイミディエイトに表示される値の3点を教えていただけませんか?
当方には ※ Windows7(32)、Excel2013 の環境がありませんので確認ができません。
お手数をおかけしますが、確認して頂けると助かります。
 
※ そんなことはないだろうとは思いながらも、A1に通貨の表示形式が設定されいなかったのでは?という疑念も払拭できないでいます。

回答
投稿日時: 19/12/24 15:44:25
投稿者: たらのり

おつかれさまです
 
前回もあらかじめ A1セルの書式を「通貨」にして実行した
つもりでしたが、そうなっていなかったのかなぁ……
 
昨日と同一の環境で以下のコードを実行しました:
 

Sub Test()
    Dim W1 As String, WE As String
    W1 = ActiveCell.NumberFormatLocal
    ActiveCell.NumberFormatLocal = "\0"
    WE = Left(ActiveCell.NumberFormatLocal, 1)
    Debug.Print ASC(WE)                             ' ★ 追加
    ActiveCell.NumberFormatLocal = W1
     
    Debug.Print Range("A1").NumberFormatLocal
    Debug.Print InStr(Range("A1").NumberFormatLocal, WE)
End Sub 

' ■ 実行結果
'    92 
'   \#,##0;\-#,##0
'    1                  ← New!!

チオチモリン さん、大変失礼いたしました…… m(_ _)m

回答
投稿日時: 19/12/24 16:35:54
投稿者: チオチモリン

追試ありがとうございました。
とりあえず安心しました。

回答
投稿日時: 19/12/24 16:59:31
投稿者: simple

ああ、スタイル、すっかり忘れていました。
それで判定できるかもしれませんね。

回答
投稿日時: 19/12/24 17:42:24
投稿者: sk

たらのり さんの引用:
最初僕は、ユーザー定義でパターンを設定すれば、円記号が
かならずしも文字列の先頭にないことがあるのではと考えたの
ですが、そもそもユーザー定義で任意に指定したパターンを
「通貨」と考えてよいものかと思うようになりました。
この判断は、質問者に委ねられることになると思います。

半平太 さんの引用:
Localの文字の判定とは無関係に、
通貨書式を設定したと分かる(ウルトラC級の)解決策

simple さんの引用:
書式に包括的に名前をつけて保存するような(名前定義のような)メカニズム

「組み込み書式としての『通貨』がセルに設定されているか否かを知る」
ということにまで話を拡げてしまうと、以下の方法が妥当となりかねない
ですけどね。
 
WinArrow さんの引用:
Range("B1").Formula = "=Cell(""Format"",A1)"
If Range("B1").Value = "C0-" Then
    MsgBox "OK"
End If

Private Sub Test()
     
    Dim セル As Excel.Range
     
    Set セル = ActiveCell
     
    Debug.Print IsCurrencyFormat(セル)
     
    Set セル = Nothing
     
End Sub
     
Public Function IsCurrencyFormat(Range As Excel.Range) As Boolean
     
    Dim strAddress As String
    Dim varRet As Variant
     
    IsCurrencyFormat = False
     
    strAddress = Range.Address(True, True, Application.ReferenceStyle, True)
    varRet = Evaluate("=CELL(""Format""," & strAddress & ")")
     
    If varRet Like "C*" Then
        IsCurrencyFormat = True
    End If
 
End Function
--------------------------------------------------------------------
 
あと、通貨単位が円である前提で Shift_JIS 上の "\" と
Unicode 環境依存文字の "\" のどちらが先頭文字であるか
(そういう文字が使用されているか否か)という方向で
話が進んじゃってますけど(これ自体はコンパネの設定の問題)、
例えば "[$\-411]#,##0" のようにロケールIDを指定して
(国別の)通貨記号を表示させるケースもあり得ますよ。

回答
投稿日時: 19/12/24 19:46:12
投稿者: 半平太

ならば、これ
     ↓
If Replace(Application.Text(1000, セル.NumberFormatLocal), ChrW(165), "\") Like "\*,*" Then

回答
投稿日時: 19/12/24 20:09:56
投稿者: simple

# 帰宅しました。
スタイル案は、ダメでしたね。
標準の表示形式「通貨」を設定したとき、自動的にスタイルが設定されるならともかく、
そうでなければ判定に使うことはできませんね。どうもどうも。

回答
投稿日時: 19/12/24 21:42:50
投稿者: チオチモリン

>ロケールIDを指定して(国別の)通貨記号を表示させるケースもあり得ますよ。
 
一応 ↓ に対してのレスなので想定済みではありますけど。
>"\"がどうしてもヒットしません。
>If Instr( セル.NumberFormatLocal , "\") > 0 then
 
Sub Test2()
    Dim W1 As String, WE As String
    With ActiveCell
        W1 = .NumberFormatLocal
             .NumberFormatLocal = "\0"
        WE = Left(.NumberFormatLocal, 1)
             .NumberFormatLocal = W1
    End With
    With Range("A1")
        Debug.Print .NumberFormatLocal
        Debug.Print InStr(.NumberFormatLocal, WE)
        Debug.Print InStr(.NumberFormatLocal, WE) > 0
    End With
End Sub
 
[$\-411]#,##0.00_);[赤]([$\-411]#,##0.00)
 3
TRUE

回答
投稿日時: 19/12/24 22:50:20
投稿者: たらのり

# こんばんは
#
# 一杯ひっかけてたら,最初の自分の解釈がちょっと
# 間違ってたかなーって思うようになって戻ってみたら,
# そんなこと言い出せないような雰囲気……w
#
# ひとりごと,……寝言でしたおやすみなさいzzz

回答
投稿日時: 19/12/25 10:37:29
投稿者: sk

sk さんの引用:
組み込み書式としての『通貨』がセルに設定されているか否かを知る」

simple さんの引用:
標準の表示形式「通貨」を設定したとき、自動的にスタイルが設定されるならともかく、
そうでなければ判定に使うことはできませんね。

・[ホーム]->[数値]グループ->[表示形式]コンボボックスのリストから
 「通貨」を指定した場合、実際に適用されるユーザー定義書式は
 システムの[地域と言語]オプションの設定によって決定される。
 (実際に適用されるのは Excel アプリケーションの起動時)
 
・Windows XP 以前の古い日本語環境の場合、既定の通貨記号は
 "\"(U+005C, ChrW(92), 英語環境ではバックスラッシュ)とされているが、
 それ以降の新しい Windows の日本語環境における推奨設定では
 "\"(U+00A5, ChrW(165), Unicode 環境依存文字)の方が採用されている。
 (この設定は当然、ユーザーが任意に変更できる)
 
・例えば、システムの通貨記号を"円"とし、通貨記号を数値の前ではなく
 数値の後ろに表示するように設定されている環境の場合、
 [表示形式]コンボボックスから「通貨」を選択すると
 アクティブセルには「#,##0_);[赤](#,##0)」のような
 表示形式が適用されるようになる。
 
・「\#,##0;\-#,##0」という表示形式が設定されているセルを含むブックを
 上記の環境で開いた場合、そのセルの NumberFormatLocal プロパティの設定値は
 「"\"#,##0;"\"-#,##0」のように、円記号をダブルクォーテーションで囲む
 (通貨記号としてではなく文字列として扱う)形に置き換えられる。
 また、[表示形式]コンボボックス上では「ユーザー定義」として扱われる
 ( CELL 関数での扱いも同様に変わってくる)
 
・システムの通貨記号として U+00A5 の方の "\" が設定されている
 (既定の推奨日本語環境である)場合、ユーザー定義書式の設定時に
 キーボードから直接 "\"(U+005C)を入力しても、実際に適用されるのは
 U+00A5 の方の "\" となる。
 (システムの通貨記号が U+005C の方の "\" ではある場合は逆の結果となる)
 
・「[$\-411]#,##0」のように、ロケールIDと共に通貨記号を明示的に
 指定している場合、システムの通貨表示形式がどのように設定されているかに
 かかわらず、[表示形式]コンボボックス上では「通貨」として扱われる。
 
・なお、システムの通貨記号としてどの文字が設定されているかは、
 Application オブジェクトの International プロパティによって
 調べることが出来る。
 
----------------------------------------------------------------
 
? AscW(Application.International(xlCurrencyCode))
 
----------------------------------------------------------------
 
つまり、「標準形式の『通貨』」なるものは実在せず、
「そのセルに設定されている表示形式が、システムの通貨表示形式と
マッチしているか」あるいは「明示的に通貨記号が指定されているか」を
Excel がその都度判断している(と共に、表示形式を自動的に設定している)
に過ぎない、ということかと。

回答
投稿日時: 19/12/25 10:54:13
投稿者: simple

>「標準形式の『通貨』」なるものは実在せず、
私の表現力不足でしたが、
ドロップダウンリストに表示された【通貨】をクリックして実行した場合、
ないし、セルの表示形式の「分類」にある通貨をクリックして実行した場合、
を指してそのように書いたものです。あくまで受験者の操作を想定したものでした。
 
Excelのテストですから、海外の地域通貨を使用するといったことは
とりあえずは考慮しなくてよいのかもしれません。
ここは、質問者さんから言明いただいたほうがよいことですが。
 
質問者さんは、議論に入りにくいのかもしれませんが、
そろそろ問題設定を明確化というか限定していく説明をしていただきたいものです。
それに沿って、必要なら追加で議論をすればよいと思います。

回答
投稿日時: 19/12/25 11:35:38
投稿者: sk

前置きが長くなってしまった。
というわけで話を本題に戻します。
 

咲くや さんの引用:
Excelのテストの採点マクロを作っています。
  
カンマや通貨の設定がしてあるかの判断をしたいのですが、
設定の仕方が色々あるので、セル.NumberFormatLocalに
"," や "\" があるか、InStr関数で判断しようとしました。
カンマは判断できるのですが、"\"がどうしてもヒットしません

そのセルの NumberFormatLocal プロパティに円記号( U+005C または U+00A5 )が
含まれているか否かを調べる方法に関しては、もう既に答えは出揃っています。
 
咲くや さんの引用:
他に、通貨(¥と,)の設定がしているか
判断できる方法がありましたらお願いします。

セルの表示形式として「通貨」が指定されたか否かを判別する方法に関しては、
その判断基準を「システムの通貨表示形式」とするか
「通貨単位が日本円である場合において想定され得るありとあらゆるパターン」とするか
「俺ルール(特定のパターンのみ)で判断」とするか
による、としか答えようがないですね。

回答
投稿日時: 19/12/26 11:42:27
投稿者: WinArrow
投稿者のウェブサイトに移動

「\」だけに特化して
 
sk さん、レスをお借りして、
システム通貨記号で判定する方法は
↓こんな感じになるのかな?
    Debug.Print Left$([A1].NumberFormatLocal, 1) = Application.International(xlCurrencyCode)
 
 
咲くやさんの質問

引用:
他に、通貨(¥と,)の設定がしているか
判断できる方法がありましたらお願いします。

 
AND なのか OR なのか、意図もよくわかりません。
 
ユーザー定義で
\####
と設定すると
確かに、「,」は尽きませんが、「通貨」「会計」を指定すれば、「,」は付与されます。
ANDで判断する意味はないとも言えます。
それよりも「¥」ではなく「円」をチェックしたほうが良いではないでしょうか?
 

投稿日時: 19/12/27 23:52:32
投稿者: 咲くや

長々と引っ張ってしまってすいませんでした!
(こまめにチェックせずにすいませんでした!)
 
日本なので通貨記号は¥です。
逆に$とかだと×です。
 
数値に「,」や「\と,」の設定がされているかの判断をしたいのですが、
リボンのボタン(桁区切りスタイル、通貨表示形式)からの設定、書式設定のダイアログボックスなど
設定の仕方が色々あり、その都度設定されているプロパティや詳細が違うので、
関数とか使わずに、どこかに単純に判断できるマルチなプロパティがあるのかな、
と思って聞きました。
 
前半部分に解答いただいた、NumberFormatLocal から関数で判断します。
 
色々とご意見いただき、ありがとうございました。