- ベストアンサー
【Access2003】のクエリにて、半角数字のみを取得したいのですが
【Access2003】のクエリにて、半角数字のみを取得したいのですが。 とあるカラムに字名が入っています。 "1丁目" "5丁目" "8丁目" "八事" …… このような感じで全角及び半角数字と漢字及びかなが混在しています。 その中から、数字だけを半角にして取り出したいのです、 どんな関数をどのように駆使すればよろしいでしょうか? 上記の場合ですと、 "1" "5" "8" "" …… としたいのですが。 よろしくお願いします。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
#2です。安直にご希望の機能を実現するには、#1と、#2を組み合わせて、 式1: IIf(extractNumeric([フィールド名])="",extnum([フィールド名]),extractnumeric([フィールド名])) とやってはいかがでしょう。 #1のリンク先のFunction extNumは半角数字にしか対応しておりませんので、 コードの最初で全角数字を半角に変換してしまえば、全角にも対応できると思います。 stNum = StrConv(stNum, vbNarrow) 例によって、「ちょっと」試しただけですが、ご参考まで。 (追伸) #2で、extractNumericの戻り値がVariantなのは、直し忘れですのでstringに変更願います。 また、借り物のconv2numはPrivateで良いですね。
その他の回答 (6)
- layy
- ベストアンサー率23% (292/1222)
参考です、補足回答します。 字名なので、郵便で使うカスタマバーコードか名寄と思います。千代田区の千は考えなくてよいはず。というならカスタマバーコードをキーワードに検索してもテクニックは見つかると思います。 単に全角数字見つけて半角というなら、クエリ上だけでなくVBAで汎用的に使う関数にしたらと思います。それができたら番地だろうが部屋番号だろうが、要は応用。フォーム、レポート、いろんな場面でも使えるはずです。
お礼
ご回答、ありがとうございます。 "郵便で使うカスタマバーコード"、調べてみます。 他にもみなさまからご回答いただいたことを、応用できるようチャレンジしてみます。 非常に助かりました。
- layy
- ベストアンサー率23% (292/1222)
エクセルでなくアクセスでした。すみません。 まずは、 漢数字だけ見つけ、漢数字のままででも取り出す、を考えたらと思います。 INSTR関数で文字位置を返しますから、全角数字があるかどうかはこれで判断します。 漢字コードが決まっているので範囲判定で、というのもあります。 漢数字1文字を半角数字にするのは変換テーブルつくればクエリでも出来るので。 「丁目」や「番地」を文字削除したらすっきりします、問題なければ最初にこれでもいいでしょう。
お礼
再度ご回答いただき、ありがとうございました。 INSTR関数、他にも使えるシチュエーションがありそうです。 たいへん参考になります。 実は"丁目"や"番地"、"号"といった住所ではお決まりの文言だけでなく、 地名も入ってくるのでReplace関数では難しいと思い、質問させていただいた次第です。 非常に助かりました。
- imogasi
- ベストアンサー率27% (4737/17069)
質問文が説明不十分な感じをうけた。 アクセスの質問の場合、 >数字だけを半角にして取り出したいのです、 がどういうように行うのかやVBAが使えるのかなど、決めないと、やり方で回答が大幅に変わり、そっちのほうがずっと難易を決定するとおもう。 この質問の場合、それらの説明が明確でない。 (1)テーブルで隣列にーー直接は難しいと思うが (2)フォームを使うことになろうが ・ 新しいフィールドを作る 操作だけで隣のフィールドに 関数で隣のフィールドに VBAで隣のフィールドに マクロで隣のフィールドに ・ 表示時に見せるだけ フォームのフィールドに作成 ーー >半角数字のみを取得したいのですが これも一読して誤解した。 全角数字を取り出し(半角)数字化したい。数字だけを抜き出すのか、 また半角数字化して元の文字列の位置にもとした戻した文字列をほしいのか。 >半角数字のみを取得したいのですが こういう場合は全角数字を取得したいというと思う。何処にあるか位置を取得。 置換なら位置は念頭になくて良い場合が多いが。 丁目・番地以外に町字名に漢字数字がある場合があると思うが(例 三番町)これも半角数字化するのか。 これも町字名では少ないので、巻き添えを辛抱しないと、ややこしくなる。 ーー >取得 求まった文字列を隣のフィールドに全レコードセットしたいのか、テキストボックスなどに表示だけで良いのか。 ーーー 結局、漢数字10文字(壱など無いとして)を置換で半角に指定するのが、一番易しいのでは。 ーー もし時間があれば質問と外れるが、考えてみてください。 私のやったフォームのテキストボックスに半角数字部分を抜き出すのを挙げておく。 例データ テーブル 町名 ID フィールド2 フィールド1 1 南町1丁目 2 1条町北 3 新町23 4 北野456 5 1番町15軒家16 ーー フォームにテキストボックスを2つ設ける。 テキスト4とテキスト6 テキスト4のプロパティのデータのコントロールソース フィールド1 フォームのイベントに Private Sub Form_Current() Dim a As String テキスト4.SetFocus a = テキスト4.Text テキスト6.SetFocus テキスト6.Text = Module1.IsKanji_hankaku(a) End Sub ーー module1に WEBに記事あり、一部誤りらしいところ修正して Public Function IsKanji_hankaku(Myword As String) '全角と半角文字が混在したフィールドから半角文字を抽出する関数 '2個所に出てくると両者結合されてしまう(小生の注) Dim pos As Integer Dim Tempword As String Dim strANSI As String Dim lchar As Integer, lbyte As Integer pos = Len(Myword) Do Until Len(Myword) = 0 strANSI = StrConv(Mid(Myword, 1, 1), vbFromUnicode) lchar = Len(Mid(Myword, 1, 1)) lbyte = LenB(strANSI) If lchar * 2 <> lbyte Then Tempword = Tempword & Mid(Myword, 1, 1) End If pos = pos - 1 Myword = Right(Myword, pos) Loop IsKanji_hankaku = Tempword End Function ーーー フォームを表示して、レコード移動ボタン?や?をクリックするとそのレコードのフィールド1 のなかの半角文字を抜き出して、テキスト6に表示する。 ーーー 言いたいことは、最終の要望形によって複雑になったり、使う仕掛けが変わることを例示している。 ーーー 「半角数字化して元の文字列の位置にもとした戻した文字列」がほしいときは、上記関数は置換の関数などを各レコードにつき10文字分繰り返すのが易しいと思う。 ーーー VBAはどうも、というなら、質問にそのことを明記しないとならない。 Access常備の関数に全角数字を半角に直す関数が無いので、難しいと思うが、質問してみる手はある。 ーーー Googleででも「access 全角 半角 変換」で照会すれば記事が多数出てくる。まずこれを済ませて質問しましたか。
お礼
ご回答、ありがとうございます。 申し訳ございません、おっしゃる通り。 下調べも不十分な上、質問内容も言葉足らずでした、、、。 VBAは多少書ける程度ですが、なるべくクエリで済まそうと思っていたり。 次回質問させていただくことがあれば、十分に気を付けます。 サンプル、ありがとうございます。 時間を作って試してみます。
- layy
- ベストアンサー率23% (292/1222)
名寄せでは、こういうことは良く使われるテクニックです。 掲示板でなくネットで検索するのがサンプル多くわかりやすいです。 http://www.asahi-net.or.jp/~zn3y-ngi/YNxv258.html#9 リンク先のマクロ欄で「漢数字を半角数字」へ等事例があります。 関数というか、 サンプルを元に変換させる処理をVBAで作成し、 クエリで 出力項目:作った関数(変更前の文字列) とさせます。 数字を見つけて変換させる処理(文字列) 「1」が存在したら「1」へ置換 「2」が存在したら「2」へ置換 「3」が存在したら「3」へ置換 ・・・・ これくらいなら、単純に10行書いた処理でも問題ないと思います。
お礼
ご回答、ありがとうございます。 エクセルでもこういった処理が必要になってくると予想されるので、非常に助かります。
- mitarashi
- ベストアンサー率59% (574/965)
申し訳ありませんが、偏った回答です。漢数字にしか対応していません。 「八十八号」とかは無いのかなと気になったもので。 標準モジュールに、下記の関数を入力します。 クエリで下記に定義するextractNumeric関数を使うと、 新宿区千二百三十四番地は1234を戻しますが、 千代田区千二百三十四番地は頭の1000になってしまって工夫の余地ありですね(^^;) なお、Access2000で「ちょっと」試験しております。 Function extractNumeric(targetString As String) As Variant Dim buf As String buf = subMatchWord(targetString, "([一二三四五六七八九十百千]+)") extractNumeric = conv2num(buf, Len(buf), 0) End Function Private Function subMatchWord(targetString As String, matchString As String) As String Dim regEX As Variant Dim Matches As Variant Dim match As Variant Set regEX = CreateObject("VBScript.RegExp") regEX.MultiLine = False regEX.Pattern = matchString regEX.ignorecase = True regEX.Global = False On Error GoTo errorHandle Set Matches = regEX.Execute(targetString) If Matches(0).subMatches.Count > 0 Then subMatchWord = Matches(0).subMatches.Item(0) Else subMatchWord = "" End If Set Matches = Nothing Set regEX = Nothing Exit Function errorHandle: subMatchWord = "" End Function Function conv2num(skan As String, ileng, op) As String ’下記から借用します。Word用の関数ですが、Accessでも大丈夫でした。 'by洋々亭さん。 ’http://www.hi-ho.ne.jp/tomita/tips/tips_wd_001.html End Function
- n-jun
- ベストアンサー率33% (959/2873)
No23368.クエリでテキストから半角数字のみを抽出 http://www.accessclub.jp/bbs3/0062/superbeg23368.html こちらが参考になるのでは?
お礼
ご回答、ありがとうございます。 リンク先、たいへん参考になりました。
お礼
ご回答、ありがとうございます。 #1と組み合わせて、解決しました。