みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ExcelのVBAでカタカナをチェックしたい

ExcelのVBAで、あるセルの値が半角カタカナであった場合エラーとしたいのですが、
セルの値が半角カタカナという条件式の構文がわかりません。
困っています。どなたかお助けくださいませ!

また、できることならば、半角カタカナ→全角カタカナに自動修正させたいのですが、
無理ならば上記のエラーチェックだけでもよいです。
もし、こちらもおわかりになる方いらっしゃいましたら教えてください。よろしくお願いいたします。

投稿日時 - 2003-08-05 11:16:53

QNo.620139

困ってます

質問者が選んだベストアンサー

 
> 具体的なコーディング例を教えていただけませんでしょうか?

参考までに・・・。↓

Option Explicit
Option Compare Binary

Public Const MaxRow = 65536
Public Const AscKuten As Integer = &HA1 '半角句点のAscii文字コード
Public Const AscDakuOn As Integer = &HDE '半角濁音   〃
Public Const AscHanDakuOn As Integer = &HDF '半角半濁音  〃

Public Sub Test(ByRef wkSht As excel.Worksheet, _
ByVal colNumber As Long, _
Optional ByVal startRow As Long = 2, _
Optional ByVal endRow As Long = MaxRow)
Dim i As Long

With wkSht
For i = startRow To endRow
.Cells(i, colNumber).Value = KanaWideConv(.Cells(i, colNumber).Value)
Next i
End With
End Sub

Public Function KanaWideConv(ByVal strSource As String) As String
Dim strTmp As String
Dim lngStrLength As Long
Dim i As Long

If Len(strSource) = 0 Then
KanaWideConv = ""
Exit Function
End If

lngStrLength = Len(strSource)

'先頭の1文字のみ、別処理。
For i = lngStrLength To 2 Step -1
strTmp = Mid$(strSource, i, 1)

Select Case Asc(strTmp)
'濁音、半濁音の処理。(直前の文字と2文字1組で処理)
Case AscDakuOn, AscHanDakuOn
strSource = Replace(strSource, Mid$(strSource, i - 1, 2), _
StrConv(Mid$(strSource, i - 1, 2), vbWide))
'その他の半角カタカナ。
Case AscKuten To &HDD
Mid$(strSource, i, 1) = StrConv(strTmp, vbWide)
End Select
Next i

strTmp = Left$(strSource, 1)
Select Case Asc(strTmp)
Case AscKuten To AscHanDakuOn
Mid$(strSource, 1, 1) = StrConv(strTmp, vbWide)
End Select

KanaWideConv = strSource
End Function

Public Function IsHankakuKana(ByRef strSource) As Boolean
Dim i As Long

IsHankakuKana = True

For i = 1 To Len(strSource)
Select Case Asc(Mid$(strSource))
Case AscKuten To AscHanDakuOn
Exit Function
End Select
Next i

IsHankakuKana = False
End Function
 

投稿日時 - 2003-08-05 14:12:20

お礼

貴重なソースを拝見させていただきありがとうございました。
私のレベルでは、ちょっとツラかったので・・・
結局、全角に変換して、変換前と変換後の文字列のバイト数を比較してメッセージを表示するというコーディングで逃げてしまいました(笑)

しばらくソースと格闘していましたので、直ぐにお礼が書けず失礼いたしました。
無事納品できました。ありがとうございました。

投稿日時 - 2003-08-10 12:04:36

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.6

#4です。
#5を見てビックリ。私のことではないですか。#4は#3さんのご回答を見て言ったものでは決してありません。ましてエラーがあるとか言っておりませんので悪しからず。
先日の他の質問No。609165の自分の回答のことが頭にあリ、また昔から半角の濁点半濁点のお陰でコードが長くなるのがいやでした。「破綻する」と言ったのは、濁点半濁点については、(濁点半濁点付きでない文字は、コードの計算だけだとすっきりして好みなんですが、それとは別の、)まったく別のロジックを持ち出さないと、対処できないと思い、そう述べたもので、私個人が2元化するのが好きでなかっただけです。
併せてご質問者には、本件結果として余分な書入れをすることになり済みません。

投稿日時 - 2003-08-06 22:00:59

ANo.5

 
> 文字コードで判別し文字コードの半角全角のコードの規則性を使うやり方は、濁点半濁点で破綻します。

最低限、他の人のコメントの内容ぐらいは眼を通さないと、軽率で洞察力に欠けると思われても仕方がないのではないでしょうか?(苦笑)

老婆心ながら誤解のないように補足しますと「眼を通す」というのは、単純に眼で眺める(スキャン)だけではなく、文章の内容を咀嚼し(字句解析)、消化する(コンパイル)という意味です。

# コメントすべきか否か迷いましたが、参考になれば幸いです。
 

投稿日時 - 2003-08-06 08:54:53

ANo.4

Sub test01()
For i = 1 To 10
Cells(i, "C") = StrConv(Cells(i, "A"), 4)
Next i
End Sub
のようなのを試してみて、どう言う不都合があるでしょうか。
4の部分は7種あり、加算したコードを使えます。
文字コードで判別し文字コードの半角全角のコードの規則性を使うやり方は、濁点半濁点で破綻します。(一方は2文字1方は1文字)

投稿日時 - 2003-08-05 21:56:09

お礼

勝手に変換してしまうのでなく、「全角に変換するよ」という確認メッセージも表示させたかったのです。
で結局、No.3の方のお礼にも書いたのですが、
StrConvで全角に変換して、変換前と変換後の文字列のバイト数を比較してメッセージを表示することにしました。
おかげさまで無事解決です。ありがとうございました。

投稿日時 - 2003-08-10 12:09:26

ANo.2

StrConv(対象文字, vbWide)

を使えば、
全角文字は全角のままで
半角文字は全角になります。
入力文字を必ず全角にしたいだけなのであれば
エラーチェックせずに
上記構文だけで事足ります。

投稿日時 - 2003-08-05 12:44:14

お礼

StrConvを使用する事にしました。
ありがとうございました!

投稿日時 - 2003-08-10 11:38:12

ANo.1

 
> あるセルの値が半角カタカナであった場合

ASCIIコードで、0xA1 ~ 0xDF(161 ~ 223)の範囲なら半角カナです。

> 半角カタカナ→全角カタカナに自動修正させたい

StrConv(Arg, vbWide)
で可能です。
 

投稿日時 - 2003-08-05 11:23:56

補足

ご回答ありがとうございます。
以下のように記述してみたのですがうまくいきません。
If SheetName.Cells(1, 2).Value >= &H161 Then
  If SheetName.Cells(1, 2).Value >= &H223 Then
    msgRC = MsgBox(ErrMsg, vbOKOnly)
  End If
End If
どんくさい記述で・・・すみません。
もしよろしければ、具体的なコーディング例を教えていただけませんでしょうか?

あと、全角カタカナの場合のコードの範囲も教えてください。

すみませんが・・・よろしくお願いいたします。

投稿日時 - 2003-08-05 13:27:23

あなたにオススメの質問