質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

4回答

17709閲覧

VBAでの、入力値の半角チェックについて

karasu0318

総合スコア28

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2018/02/21 14:34

VBAでの、入力値の半角チェックについて

VBAでの半角チェックは調べると下記のように記述するようですが、
StrConv(セル, vbFromUnicode)の部分はなぜ必要なのでしょうか?
LenとLenBで比較すれば、全角があれば2バイトになるので、チェックできそうな気がします。
調べると、システム既定のコードに変換する、との事ですが、
なぜそれが必要なのかわかりませんでした。。。

ご教授お願いいたします。

If Len(セル) <> LenB(StrConv(セル, vbFromUnicode)) Then(以下略

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

VBAでは内部の文字列をUTF-16のリトルエンディアンの形式で扱っています。
また、UTF16では1文字当たり最低2バイト使用します。

そのため、半角を含む文字列でもLenB関数はLen関数の2倍の値を出力します。

vba

1Debug.Print LenB("A"), LenB("Aあ") ' => 2 4

StrConv関数を使用すると、VBA内部の文字列をシステムの既定のコード ページ(日本はCP932)の形式のバイト配列に変換できます。
いわゆる全角文字、半角文字というのはこのCP932の形式のときしか通用しない話となります。

vba

1'文字列の形式確認サンプル 2Dim txt As String 3txt = "A" 4 5'文字列をByte配列に変換 6 7'UTF16として 8Dim utf16Txt() As Byte 9utf16Txt = txt ' => Byte(0 To 1) (65, 0) 10 11'CP932として 12Dim cp932Txt() As Byte 13cp932Txt = StrConv(txt, vbFromUnicode) ' => Byte(0 To 0) (65) 14 15Stop 'ローカルウィンドウでの確認用

投稿2018/02/21 15:13

imihito

総合スコア2166

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karasu0318

2018/03/06 15:29

返信遅くなり申し訳ありません。ご回答ありがとうございます。
guest

0

要点だけまとめ。

LenとLenBで比較すれば、全角があれば2バイトになるので、チェックできそうな気が

前提に半角は1バイト、全角は2バイトというのがあると思いますが、
imihitoさんのいう通り

VBAでは内部の文字列をUTF-16のリトルエンディアンの形式で扱っています。

また、UTF16では1文字当たり最低2バイト使用します。

というわけで、LenB("A")は1でなく2と判定されます。
全角文字も2です。(4じゃないですよ。念のため)

システム既定のコードに変換する、との事ですが、

なぜそれが必要なのか

というわけで、全角半角のバイト数が異なるコードページに変換してあげる必要があります。
質問者さんの想定、前提であるCP932ですね。

? lenb("A") 2 ? lenb(strconv("A", vbFromUnicode)) 1

投稿2018/02/22 02:43

momon-ga

総合スコア4820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karasu0318

2018/03/06 15:26

返信遅くなり申し訳ありません。まとめていただき、ありがとうございます。
guest

0

何の為のチェックなのか背景が不明なので、
別案を出してみようかと。

もし、チェック内容が「全角の文字が含まれている」という事であれば、
既出の「StrConv(セル, vbFromUnicode)」の方法が適当になります。

しかし、チェック内容が「半角に変換できる文字が全角」という事であれば、
If [セル] <> StrConv([セル],vbNarrow) Then
という方法が適当になります。

ご参考まで。

投稿2018/02/22 00:43

ExcelVBAer

総合スコア1175

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karasu0318

2018/03/06 15:27

返信遅くなり申し訳ありません。回答ありがとうございます。
guest

0

既に回答が出ていますが、これはやってみればわかります。

vba

1?len("aあ") 2 2 3?lenb("aあ") 4 4

lenは「純粋な文字数」、lenbは「純粋な文字数*2」しか出ないので
そのままでは「全角半角を区別できない」のです。なので
「LenとLenBで比較すれば、全角があれば2バイトになるので、チェックできそうな気がします」というのは無理です。なので
strconvで「バイト配列に直してその長さを使う」ということをやっています。

投稿2018/02/22 00:12

sousuke

総合スコア3828

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

karasu0318

2018/03/06 15:28

返信遅くなり申し訳ありません。ご回答ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問