Microsoft Access 掲示板

文字と数字のデータを分けたい

14 コメント
views
4 フォロー

入ったばかりの会社で、データがあるにも関わらず、紙で出力して電卓で計算して伝票を手書きしているので、少しでも効率化できたらと思い、やってみているのですが、力不足で困っています。

文字と数字の文字列のデータを文字(業者)と数値(外注単価)に分けようと、クエリでRight関数、Left関数、Mid関数、InStr関数とIIf文を使用してやってみたのですが、文字の部分も数値の部分も必ずしも決まった数ではないのと文字と数値の間に何か入っているわけでもないので、困り果てています。

何か良い方法はないでしょうか。何かヒントでもいただけるとありがたいです。

よろしくお願いいたします。

猫好き
作成: 2023/08/03 (木) 15:41:15
通報 ...
1

処理したいデータ例を提示してもらえませんか。
業者名はもちろん仮名でいいので。

2
猫好き 2023/08/03 (木) 16:08:49 c198b@a465a

ありがとうございます。

売上データの中に 規格・型番フィールドがあります。その規格・型番フィールドのデータの中に外注単価が含まれています。

以下のようなデータがあります。空白データもあります。微妙に文字列にブランクが入っているものもあります。
AR→1.50、AR→1.5、AR2.0、N 2.0、N 1.50、TS→全、ニレジ→全、中尾ー>全、フジワラ→全

3

AR→1.50
なら、AR→ という文字列データと 1.5 という数値データに分割ということですか。

TS→全 は数値はないですが、どうしますか。

4
猫好き 2023/08/03 (木) 16:17:58 c198b@a465a

言葉足らずで申し訳ありません。

そのフィールドにしか外注単価(1.50とか2.0とか)がないので、数値のみ抽出したいです。

5

標準の関数だけでやるのは難しいので、VBAでユーザー定義関数を作成してそれを利用することになりますね。

標準モジュールに下記の関数をコピーして貼り付けてください。

Public Function GetVal(s) As Currency
    If Nz(s) = "" Then Exit Function
    
    Dim i As Long
    For i = 1 To Len(s)
        If IsNumeric(Mid(s, i, 1)) Then
            GetVal = Val(Mid(s, i))
            Exit For
        End If
    Next
End Function

クエリのフィールド欄に下記の式を設定します。

外注単価: GetVal([規格・型番])

以上です。
データに数値が含まれない場合は、0 を返すようになってます。

6
猫好き 2023/08/04 (金) 08:23:08 c198b@a465a

hatena様

VBAは全く分からないのですが、仰る通りにしたら、抽出したいものが返りました。
ありがとうございます。助かりました。

自分でもう少しできるようしたいのですが、VBAは独学では難しいでしょうか。

7
hiroton 2023/08/04 (金) 10:49:57 d10a0@f966d

ACCESSの関数を使ってやるなら
その1

式1: Val("0" & Mid([フィールド],Len(Left(Left(Left(Left(Left(Left(Left(Left(Left(Left([フィールド],InStr([フィールド] & "0","0")),InStr([フィールド] & "1","1")),InStr([フィールド] & "2","2")),InStr([フィールド] & "3","3")),InStr([フィールド] & "4","4")),InStr([フィールド] & "5","5")),InStr([フィールド] & "6","6")),InStr([フィールド] & "7","7")),InStr([フィールド] & "8","8")),InStr([フィールド] & "9","9")))))

その2

式2: Val("0" & Mid([フィールド],InStr(Eval("IsNumeric(""" & Replace(Format([フィールド],Replace(String(Len([フィールド]),"&"),"&","&}{") & "&"),"}{",""")+0 & IsNumeric(""") & """)+0") & "-","-")-1))

※Eval関数が入力できないようなのでEvalを全角で記入しています

既存データの整形をしたいってだけならExcelでごりごりやるのが簡単だと思うけどね

11
hiroton 2023/08/04 (金) 14:30:03 d10a0@f966d >> 7

もうちょっと頭を柔らかくしてみる

式1: Val("0" & Mid([フィールド],InStr(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace([フィールド] & "{}","0","{}"),"1","{}"),"2","{}"),"3","{}"),"4","{}"),"5","{}"),"6","{}"),"7","{}"),"8","{}"),"9","{}"),"{}")))

無理やり短くする

式2: Val("0" & Mid([フィールド],Eval("InStr(" & Replace("//////////","/","Replace(") & """" & [フィールド] & "{}"", " & Replace("""0/1/2/3/4/5/6/7/8/9/","/",""", ""{}""), """) & "{}"")")))

※Evalは~(略)
13

そもそも「数字」を見つけたいのだから「間違ってヒットしてしまわないような単語({})を用意する必要はなく、ヒットさせる文字自体も変換する必要ないのだからもっと短くなるね

式1: Val("0" & Mid([フィールド],InStr(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace(Replace([フィールド] & "0","1","0"),"2","0"),"3","0"),"4","0"),"5","0"),"6","0"),"7","0"),"8","0"),"9","0"),"0")))

まだまだ頭が固い証拠

8

人にもよると思いますが、独学は十分可能だと思います。

まずは入門サイトを検索してみてわかりやすそうなサイトで学習してみてはどうてしょう。
あるいは、本屋さんで入門書をみてわかりやすそうなものを一冊購入して読んでみてもいいでしょう。
最近なら、YouTubeでもいろいろありそうです。

どちらにしても、読むだけではなく、そこにあるサンプルを実際に作成してみて、動作を確認しながら進めていかないと、身にはつきません。ですので、自分が将来使いそうなサンプルがあるサイトや書籍から取り組むのかいいでしょう。

9
猫好き 2023/08/04 (金) 11:44:56 c198b@a465a

hatena様

YouTubeもあるのですね。

サンプルを実際に作成→動作確認 やってみます。

的確なアドバイスありがとうございました。

10
猫好き 2023/08/04 (金) 11:51:42 c198b@a465a

hiroton様

Accessの関数を考えて下さり、ありがとうございます。
ものすごく長い計算式になってしまうのですね。

データが少なければExcelでも良いのですが、Volumeがあるので、Accessで出来ればと思い、色々試行錯誤しております。

12
hiroton 2023/08/04 (金) 15:56:22 d10a0@f966d

文字列操作はパターンが膨大になりがちで、ちょっと込み入ったことををやろうとすると考えなければならないことが数多く出てきます。「数多く」に対応しようとすれば当然計算式も長くなってしまいますね

このような目的を達成するにはプログラミング的思考が重要になってくるので、そうなれば、その思考をそのまま表現できる手法(VBA)を用いたほうがシンプルにはできるでしょう

どこまでの内容ならVBAにすべきか?というのは難しいところですけどね

14
猫好き 2023/08/08 (火) 16:26:21 c198b@a465a

hiroton様

なるほど「数字」に限定して抽出するように関数を考えれば、私でも関数でできそうな気がします。

VBA一つずつ勉強してみます。いろいろ、考えて下さりありがとうございました。