Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


9237 / 13646 ツリー ←次へ | 前へ→

【28429】MidBについて へなちょこ 05/9/6(火) 15:31 質問[未読]
【28430】Re:MidBについて Jaka 05/9/6(火) 15:56 発言[未読]
【28432】Re:MidBについて かみちゃん 05/9/6(火) 16:17 回答[未読]
【28438】Re:MidBについて へなちょこ 05/9/6(火) 16:41 質問[未読]
【28445】Re:MidBについて りん 05/9/6(火) 19:08 発言[未読]
【28482】Re:MidBについて へなちょこ 05/9/7(水) 17:25 質問[未読]
【28538】Re:MidBについて りん 05/9/8(木) 20:28 発言[未読]

【28429】MidBについて
質問  へなちょこ  - 05/9/6(火) 15:31 -

引用なし
パスワード
   お願いします。

ある文字列の一部分を取り出したいと思っています。

取り出したい文字のスタート位置をLenBで調べ、MidBのスタート位置に
セットしましたが、まったく違う位置がスタート位置になってしまいます。

原因はなんでしょうか?Midを使用した方が良いでしょうか?

ある文字列は、途中に半角スペース、全角スペースやらごちゃごちゃ入ってます。

【28430】Re:MidBについて
発言  Jaka  - 05/9/6(火) 15:56 -

引用なし
パスワード
    こんにちは。

VBAとエクセル関数のLENBは、結果が違います。
VBA側が、アスキーだか、JISだったかで扱う性らしいです。
詳しくは忘れました。
前にJuJuさんが、どこかに書いていたんですが.....。

文字 = "あああ "
MsgBox LenB("文字")
MsgBox Application.Evaluate("Lenb(""" & 文字 & """)")


【28432】Re:MidBについて
回答  かみちゃん  - 05/9/6(火) 16:17 -

引用なし
パスワード
   こんにちは。かみちゃん です。

>取り出したい文字のスタート位置をLenBで調べ、MidBのスタート位置に
>セットしましたが、まったく違う位置がスタート位置になってしまいます。

Excel97以上のバージョンであれば、
「Excel97からはUnicode対応のアプリケーションとなり、半角の文字であっても2バイト
文字として扱われる」からだと思います。
MidB("文字列", 開始位置, バイト数)
は、
StrConv(MidB(StrConv("文字列", vbFromUnicode), 開始位置, バイト数), vbUnicode)
というようにします。

以下のURLが参考になるかと思います。
http://www.moug.net/tech/exvba/0140020.htm

また、私は、以下のURLに書かれているユーザー定義関数を使っています。
http://www.zenko3.com/tips/ascii_string.html

【28438】Re:MidBについて
質問  へなちょこ  - 05/9/6(火) 16:41 -

引用なし
パスワード
   まだ理解していませんが、助かりました。
ありがとうございます。

>Excel97以上のバージョンであれば、
>「Excel97からはUnicode対応のアプリケーションとなり、半角の文字であっても2バイト
>文字として扱われる」からだと思います。

Unicodeは半角が2バイト・全角が4バイトで、
他の文字コードは半角が1バイト・全角が2バイトなのでずれてしまったということ
ですか?

>MidB("文字列", 開始位置, バイト数)
>は、
>StrConv(MidB(StrConv("文字列", vbFromUnicode), 開始位置, バイト数), vbUnicode)
>というようにします。

なぜ2回変換を行うのですか?

【28445】Re:MidBについて
発言  りん E-MAIL  - 05/9/6(火) 19:08 -

引用なし
パスワード
   へなちょこ さん、こんばんわ。

>まだ理解していませんが、助かりました。
>ありがとうございます。
>
>>Excel97以上のバージョンであれば、
>>「Excel97からはUnicode対応のアプリケーションとなり、半角の文字であっても2バイト
>>文字として扱われる」からだと思います。
本家サポート情報に詳細が書いてあります。使用例もあります。
http://support.microsoft.com/default.aspx?scid=kb;ja;408879

>Unicodeは半角が2バイト・全角が4バイトで、
>他の文字コードは半角が1バイト・全角が2バイトなのでずれてしまったということ
>ですか?
Unicodeは全角、半角ともに2バイトです。
なので、
あaA
は、unicodeでは6バイト、ANSIでは5バイトになります。
Sub test1()
  A$ = "あaA"
  MsgBox LenB(A$), vbInformation, "Unicode"
  MsgBox LenB(StrConv(A$, vbFromUnicode)), vbInformation, "FromUnicode"
End Sub

>>MidB("文字列", 開始位置, バイト数)
>>は、
>>StrConv(MidB(StrConv("文字列", vbFromUnicode), 開始位置, バイト数), vbUnicode)
>>というようにします。
>なぜ2回変換を行うのですか?
 StrConv("文字列", vbFromUnicode) でUnicodeからANSIに変換して、MidBでカットします。
次に、その戻り値をUnicodeに戻します。
 StrConv( カット後のANSI文字列 , vbUnicode)

↓戻さないと。
Sub test2()
  A$ = "あaA"
  B$ = MidB(StrConv(A$, vbFromUnicode), 1, 2)
  MsgBox B$, vbInformation, "戻さない"
  MsgBox StrConv(B$, vbUnicode), vbInformation, "戻すと"
End Sub

【28482】Re:MidBについて
質問  へなちょこ  - 05/9/7(水) 17:25 -

引用なし
パスワード
   お返事ありがとうございます。
しかしまだまだ、疑問があります。

>Unicodeは全角、半角ともに2バイトです。
>なので、
>あaA
>は、unicodeでは6バイト、ANSIでは5バイトになります。

勉強になりました。ありがとうございます。


> StrConv("文字列", vbFromUnicode) でUnicodeからANSIに変換して、MidBでカットします。


vbFromUnicodeをヘルプで調べたところ、
文字列を Unicode からシステムの既定のコード ページに変換します。
とかいておりました。

この"既定のコード ページ"というのはいったい何なんでしょうか?
ANSIって事でしょうか?

本当にわかりやすく解説ありがとうございました。
もう少しお付き合いいただくとありがたいです。

【28538】Re:MidBについて
発言  りん E-MAIL  - 05/9/8(木) 20:28 -

引用なし
パスワード
   へなちょこ さん、こんばんわ。

>しかしまだまだ、疑問があります。
 unicodeとShift-Jisの関係は、Strconvでなんとかなるものだということで、深く考えたことがなかったもので、うまく説明できませんが。

>vbFromUnicodeをヘルプで調べたところ、
>文字列を Unicode からシステムの既定のコード ページに変換します。
>とかいておりました。
>この"既定のコード ページ"というのはいったい何なんでしょうか?
>ANSIって事でしょうか?
 EXCELが各国対応なので、規定のコードページという表現ですが、実際はそれぞれの国における規定のという意味のようです。
 また、サンプルでよく出てくるANSIは米国規格協会の略なのですが、これはマイクロソフトがあちらの国だからで、ヘルプや技術情報はそのまま和訳しただけのようなのでANSIなのでしょう。日本ならShift-JISのようですね。

大阪外大のHPの内容が詳しいかな。
http://mlang1.osaka-gaidai.ac.jp/~tagengo/multi/char_code.html#hyo1

#説明上手の谷さん、助けておくれ。

9237 / 13646 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free