TOP絵変更 → 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41  クリックすると変更されます
HOME

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Excel,AccessVBAのカタカナチェックについて

例えばフォームで、氏名等でカナ入力のみを許したいテキストボックスがある場合、
どのような方法を取ればよいのだろうか。
ググるとちょいちょい出てくるのだが、なかなかクリティカルな回答は
なかったためメモるとする。(この記事自体もクリティカルな回答ではないだろうが)




まずググってひっかかるのが「office TANAKA」のあのいつものサイト。
「Access VBA カタカナチェック」と検索しているのにExcelのチップスが
出てくるのはどうかと思うが、ここにはこう書かれている。


If Range("A1") = StrConv(Range("A1"), vbKatakana) Then


同じ文字列を、一方はカタカナに変換して、それがイコールかを判定している。
フォームのテキストボックスとして考えると、以下のように書き換えるだろう。


If txtStr.Value = StrConv(txtStr.Value, vbKatakana) Then


txtStrというのはフォームに設置したテキストボックスのオブジェクト名。
これを実行して判定を行うと、確かに「ひらがな」があった場合は
判定してくれる。しかし、このロジックは
【半角カタカナ】や【数字】【英字】もTrueが返ってくる。
半角を許したくない場合は、やはり文字バイト数を比較すべきだろう。
てことで以下ロジックを追加。


If txtStr.Value = StrConv(txtStr.Value, vbKatakana) And _
LenB(StrConv(txtStr.Value, vbFromUnicode)) = LenB(StrConv(txtStr.Value, vbWide)) Then


左側はUnicodeからシステムの既定のコードページに変換、
右側は半角文字を全角文字に変換している。
この両方を比較した場合、例えば「アア」と半角カタカナが書いてあった場合は
左側は「2」、右側は「4」となり、結果はFalseとなる。

これにより【半角カタカナ】【数字】【英字】は回避できたが、
まだ【全角数字】と【全角英字】が回避できない。
なぜかというとこの二つを「vbKatakana」でコンバートしても
そのまま【全角数字】【全角英字】で返ってくるからだ。

次にググってひっかかったのは[Select Case]を使う方法。
かなり原始的だが他の方法がなかなか見つからない。
シフトJIS 第1水準漢字コード表を見ると、「ァ」から「ヶ」までが
カタカナであるので、この文字の範囲内かどうかを
1文字ずつぐるぐる回して判定する。


Dim kana As String ' txtStr.Value が長いので変数にいれる
Dim i As Integer
Dim j As Integer

kana = txtStr.Value

If kana = StrConv(kana, vbKatakana) And _
LenB(StrConv(kana, vbFromUnicode)) = LenB(StrConv(kana, vbWide)) Then
MsgBox "カタカナだ"
Else
MsgBox "カタカナじゃねぇ"
End If

i = 0
j = Len(kana)
Do
i = i + 1
If i > j Then Exit Do
Select Case Mid(kana, i, 1)
'Case "ア" To "ン", "ァ" To "ヶ" ' AccessVBAの場合はなぜかこうしなきゃダメ
Case "ァ" To "ヶ"
Case Else
MsgBox "カタカナじゃねぇ"
Exit Sub
End Select
MsgBox "カタカナだ"
Loop


AccessVBAの場合、"あ" = "ア" がなぜかTrueで返ってくるため、
Doでループしているロジックは数値か英字以外のチェックとして機能する。
ExcelVBAの場合はDoでループしているロジックのみでいいかもしれない。

これを部品化するとこうなる。(しかしこれが完成形ではない)




' カタカナチェック
Private Function KanaCheck(ByVal kana As Variant) As Boolean
Dim i As Integer
Dim j As Integer

KanaCheck = False

' 空白の場合はTrueで返す
If IsNull(kana) Or kana = "" Then
KanaCheck = True
Exit Function
End If

' ひらがな、あるいは半角文字がある場合はFalseで返す
If StrComp(kana, StrConv(kana, vbKatakana), vbBinaryCompare) <> 0 Or _
LenB(StrConv(kana, vbFromUnicode)) <> LenB(StrConv(kana, vbWide)) Then
KanaCheck = False
Exit Function
End If

' カタカナ以外(英数字)がある場合はFalseで返す
i = 0
j = Len(kana)
Do
i = i + 1
If i > j Then Exit Do
Select Case Mid(kana, i, 1)
Case "ア" To "ン", "ァ" To "ヶ"
Case Else
KanaCheck = False
Exit Function
End Select
Loop

KanaCheck = True

End Function


カタカナだったらTrue、カタカナじゃない場合はFalseを返す部品。
ExcelVBAの場合、j = Len(kana)はたぶんエラーにならないけど、
AccessVBAの場合だとkanaにnullが入っててエラーになるので、
その手前に「空白の場合はTrueで返す」処理を追加した。
あと空白スペースなんかを許したい場合、
『Case "ア" To "ン", "ァ" To "ヶ", " "』
と書けばいいのだが、半角スペースだと
最初の文字バイト数チェックにひっかかる。
なので結局最初のループしてないロジックも
ループ内に収め、一文字ずつ判定したほうがやりやすいのでは?
と思って作ったのが以下。(こっちが完成形)


' カタカナチェック
Public Function KanaCheck(ByVal kana As Variant) As Boolean
Dim i As Integer
Dim j As Integer
Dim wkStr As String

KanaCheck = False

' 空白の場合はTrueで返す
If IsNull(kana) Or kana = "" Then
KanaCheck = True
Exit Function
End If

i = 0
j = Len(kana)
Do
i = i + 1
If i > j Then Exit Do
wkStr = Mid(kana, i, 1)
' 空白スペースの場合はチェックしない
If wkStr <> " " And wkStr <> " " Then
' ひらがながある場合はFalseで返す
If StrComp(wkStr, StrConv(wkStr, vbKatakana), vbBinaryCompare) <> 0 Then
KanaCheck = False
Exit Function
End If
' 半角文字がある場合はFalseで返す
If LenB(StrConv(wkStr, vbFromUnicode)) <> LenB(StrConv(wkStr, vbWide)) Then
KanaCheck = False
Exit Function
End If
' カタカナ以外(英数字)がある場合はFalseで返す
Select Case Mid(kana, i, 1)
Case "ア" To "ン", "ァ" To "ヶ", " "
Case Else
KanaCheck = False
Exit Function
End Select
End If
Loop

KanaCheck = True
End Function


本当はcontinueとか使いたかったが、VBAにはそんなステートメントないので
単純にIf文で空白スペースの場合はカタカナチェックを行わないようにした。
上記部品であればExcelVBAでもAccessVBAでも
正常にカタカナチェックがされると思われる。(WordVBA?ナニソレ?)
これをパブリックにして標準モジュールにでも入れておけば
いざというときに使えるかもしれない。

しかし「IsNumeric」みたいな関数がカタカナ版もあればいいのに…。
需要ないんだろうね。
スポンサーサイト

テーマ : テイルズウィーバー
ジャンル : オンラインゲーム

コメントの投稿

非公開コメント

著作権

Copyrights (C) NEXON Corporation and NEXON Co., Ltd.
All Rights Reserved.
乱数試行機

乱数試行機

成功率 %
試行回数 回

成功    :0 回
失敗    :0 回
成功率結果 :0 %
試行回数結果:0 回
簡易MRシミュレータ

簡易MRシミュレータ
by †真・ブリニクルディメンションスレイヤー

S:64 
H:136 
F:17 
I:16 
M:14 
X:16 
A:11 
Q:10 
C:9 
アンチ無
MR費用:0
MR券込:0
回した回数:0

※ステがMAXになると
 黄色文字になります
 ステ自体違う場合はコメントくだs
※ラジオボタンを押下すると
 アンチマジックを使った状態に
なります

個人リンク
みんなの呟き

   



サイト説明
BloodyRosary は
テイルズウィーバーなブログです。
レコ…霧鯖で活動してるってばよ。
TwitterID:yoinagiTW

このブログはリンクフリーです。
+50000
しかしなぜか東方カウンター
自己紹介

宵凪(テチ) Lv:290
3次覚醒済


江戸川ドイル(アナイス) Lv290
2次覚醒済


竜崎シオン(イソ) Lv290
2次覚醒済


ラストセラフィ(ベンヤ) Lv290
2次覚醒済


シルフィアス(ナヤ) Lv:290
2次覚醒済


ジールラファル(マキシ) Lv:255
覚醒済


レスヴィリア(ミラ) Lv:255
覚醒済


聖王リヴァイア(シベ) Lv:255
覚醒済


セレス(クロエ) Lv265
覚醒済


月千夜(ジョシュ) Lv255
覚醒済


雪千夜(ランジエ) Lv255
覚醒済


超社長(イサック) Lv255
覚醒済


ナズナ(ボリ) Lv255
覚醒済


シルベイン(ピン) Lv:255
覚醒済


ディシディア(ルシ) Lv255
覚醒済


メルブレイズ(ロアミニ) Lv255
覚醒済


ルヴァリオ(ノクターン) Lv255
覚醒済


臼いネコ(テチ) Lv290


x音葉x(テチ) Lv199

他のキャラ
セリカ様(アナイス) Lv290
黒銀シア(ピン) Lv274
全キャラレコ…霧鯖で適当に活動中
今までの絵
右下に行くほど新
左上に行くほど古
リンクにマウスをあわせると
縮小画像表示

ちなみに読み込み遅いです。
最新コメント
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
カテゴリ
リンク
テスト
クリックすると
シナリオ開始 
 
検索フォーム
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。