Excel VBA質問箱 IV

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

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


4382 / 13644 ツリー ←次へ | 前へ→

【56977】セルのデータ(数字、英数字、半角カタカナ)チェック ひさこ 08/7/15(火) 23:59 質問[未読]
【56978】Re:セルのデータ(数字、英数字、半角カタ... kanabun 08/7/16(水) 0:22 発言[未読]
【56994】Re:セルのデータ(数字、英数字、半角カタ... ひさこ 08/7/16(水) 20:37 質問[未読]
【56995】Re:セルのデータ(数字、英数字、半角カタ... kanabun 08/7/16(水) 20:58 発言[未読]
【56996】Re:セルのデータ(数字、英数字、半角カタ... ひさこ 08/7/16(水) 21:25 質問[未読]
【56997】Re:セルのデータ(数字、英数字、半角カタ... kanabun 08/7/16(水) 21:42 発言[未読]
【56998】Re:セルのデータ(数字、英数字、半角カタ... ひさこ 08/7/16(水) 21:59 お礼[未読]

【56977】セルのデータ(数字、英数字、半角カタカ...
質問  ひさこ  - 08/7/15(火) 23:59 -

引用なし
パスワード
   はじめまして。。。


仕事で、各種データを入力するシートがあります。

数字だけの列、英数字だけの列、半角カタカナだけの列。
ですが、それぞれの列において異なるデータが入っていたりもします。

それを確認するためのマクロを作成したいのですが可能でしょうか?

【56978】Re:セルのデータ(数字、英数字、半角カ...
発言  kanabun  - 08/7/16(水) 0:22 -

引用なし
パスワード
   ▼ひさこ さん:

>数字だけの列、英数字だけの列、半角カタカナだけの列。
>ですが、それぞれの列において異なるデータが入っていたりもします。

あるセルc が数字以外の文字を含んでいるか? は、
  If c.Text Like "*[!0-9]*" Then

あるセルc が英数字以外の文字を含んでいるか? は、
  If c.Text Like "*[!0-9A-z]*" Then

あるセルc が半角カナ以外の文字を含んでいるか? は、
  If c.Text Like "*[!ヲ-゚]*" Then

調べられそうです。

【56994】Re:セルのデータ(数字、英数字、半角カ...
質問  ひさこ  - 08/7/16(水) 20:37 -

引用なし
パスワード
   kanabun さん、こんばんわ!!

すばらしい回答ありがとうございます!!!

ちなみに。。全角の文字が入っているかどうか判定することは可能でしょうか?(氏名欄に使いたいです・・・)


▼kanabun さん:
>▼ひさこ さん:
>
>>数字だけの列、英数字だけの列、半角カタカナだけの列。
>>ですが、それぞれの列において異なるデータが入っていたりもします。
>
>あるセルc が数字以外の文字を含んでいるか? は、
>  If c.Text Like "*[!0-9]*" Then
>
>あるセルc が英数字以外の文字を含んでいるか? は、
>  If c.Text Like "*[!0-9A-z]*" Then
>
>あるセルc が半角カナ以外の文字を含んでいるか? は、
>  If c.Text Like "*[!ヲ-゚]*" Then
>
>調べられそうです。

【56995】Re:セルのデータ(数字、英数字、半角カ...
発言  kanabun  - 08/7/16(水) 20:58 -

引用なし
パスワード
   ▼ひさこ さん:

>ちなみに。。全角の文字が入っているかどうか判定することは可能でしょうか?

もちろんできます。
VBAでもできますが、ちょっと難しいので、
まず、一般機能での方法を紹介します。(実用的ではないけれど、理解のために)

新規シートに
A列に適当な文字列を3行(3種類= {半角のみ、半角全角混在、全角のみ})
入力してください。
B,C,D列に 以下のように関数式を書き入れてみてください。

 A     B     C      D
aiueo    =LEN(A1)    =LENB(A1)    =B1=C1
aiueお    =LEN(A2)    =LENB(A2)    =B2=C2
あいうえお=LEN(A3)    =LENB(A3)    =B3=C3

結果はどうなりましたか?
結果と、あなたが理解した範囲でかまいませんので、結果の解釈をお返事ください。(^^

【56996】Re:セルのデータ(数字、英数字、半角カ...
質問  ひさこ  - 08/7/16(水) 21:25 -

引用なし
パスワード
   kanabun さん、お世話になっております。

結果は、
aiueo     5   5   TRUE
aiueお     5   6   FALSE
あいうえお   5   10   FALSE

のようになりました。

私の理解した範囲での解釈は、文字数とバイト数が倍になったら
すべて全角が入力されている。。。(全角は2バイトの為)

どうでしょうか?


▼kanabun さん:
>▼ひさこ さん:
>
>>ちなみに。。全角の文字が入っているかどうか判定することは可能でしょうか?
>
>もちろんできます。
>VBAでもできますが、ちょっと難しいので、
>まず、一般機能での方法を紹介します。(実用的ではないけれど、理解のために)
>
>新規シートに
>A列に適当な文字列を3行(3種類= {半角のみ、半角全角混在、全角のみ})
>入力してください。
>B,C,D列に 以下のように関数式を書き入れてみてください。
>
> A     B     C      D
>aiueo    =LEN(A1)    =LENB(A1)    =B1=C1
>aiueお    =LEN(A2)    =LENB(A2)    =B2=C2
>あいうえお=LEN(A3)    =LENB(A3)    =B3=C3
>
>結果はどうなりましたか?
>結果と、あなたが理解した範囲でかまいませんので、結果の解釈をお返事ください。(^^

【56997】Re:セルのデータ(数字、英数字、半角カ...
発言  kanabun  - 08/7/16(水) 21:42 -

引用なし
パスワード
   ▼ひさこ さん:
>kanabun さん、お世話になっております。
>
>結果は、
>aiueo     5   5   TRUE
>aiueお     5   6   FALSE
>あいうえお   5   10   FALSE
>
>のようになりました。
>
>私の理解した範囲での解釈は、文字数とバイト数が倍になったら
>すべて全角が入力されている。。。(全角は2バイトの為)
>
>どうでしょうか?

はい。それで正解です。

B列: LEN関数は 文字数を返します
C列: LENB関数は バイト数を返します
で、
D列の式: 文字数とバイト数が違っていたら(文字数よりバイト数のほうが大きかったら)
D列は<FALSE> になり、A列文字列には2バイトコードが含まれていることを示します。

これをまとめて、VBA(=ユーザー定義関数)にすればいいのですが、
ワークシート上とVBA上とで 使用している文字コード体系がちがうので、
ワークシートのセルの ShiftJIS文字列「123」のLENBの結果は 3ですが、
VBA上では 「123」というUnicode文字列を LenB関数にかけても 6 となります。
VBA上では すべての(半角であれ、全角であれ)文字は2バイトです。
これを、シート上の文字のように 半角の時は 1バイトを得られるようにするには
Unicode文字列を一時的にShiftJISコードに変換して LenB関数でバイト数を
取得します。
具体的には、以下のような関数となります

Function 全角あり(ByVal c As Range) As Boolean
 Dim ss As String
 ss = c.Text
 全角あり = Len(ss) < LenB(StrConv(ss, vbFromUnicode))
End Function

この関数は 全角文字が含まれているとき、True を返します。
この関数を、E列に
  =全角あり(A1)
のように埋め込むと、結果は ちょうど D列の TRUE/FALSE をさかさまにした
真偽値になっているはずです。

【56998】Re:セルのデータ(数字、英数字、半角カ...
お礼  ひさこ  - 08/7/16(水) 21:59 -

引用なし
パスワード
   kanabun さん、

早速ありがとうございました!!
奥が深いんですね。。。
とても勉強になりました!!!

また何かありましたら、ご教授のほどよろしくお願いいたします。

▼kanabun さん:
>▼ひさこ さん:
>>kanabun さん、お世話になっております。
>>
>>結果は、
>>aiueo     5   5   TRUE
>>aiueお     5   6   FALSE
>>あいうえお   5   10   FALSE
>>
>>のようになりました。
>>
>>私の理解した範囲での解釈は、文字数とバイト数が倍になったら
>>すべて全角が入力されている。。。(全角は2バイトの為)
>>
>>どうでしょうか?
>
>はい。それで正解です。
>
>B列: LEN関数は 文字数を返します
>C列: LENB関数は バイト数を返します
>で、
>D列の式: 文字数とバイト数が違っていたら(文字数よりバイト数のほうが大きかったら)
>D列は<FALSE> になり、A列文字列には2バイトコードが含まれていることを示します。
>
>これをまとめて、VBA(=ユーザー定義関数)にすればいいのですが、
>ワークシート上とVBA上とで 使用している文字コード体系がちがうので、
>ワークシートのセルの ShiftJIS文字列「123」のLENBの結果は 3ですが、
>VBA上では 「123」というUnicode文字列を LenB関数にかけても 6 となります。
>VBA上では すべての(半角であれ、全角であれ)文字は2バイトです。
>これを、シート上の文字のように 半角の時は 1バイトを得られるようにするには
>Unicode文字列を一時的にShiftJISコードに変換して LenB関数でバイト数を
>取得します。
>具体的には、以下のような関数となります
>
>Function 全角あり(ByVal c As Range) As Boolean
> Dim ss As String
> ss = c.Text
> 全角あり = Len(ss) < LenB(StrConv(ss, vbFromUnicode))
>End Function
>
>この関数は 全角文字が含まれているとき、True を返します。
>この関数を、E列に
>  =全角あり(A1)
>のように埋め込むと、結果は ちょうど D列の TRUE/FALSE をさかさまにした
>真偽値になっているはずです。

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