• ベストアンサー

セル内の文字列が日本語か英語かを厳密に識別したい

セル内(C3)にある文字列に、漢字・ひらがな・全角カタカナ・半角カタカナのうち、1個でもあれば、その文字列すべてを、右隣のセル(C4)に移し、それ以外の場合はさらにその右隣(C5)に移したいのですが、 たとえば、 (C3)「AMERICA/JAPAN」の場合は、(C5)に「AMERICA/JAPAN」と移します。 (C3)「AMERICA/Japan」の場合は、(C5)に「AMERICA/Japan」と移します。 (C3)「AMERICA/JAPAN#$%?<>」の場合は、(C5)に「AMERICA/JAPAN#$%?<>」と移します。 しかし (C3)「日本とアメリカ#$%?<>」の場合は、(C4)に「日本とアメリカ#$%?<>」と移します。 (C3)「日本/america」の場合は、(C4)に「日本/america」と移します。 (C3)「日本/アメリカ」の場合は、(C4)に「日本/アメリカ」と移します。 (C3)「Japanとamerica」の場合は、(C4)に「Japanとamerica」と移します。 VBAで処理する場合、文字コード、Chr関数、Mid関数を使えばいいと思ってプログラムを組むところです。 ところが、漢字のコード番号が何番から何番までか、よくわかりません。カタカナ・ひらがなは調べられます。 正確でなくとも<>=の数値処理の範囲指定ですので、漢字コードの範囲を教えてくださいませんか。 また、この処理目的のために、よりシンプルなプログラムがありましたら教えてくださいませんか。 よろしくお願いします。 ※簡単に言いますと、セル内が日本語の文章か英語の文章かを識別する作業です。

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

  • ベストアンサー
  • hanka2
  • ベストアンサー率38% (15/39)
回答No.5

日本語かどうかの判定関数です。 引数の中身が日本語ならTrueをそれ以外ならFalseを返します。 ------------------ Function IsJapan(Arg As String) As Boolean IsJapan = Not (LenB(StrConv(StrConv(StrConv(StrConv(Arg, vbWide), vbHiragana), vbNarrow), vbFromUnicode)) = Len(Arg)) End Function

noname#18526
質問者

補足

目からうろこ・・です。皆さん有難うございます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

  • bys07405
  • ベストアンサー率38% (37/97)
回答No.4

#1です。 文字列として"ABC"と"いろは"とあるとします。 JIS関数で全角変換をすると "ABC"→"ABC" "いろは"→"いろは" この変換後の文字列数をLENB関数で数えると(文字数をバイト単位で数える) "ABC"→6文字 "いろは"→6文字 となります。 ASC関数で半角変換をすると "ABC"→"ABC" "いろは"→"いろは" この変換後の文字列数を同じくLENB関数で数えると "ABC"→3文字 "いろは"→6文字 ここで JIS関数で変換した文字数=ASC関数で変換した文字数*2 だったら英語、イコールでなければ日本語が混じっていると判断しています。 ただ、ここで書いていて気づいたのですがカタカナは半角カタカナがあるためうまくいきませんね。「漢字・ひらがなが1個でも」という条件にしか適合しません。申し訳ありません。 (例題はカタカナと一緒に漢字またはひらがながあったためたまたまうまくいっていました) もう一件追加の質問は、その質問のリンク先か質問Noがあるとありがたいです...

すると、全ての回答が全文表示されます。
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 以下は、Web サイトの自動変換機能で、全角になっていますから、以下の部分だけ半角に変換をしてください。 Function FindJapanese(Text As String) の中の → If Text Like "*[ヲ-゜]*" Or _ なお、一応、大ざっばに考えたものですから、細かいチェックはなされておりません。 '-------------------------------------------- Sub CheckCharMacro() Dim c As Range For Each c In Range("C3")  'Selection  If FindJapanese(c.Value) Then    c.Offset(1).Value = c.Value '入っている  Else    c.Offset(2).Value = c.Value '入っていない  End If Next c End Sub Function FindJapanese(Text As String) '漢字・ひらがな・全角カタカナ・半角カタカナ '注意 最初のカタカナは、半角に変更してください。 If Text Like "*[ヲ-゜]*" Or _   Text Like "*[ぁ-ヶ]*" Or _   Text Like "*[一-龠]*" Then  FindJapanese = True Else   FindJapanese = False End If End Function '-------------------------------------------- >漢字のコード番号が何番から何番までか、よくわかりません。 VBAならば、漢字コードは、Unicodeの範囲を指定すればよいのでは?  [&H4E00-&H9FA5] 一-龠(これ以上は、ShifJISにありません。4文字漢字が足りません。正確さを記すなら、Unicode入力をするか、コードで指定してください)正規表現でも可能です。その場合は、直接コードを指定すればよいです。

noname#18526
質問者

お礼

感謝。もう一つ質問を関連で書きました。 よろしかったら。お助けください。

すると、全ての回答が全文表示されます。
  • hana-hana3
  • ベストアンサー率31% (4940/15541)
回答No.2

>漢字コードの範囲を教えてくださいませんか。 下記は、逆に「半角コード以外」が含まれるかで判断しています。 Sub sample() Dim str As String Dim i As Integer Dim flg As Boolean str = "japan/にほん" For i = 1 To Len(str) If AscB(Mid(str, i)) > 127 Or AscB(Mid(str, i)) < 32 Then flg = True Exit For End If Next If flg Then MsgBox "日本語が含まれています。" Else MsgBox "日本語は含まれていません。" End If End Sub

noname#18526
質問者

お礼

感謝。少し時間をください。理解してみます。

すると、全ての回答が全文表示されます。
  • bys07405
  • ベストアンサー率38% (37/97)
回答No.1

下記のような関数で例に挙げられている内容を満足できましたが、このようなものでも大丈夫でしょうか。 セルC4に =IF(LENB(JIS(C3))=LENB(ASC(C3))*2,C3,"") セルC5に =IF(LENB(JIS(C3))<>LENB(ASC(C3))*2,C3,"") 内容としては元セルの文字列を全角変換したときの文字数(バイト単位)が元セルの文字列を半角変換した時の文字数*2の値だったら英語と判断するというものです。 全ての文字列で満足するかわかりませんが、参考に。

noname#18526
質問者

補足

関数処理出来るんですね。ほんとうに目からうろこです。少し、理論をご教授願いたいのですが。文字コードに関する知識が少し弱いものですから。・・・ それから、もう1件追加の質問も書きました。関連です。関数で処理できれば、有難いのですが、・・・。感謝。

すると、全ての回答が全文表示されます。

関連するQ&A