dポイントプレゼントキャンペーン実施中!

半角文字の\はエクセル(VBA)では全角扱いなのでしょうか?
添付のマクロを実行すると結果は"全角だろう"になります。
\はStrConvでvbWideを指定しても全角になりません。
全角の¥はStrConv/vbNarrowで半角になります。
どういう理由でこうなっているのでしょうか?
\以外にもこのような文字があるのでしょうか?
ご存知の方、教えていただけないでしょうか。

Sub Macro1()
ch1 = "\"
ch2 = StrConv(ch1, vbWide)
If ch1 = ch2 Then
Debug.Print "全角だろう"
Else
Debug.Print "半角だろう"
End If
End Sub

A 回答 (3件)

StrConv関数で特殊な結果になる文字は、私の知る限り、「\」も含めて3種あります。



1)一方通行:
 「\/¥」
2)変換前後で異なる全角文字に変換:
 「'/'/’」、「"/"/”」

「2)」については、vbNarrow指定で「'」(ASCIIコード=-1450)と「’」(同=-32408)とが
「'」に変換されます。
一方、「'」はvbWide指定で「'」(同=-1450)に変換されますが、キーボードの「7/'/や」
キーで入力されるのは、通常は「’」(同=-32408)の方なので、StrConv関数で
「(全角入力)→半角変換→全角再変換」という操作をすると、全角にはなっている
ものの、元に戻っているわけではない、という結果になります。
(「"」についても同様です)

ただ、文字種は違っても、全角への変換はされているので、今回ご質問の
「Len関数による文字判定」には、特に支障はないものと思います。

   ~~~~~~~~~~~~~~~~~~~~~~~~~~

「\→¥」の変換がされないのは、もしかしたら「円記号問題」に絡む・・・のかもしれません。
(「0x5C番地の文字」は「\/バックスラッシュ」という(見た目の全く違う)2通りがあり得るため、
 変換可否を判断できない、と。一方、「¥」の半角化の場合は、「0x5C番地ではない\」
 (・・・というものがあるのかどうかを知らないのですが(汗))に変換、として対処している、と:
 あくまで、素人の推測です(汗))
Wiki・円記号:
http://ja.wikipedia.org/wiki/%E5%86%86%E8%A8%98% …
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
このWikipediaでこんなに大きく扱われているとは驚きました。
全く知りませんでしたが、大きな問題だったのですね。
これらの文字を扱う場合、慎重に行う必要がありますね。

お礼日時:2008/06/20 23:28

No.2です。


訂正と追加情報です。

<訂正>
 「ASCIIコード=-1450」等と書きましたが、これはASCIIの範囲外ですので
 ASCIIコードではなくUnicodeでしたので、訂正させていただきます(汗)
 (調べるのにVBAのAsc関数(→ワークシート関数のASC関数とは別物)を
  使ったため、それに引きずられる形で誤記してしまいました)


<追加情報>
 上記Asc関数を使用して、以下のように判定することも可能かと思いますので、
 参考までに:

Sub Macro1()

  Dim StrChr As String
  Dim IntChr As Integer

  'StrChr = "\"
  StrChr = "¥"

  '「StrChr」の文字コードを取得
  IntChr = Asc(StrChr)

  '文字コードが0~255(=0000~00FF)の範囲内かどうかを判定
  If IntChr >= 0 And IntChr < 256 Then
    Debug.Print "半角のようです"
  Else
    Debug.Print "全角らしいです"
  End If

End Sub
    • good
    • 0
この回答へのお礼

追加情報ありがとうございました。

お礼日時:2008/06/24 23:24

\がVBAで全角扱いなのではなく、StrConv("\",vbWide)では¥(全角)にならないようです。

(理由は分かりませんが・・・)
\を含む文字列をすべて全角にするなら
Replace(StrConv(MOJI,vbWide),"\","¥")
とでもしてください。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
やはり\は個別に扱わなければならないようですね。
今回は文字変換ではなく、等幅フォントの文字列(IBMメインフレームから送られてくるデータをエクセルに取り込んだもの)の長さを調べるのが目的でした。
Lenでは全て1桁ですし、LenBはユニコードなので全て2桁ですので、半角文字だったら1を全角文字だったら2を返す関数を自作して使っていました。
半年ほど使って問題無かったのですが、たまたま\が発生して処理がおかしくなっていました。

お礼日時:2008/06/20 07:37

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


このQ&Aを見た人がよく見るQ&A