AccessVBAメモ

AccessVBAで作ったサンプルコード集

AccessVBA フィールド内の指定文字を目印に分割する

スポンサーリンク

「123456-01」といったコードなどをハイフンを境に前と後ろで分割して取得したい、

「田中 太郎」といった姓と名をスペースで区切って分割して取得したいなど、

指定した文字などを目印にそれ以降と以前で分割して別のフィールドに保存したいケースなどに使えます。

ASCIIコードの改行文字などにも対応可能です。

 

サンプルコードの定義は、

テーブル1:元のテーブル

Fld:分割したいフィールド

Fld1:分割後のフィールドNo1

Fld2:分割後のフィールドNo2

です。

以下、VBAの記述

'---------------------------------------------------------------------------------------------

Dim db As Database

Dim rst As Recordset

Dim i As Integer  'フィールド内の分割数をカウント

Dim strArray() As String 'Fld内を分割したものを格納する配列

 

Set db = CurrentDb

Set rst = db.OpenRecordset("テーブル1")

 

If rst.RecordCount <> 0 then

Do until rst.EOF

rst.Edit

If IsNull(rst!Fld) Or Len(trim(rst!Fld)) = 0 then

i=0

else

strArray = Split(rst!Fld,"-")

'Split関数で指定した文字(カッコ内の""で囲った部分)等でFld内のテキストを分割する

'例えばASCIIコードの改行文字なら Split(rst!Fld,Chr(10))

i=Ubound(strArray,1)+1

'Ubound関数で配列数をカウント

End If

Select Case i

Case Is = 1

rst!Fld1 = strArray(0)

Case Is >=2

rst!Fld1 = strArray(0)

rst!Fld2= strArray(1)

'分割するフィールド数に応じてCaseを追加する。例では2つ。

End Select

rst.Update

rst.MoveNext

Loop

db.Close

Set db = Nothing

'--------------------------------------------------------------------------------------------------

以上、VBAの記述終わり。

個人的には予めMAXの分割数を決まっていて、それに対応して分割した内容を格納するケースばかりです。(つまり上限数以上に分割される場合は、フィールドの先頭から数えて上限以降の内容は格納してません)

分割数が予め決まっていない、分割可能な全データを各々フィールドを作成して格納したい場合には、

1)全レコードの分割数を一旦カウントして、最大の分割数を取得

2)最大の分割數に応じてフィールドを作成

でイケそうな気がします・・・?

その場合はSelectではなく、For文を使う感じになるでしょうか。。。

 

Dim j As Integer

Dim strFld as String

i=Ubound(strArray,1)

strFld = "Fld"

For j=0 to i

rst(strFld & j) = strArray(j)

rst!(Fld(j))=strArray(j)

Next i

 ※一旦フィールド名(Fld)を変数に代入して呼び出すレコードセットを括弧でくくって変数&添字にする修正(青文字)が必要のようでした。