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)を変数に代入して呼び出すレコードセットを括弧でくくって変数&添字にする修正(青文字)が必要のようでした。