• ベストアンサー

文字列に特定の文字の有無を調べたい。

ある文字列に特定の文字が入っているか否かを調べたいのです。 AccessでVBAを使用して有無を調べたいんです。 具体的には下記の通りです。 カナ氏名が入力されているフィールドを検索して文字列を抽出したいんです。 "抽出"をカナにすると"チュウシュツ"ですよね。 所が私が使用しているテーブルのカナ氏名が入力されているフィールドには "抽出"は"チユウシユツ"と入力されているんです。 "チュウシュツ"と入力しても"抽出"は表示されず、"チユウシユツ"と入力しなければ "抽出"は表示されません。 従って"チュウシュツ"とキーボード入力してから先頭から2文字目と5文字目の "ュ"を"ユ"に再度変換しなければならないんです。 何か簡単な関数やプロシージャがないでしょうか? 何分初心者なんで下記の様な凄く長いプロシージャしか思い浮かびません。 宜しくお願いいたします。 (例) Public Function Kana_change() Dim kana As String '左から2桁目が小文字の時の変換 If Mid(kana, 2, 1) = "ァ" Then kana = Right(kana, 1) & "ア" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ィ" Then kana = Right(kana, 1) & "イ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ゥ" Then kana = Right(kana, 1) & "ウ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ェ" Then kana = Right(kana, 1) & "エ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ォ" Then kana = Right(kana, 1) & "オ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ャ" Then kana = Right(kana, 1) & "ヤ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ュ" Then kana = Right(kana, 1) & "ユ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ョ" Then kana = Right(kana, 1) & "ヨ" & Mid(kana, 3, 13) Else kana = kana End If If Mid(kana, 2, 1) = "ッ" Then kana = Right(kana, 1) & "ツ" & Mid(kana, 3, 13) Else kana = kana End If End Sub End Function

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

  • ベストアンサー
回答No.2

深くは試してませんが、以下のようなのはどうでしょうかね。 small2big に "チュウシュツ" を与えると "チユウシユツ" が返ってきます。 関数に与えた文字を 1文字ずつ切り出し、 準備しておいた小文字群の中から検索します。 見つかった場合は対応する大文字を大文字郡の中から抽出して置換。 見つからなかった場合は元の文字のまま。 下記コード各行の先頭は全角スペースでインデントしていますので、VBE に持っていく時は半角スペースに直してください。 Function small2big(aSource As String) As String  Const beforeChars As String = "ぁぃぅぇぉっゃゅょァィゥェォッャュョ"  Const afterChars As String = "あいうえおつやゆよアイウエオツヤユヨ"  Dim returnValue As String  returnValue = ""  Dim position As Long  Dim sourceLength As Long  sourceLength = Len(aSource)  Dim i As Long  If sourceLength >= 1 Then   For i = 1 To sourceLength    position = InStr(1, beforeChars, Mid(aSource, i, 1), vbBinaryCompare)    If position >= 1 Then     returnValue = returnValue & Mid(afterChars, position, 1)    Else     returnValue = returnValue & Mid(aSource, i, 1)    End If   Next  End If  small2big = returnValue End Function

sigenobu120
質問者

補足

ありがとうございます。 大変参考になります。もう殆ど日本語化出来ない文になってきましたよ。 早速Accessで実行して見た所下記の様な事になってしまいました。 「ByRef引数の型が一致しません」とPOPUPが出ました。 どうしてでしょうか?

その他の回答 (2)

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.3

 ほう、ANo.2の方のはすばらしいな。 > 「ByRef引数の型が一致しません」とPOPUPが出ました。 見たところ特に問題はなさそうだが・・・・。バージョンや使い方に何かあるのかも知れんな。このメソッドは引数がStringなので、(呼び出し側で)ObjectやIntegerを渡す事はできない。当方、おうちにAccessどころかExcelも無いので試せないのが残念だ。  インスパイアされてソースを整理してみた。ゎとヮが入っとらんかったのに気づいたのでそれも加えてある。元ネタが良いので整理するだけでずいぶんとコンパクトになったもんだ。  これを、標準モジュールというところに入れて、使いたいところからはそいつを呼び出すようにすると良いだろう。ByRefがどこで一致しないのかよく分からないので適当にByValにしてみた。 Public Function small2Big(ByVal aSource As String) As String   Const beforeChars As String = "ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮ"   Const afterChars As String = "あいうえおつやゆよわアイウエオツヤユヨワ"   Dim tempChar As String   Dim position As Long   Dim i As Long   Dim sourceLength As Long   sourceLength = Len(aSource) ' オリジナル文字列の長さ取得   small2Big = "" ' 返す文字列を初期化   For i = 1 To sourceLength Step 1 ' 文字数分ループ     tempChar = Mid(aSource, i, 1) ' オリジナル文字列から一文字取得     position = InStr(1, beforeChars, tempChar, vbBinaryCompare) ' それが小文字か?     If position > 0 Then ' 小文字だ       tempChar = Mid(afterChars, position, 1) ' 大文字で置き換え     End If     small2Big = small2Big & tempChar ' 返す文字列に連結   Next End Function ポイントはInStrで小文字の場所をインデックスとし、同じ場所に格納してある大文字の一文字をインデックスによって切り出しているところやね。 これらのソースを適当にいじってみる事で色々勉強になれば幸いだ。 ちなみに、こんな書き方もできる。VBではMidを左辺値にする事で、文字列の部分入れ替えができるのだ。だが、他の言語では一般的ではないので多用は避けるべきだろう。 Public Function small2Big(ByVal aSource As String) As String   Const beforeChars As String = "ぁぃぅぇぉっゃゅょゎァィゥェォッャュョヮ"   Const afterChars As String = "あいうえおつやゆよわアイウエオツヤユヨワ"   Dim position As Long   Dim i As Long   Dim sourceLength As Long   sourceLength = Len(aSource)   small2Big = aSource   For i = 1 To sourceLength Step 1     position = InStr(1, beforeChars, Mid(aSource, i, 1), vbBinaryCompare)     If position > 0 Then       Mid(small2Big, i, 1) = Mid(afterChars, position, 1)     End If   Next End Function

sigenobu120
質問者

お礼

丁寧に指導して頂き大変分かりやすかったです。 ありがとうございました。

  • anmochi
  • ベストアンサー率65% (1332/2045)
回答No.1

んー、Kana_change()の考え方で良いのであれば、 Public Function Kana_change(ByRef motokana As String) As String Dim i As Long Dim tempchar As String Kana_change = "" For i = 1 To Len(motokana) Step 1 tempchar = Mid$(motokana, i, 1) Select Case tempchar Case "ぁ" tempchar = "あ" Case "ぃ" tempchar = "い" ・・・ (以下、ぅぇぉゃゅょっァィゥェォャュ) Case "ョ" tempchar = "ヨ" Case "ッ" tempchar = "ツ" End Select Kana_change = Kana_change & tempchar Next End Function で、何文字目に入っているかに関わらず小文字を大文字に変えるメソッドってできそうだけど。今さくさくーっと書いただけで動作確認してないので動かしてみる時は試験してください。これに先立って半角カナを全角カナにしたい場合はStrConvを使えば良いでしょう。 "ぁぃぅぇぉゃゅょっァィゥェォャュョッ" "あいうえおやゆよつアイウエオヤユヨツ" とMid$とInStrを使えばもう少しスマートにできるかも知れないね。

sigenobu120
質問者

お礼

早速の回答ありがとうございました。 さくさくーっと書ける事が素晴らしいですね。 羨ましい限りでそうなりたいものです。 自分もInStrを使用すれば該当の文字を発見できる事は知ってたんですが、 該当文字の位置・場所の数字だけ分かってもどうしようも出来ませんでした。 又、StrConvも知ってたんですが今回は半角カナ→全角カナや 全角カナ→半角カナという事ではないので困ってしまったんですね。 今の実力だとパッとプロシージャを見ても分からない所が沢山あります。 動作確認もしながら学習したいと思います。 先ずはありがとうございました。

関連するQ&A