[[20111022001551]] 『文字の大小比較』(タカ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『文字の大小比較』(タカ)
windowsXP、EXCEL2003での質問です。
セルに ="A">"ア" と入力すると TRUE になりますが、
VBA で同じ判定をすると FALSE になります。
windowsVISTA、EXCEL2007ではどちらも TRUE になります。
なにか設定で変えられますか。
よろしくお願いいたします。

 FALSEになりますが、数字 < アルファベット < かな となっているのでは。

 文字コードについては(特に大小比較)よくわからない。先日も、この板で同様のディスカッションがあって
でも、結局は、よくわからなかった。今までの自分自身の対応の中では特に困ったことが発生しなかったので
うっちゃっておいたんだけど・・

 あぁ、その前に、当方、Vistaはないので、XP+2003とWin7+2010での検証だけど、「いずれも結果は同じ」
つまり、シート側ではFalse、VBA側ではTrueになった。

 ヘルプなんかを見ると、シート側であれ、VBA側であれ、ANSIコードによる比較が行われるようで
これもヘルプを信じるなら、シート関数では =CODE("A") あるいは =CODE("ア") で取得ができる。
結果は、9025 と 9506 。だから ="A" > "ア" は「当然」False。
一方、VBA側ではCODE関数にあたるものがASC関数なので、たとえば以下を実行すると・・・

 Sub Test1()
    MsgBox Asc("A") & vbLf & Asc("ア")
 End Sub

 これが・・・ -32160 と -31935 になる!値が異なるところがシャクにさわるけど大小としてはシート側と同じ。
なので「当然」以下は Falseになると思いきや!! 結果は True になる。

 Sub Test2()
    MsgBox "A" > "ア"
 End Sub

 これじゃアドバイスにもならないねぇ、悩みを整理しただけ。

 このあたりに詳しい人の明快な回答を心待ちに!!


(タカ)です。回答ありがとうございます。
すみません、質問で「TRUE」「FALSE」を逆に書いてしまいました。
大量のデータをソートしてキー(文字列)がある値のところまでを加工したいので、ソートはEXCELの「並べ替え」で行い、加工処理をVBAで行おうとしてます。
「並べ替え」も「マクロの記録」で記録していますので、結果的にはVBAのSORT命令になります。SORT命令の引数を見てもこのような指定はなさそうです。
EXCEL2003だけの問題であればEXCEL2007に変えるのが一番簡単な解決方法でしょうか。
よろしくお願いいたします。

 横からしつれいしますが、A は全角半角はぶれていませんか?
 提示の式は全角ですが、半角と全角では VBA では結果が逆転します。
 (Mook)

 ワークシートでは、JISコード

 VBAでの 文字列比較は、Unicodeだからではないですか?

 ワークシートで

 全角 A と 全角 ア の比較
 Jis  9025         9506      よって  "A">"ア"は、False

 VBAでバイナリモードでの比較は、Unicode

  全角    A   と   全角    ア の比較
 Unicode    65313               12450     
 よって  "A">"ア"は、True

 因みに

     MsgBox StrComp("A", "ア")

 は、1となります。

     MsgBox StrComp("A", "ア", vbTextCompare)

 は、-1となります。

 ichinose@高島彩の結婚式神社探検は、今日は中止

 


 > VBAでの 文字列比較は、Unicodeだからではないですか?

 なぁるほど、少し霧がはれてきました。(しかし、きょうは降りますねぇ。当方も外出中止)

 >VBAのSORT命令になります。SORT命令の引数を見てもこのような指定はなさそうです

 確かにこの並び替えたものと大小比較が異なる場合が多いね。
ichinoseさんの回答にあるように大小比較がUnicodeベース。
一方、Sortメソッドの方は、引数SortMethodでxlPinInかxlStrokeを指定。省略時はxlPinIn。
いずれにしても、「読み順」だったり「総画数順」。
xlPinInについてはヘルプでは「中国語の発音順」となっているけど日本語の場合も「読み順?」
全角のAが、どんな読みとみなされるのかはわからないけど。

 追記)

 どうも、シート上の並び替えは「読み」が影響してそう。
この「読み」の反映を無くしコード順に並び替えさせる指定もあるようだね。

 この「学校」の過去ログもふくてめ、ざっと検索したら以下のようなものが。
http://office.microsoft.com/ja-jp/excel-help/HA010203199.aspx 現在参照不可
http://okwave.jp/qa/q5610320.html
https://www.excel.studio-kazu.jp/kw/20090918152425.html
http://sme.fujitsu.com/tips/excel/excel028.html

 (ぶらっと)

 みなさん、ありがとうございます。
 JIS、Unicode の件は理解できたのですが、それであればやりようがないのでしょうか。
 ワークシートで Unicode順にする あるいは VBA で JISコードで比較する方法はないでしょうか。
 ちょっと自分でも調べてみます。
 (タカ)

 (タカ)です。
 VBA の先頭で下記オプションを設定して実現できました。
   Option Compare Text 

 みなさんにご教授いただいたおかげです。
 ありがとうございました。


 > 全角 A と 全角 ア の比較
 > Jis  9025         9506  よって "A">"ア"は、False

 以下の例を見れば、JISコード順とは言えないと思います。

  行 ___A___ ___B___ ___C___ ___D___ ____E____ ____F____ 
   1 左文字  右文字  左CODE  右CODE  文字比較  CODE比較                                         
   2 a       A           97      65  TRUE      FALSE          E2セル =A2=B2       F2セル =C2=D2 
   3 A      B         9025      66  TRUE      FALSE          E3セル =A3<B3       F3セル =C3<D3 
   4 ア      あ        9506    9250  TRUE      FALSE          E4セル =A4<B4       F4セル =C4<D4 
   5 A      ア         9025     177  TRUE      FALSE          E5セル =A5<B5       F5セル =C5<D5 

 多分、辞書順
 (ABC順 と あいうえお順。私の手元の日本語の辞書にABCは載っていません。「A」はエエなっています)

 ABCが、あいうえお より先なのは、単なる決めの問題だと思います。

 (半平太) 2011/10/22 21:48

 > a       A           97      65  TRUE
 これは、私も気が付いていたので、Excel特有のText比較かなあなんて
 思っていましたが、どうやらそれも違いそうですね!!

 了解です。

 ところで

 >windowsVISTA、EXCEL2007ではどちらも TRUE になります。タカさん

 >Win7+2010での検証だけど、「いずれも結果は同じ」
 >つまり、シート側ではFalse、VBA側ではTrueになった。 名前無しさん

 これは、どっちが正しいんでしょうか?
 上位バージョンで動作が本当に違ってるのかなあ?

 

 ichinose


 私の環境(WindowsVISTA、EXCEL2007)でテストした限りでは
  ワークシート が FALSE
  VBA      が TRUE 

 ご参考まで
 (半平太) 2011/10/22 22:56

 半平太さん、情報ありがとうございます。

 ichinose


 (タカ)です。すみません、早とちりだったようです。再確認しました。

 【確認プログラム】
 Sub Macro1()
 '
    Range("A2") = """A"">""ア"""
    Range("B2").Formula = "=""A"">""ア"""
    If "A" > "ア" Then
        Range("C2") = "TRUE"
    Else
        Range("C2") = "FALSE"
    End If

    Range("A3") = """A""=""ア"""
    Range("B3").Formula = "=""A""=""ア"""
    If "A" = "ア" Then
        Range("C3") = "TRUE"
    Else
        Range("C3") = "FALSE"
    End If

    Range("A4") = """A""<""ア"""
    Range("B4").Formula = "=""A""<""ア"""
    If "A" < "ア" Then
        Range("C4") = "TRUE"
    Else
        Range("C4") = "FALSE"
    End If

    Range("A5").Select
 End Sub

 【確認結果】
        	シート	VBA
 "A">"ア"	FALSE	TRUE
 "A"="ア"	FALSE	FALSE
 "A"<"ア"	TRUE	FALSE

 よろしくお願いします。


 >早とちりだったようです。再確認しました。
 >・・・・・・・
 > よろしくお願いします。

 問題自体は、OPTIONの設定で解決したのですよね?
 それとも、何かが未解決になっているのですか?

 (半平太) 2011/10/23 08:16

 >早とちりだったようです。再確認しました。

 数式と同じ結果をVBAで出そうとしたらEvaluateメソッドが簡単で確実だと思います。
'【確認プログラム】
Sub Macro2()
  Range("A2") = """A"">""ア"""
  Range("B2").Formula = "=""A"">""ア"""
  Range("C2") = Evaluate("""A"">""ア""")

  Range("A3") = """A""=""ア"""
  Range("B3").Formula = "=""A""=""ア"""
  Range("C3") = Evaluate("""A""=""ア""")

  Range("A4") = """A""<""ア"""
  Range("B4").Formula = "=""A""<""ア"""
  Range("C4") = Evaluate("""A""<""ア""")
End Sub

 "A">"ア" の部分が定数であれば
 Evaluate("""A"">""ア""") は ["A">"ア"] とも記述出来ます。
 (sasa)

 問題自体はoption指定で解決しております。
 いろいろとありがとうございました。
 (タカ)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.