アプリ版:「スタンプのみでお礼する」機能のリリースについて

【Access2003】のクエリにて、半角数字のみを取得したいのですが。

とあるカラムに字名が入っています。
"1丁目"
"5丁目"
"8丁目"
"八事"
……
このような感じで全角及び半角数字と漢字及びかなが混在しています。
その中から、数字だけを半角にして取り出したいのです、
どんな関数をどのように駆使すればよろしいでしょうか?
上記の場合ですと、
"1"
"5"
"8"
""
……
としたいのですが。

よろしくお願いします。

A 回答 (7件)

#2です。

安直にご希望の機能を実現するには、#1と、#2を組み合わせて、
式1: IIf(extractNumeric([フィールド名])="",extnum([フィールド名]),extractnumeric([フィールド名]))
とやってはいかがでしょう。
#1のリンク先のFunction extNumは半角数字にしか対応しておりませんので、
コードの最初で全角数字を半角に変換してしまえば、全角にも対応できると思います。
stNum = StrConv(stNum, vbNarrow)
例によって、「ちょっと」試しただけですが、ご参考まで。
(追伸)
#2で、extractNumericの戻り値がVariantなのは、直し忘れですのでstringに変更願います。
また、借り物のconv2numはPrivateで良いですね。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

#1と組み合わせて、解決しました。

お礼日時:2010/07/08 16:05

参考です、補足回答します。



字名なので、郵便で使うカスタマバーコードか名寄と思います。千代田区の千は考えなくてよいはず。というならカスタマバーコードをキーワードに検索してもテクニックは見つかると思います。

単に全角数字見つけて半角というなら、クエリ上だけでなくVBAで汎用的に使う関数にしたらと思います。それができたら番地だろうが部屋番号だろうが、要は応用。フォーム、レポート、いろんな場面でも使えるはずです。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

"郵便で使うカスタマバーコード"、調べてみます。
他にもみなさまからご回答いただいたことを、応用できるようチャレンジしてみます。
非常に助かりました。

お礼日時:2010/07/08 16:15

エクセルでなくアクセスでした。

すみません。

まずは、
漢数字だけ見つけ、漢数字のままででも取り出す、を考えたらと思います。

INSTR関数で文字位置を返しますから、全角数字があるかどうかはこれで判断します。
漢字コードが決まっているので範囲判定で、というのもあります。

漢数字1文字を半角数字にするのは変換テーブルつくればクエリでも出来るので。

「丁目」や「番地」を文字削除したらすっきりします、問題なければ最初にこれでもいいでしょう。
    • good
    • 0
この回答へのお礼

再度ご回答いただき、ありがとうございました。

INSTR関数、他にも使えるシチュエーションがありそうです。
たいへん参考になります。

実は"丁目"や"番地"、"号"といった住所ではお決まりの文言だけでなく、
地名も入ってくるのでReplace関数では難しいと思い、質問させていただいた次第です。
非常に助かりました。

お礼日時:2010/07/08 16:13

質問文が説明不十分な感じをうけた。


アクセスの質問の場合、
>数字だけを半角にして取り出したいのです、
がどういうように行うのかやVBAが使えるのかなど、決めないと、やり方で回答が大幅に変わり、そっちのほうがずっと難易を決定するとおもう。
この質問の場合、それらの説明が明確でない。
(1)テーブルで隣列にーー直接は難しいと思うが
(2)フォームを使うことになろうが
  ・ 新しいフィールドを作る
   操作だけで隣のフィールドに
   関数で隣のフィールドに
   VBAで隣のフィールドに
   マクロで隣のフィールドに
  ・ 表示時に見せるだけ
   フォームのフィールドに作成
ーー
>半角数字のみを取得したいのですが
これも一読して誤解した。
全角数字を取り出し(半角)数字化したい。数字だけを抜き出すのか、
また半角数字化して元の文字列の位置にもとした戻した文字列をほしいのか。
>半角数字のみを取得したいのですが
こういう場合は全角数字を取得したいというと思う。何処にあるか位置を取得。
置換なら位置は念頭になくて良い場合が多いが。
丁目・番地以外に町字名に漢字数字がある場合があると思うが(例 三番町)これも半角数字化するのか。
これも町字名では少ないので、巻き添えを辛抱しないと、ややこしくなる。
ーー
>取得
求まった文字列を隣のフィールドに全レコードセットしたいのか、テキストボックスなどに表示だけで良いのか。
ーーー
結局、漢数字10文字(壱など無いとして)を置換で半角に指定するのが、一番易しいのでは。
ーー
もし時間があれば質問と外れるが、考えてみてください。
私のやったフォームのテキストボックスに半角数字部分を抜き出すのを挙げておく。
例データ テーブル 町名
IDフィールド2フィールド1
1南町1丁目
21条町北
3新町23
4北野456
51番町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 全角 半角 変換」で照会すれば記事が多数出てくる。まずこれを済ませて質問しましたか。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

申し訳ございません、おっしゃる通り。
下調べも不十分な上、質問内容も言葉足らずでした、、、。
VBAは多少書ける程度ですが、なるべくクエリで済まそうと思っていたり。
次回質問させていただくことがあれば、十分に気を付けます。

サンプル、ありがとうございます。
時間を作って試してみます。

お礼日時:2010/07/08 16:10

名寄せでは、こういうことは良く使われるテクニックです。


掲示板でなくネットで検索するのがサンプル多くわかりやすいです。
http://www.asahi-net.or.jp/~zn3y-ngi/YNxv258.htm …
リンク先のマクロ欄で「漢数字を半角数字」へ等事例があります。

関数というか、
サンプルを元に変換させる処理をVBAで作成し、
クエリで
出力項目:作った関数(変更前の文字列)
とさせます。

数字を見つけて変換させる処理(文字列)
 「1」が存在したら「1」へ置換
 「2」が存在したら「2」へ置換
 「3」が存在したら「3」へ置換
 ・・・・
これくらいなら、単純に10行書いた処理でも問題ないと思います。
    • good
    • 0
この回答へのお礼

ご回答、ありがとうございます。

エクセルでもこういった処理が必要になってくると予想されるので、非常に助かります。

お礼日時:2010/07/08 16:06

申し訳ありませんが、偏った回答です。

漢数字にしか対応していません。
「八十八号」とかは無いのかなと気になったもので。
標準モジュールに、下記の関数を入力します。
クエリで下記に定義する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.h …
End Function
    • good
    • 0

No23368.クエリでテキストから半角数字のみを抽出


http://www.accessclub.jp/bbs3/0062/superbeg23368 …

こちらが参考になるのでは?
    • good
    • 1
この回答へのお礼

ご回答、ありがとうございます。

リンク先、たいへん参考になりました。

お礼日時:2010/07/08 16:03

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!