Kumpel, pracujący i zdobywający doświadczenie w USA, zwrócił się do mnie z prośbą o pomoc w sprawie tabelki w Accessie. Problem polegał na tym, że istniała kolumna, która zawierała dane w postaci tekstowej – nazwy kategorii oddzielone przecinkami. Należało rozdzielić te nazwy na oddzielne rekordy, zachowując ten sam model encji.

Czyli jeżeli jedna pozycja zawierała w kolumnie ‘Category’ : CN, CoI, RU
To powinny być w miejsce tego rekordu 3 rekordy, a w kategorii wpisane : CN , poniżej CoI, a trzecie RU

Problem mógłby rozwiązać jakiś prosty skrypcik. Znalazłem na forach dyskusje na temat obiektów klasy Recordset w VBA, więc napisałem procedurę:
Option Compare Database
Sub reproduce()
Dim db As DAO.Database, rs As DAO.Recordset, dest As DAO.Recordset, table As String
Set db = CurrentDb
table = InputBox(“Please insert table name, e.g. like: ” & vbNewLine & “[Table no 2]“)
Set rs = db.OpenRecordset(“SELECT * FROM ” & table)
Set dest = db.OpenRecordset(“SELECT * FROM ” & table)
While Not rs.EOF
Dim txt As String
Dim x As Variant
Dim i As Long
txt = rs.Fields(6)
x = Split(txt, “,”)
For i = 0 To UBound(x)
dest.AddNew
For j = 0 To rs.Fields.Count – 1
dest.Fields(j) = rs.Fields(j)
Next j
dest.Fields(6) = Trim(x(i))
dest.Update
Next i
rs.Delete
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
End Sub
Druga sprawa – nazwa choroby bez myślników, a z przecinkami.
Jeżeli w rekordzie jest wpisane w kolumnie ‘choroba’:
Arthritis-Rheumatoid Arthritis
To powinno to wyglądać tak:
Arthritis, Rheumatoid Arthritis
Problem rozwiązuje następujący kodzik:
Option Compare Database
Sub reproduceDisease()
Dim db As DAO.Database, rs As DAO.Recordset, table As String, line As String
Set db = CurrentDb
table = InputBox(“Please insert table name, e.g. like: ” & vbNewLine &
“[Table No 2]“)
Set rs = db.OpenRecordset(“SELECT * FROM ” & table)
While Not rs.EOF
Dim txt As String
Dim x As Variant
Dim i As Long
txt = rs.Fields(7)
x = Split(txt, “-”)
line = “”
For i = 0 To UBound(x) – 1
line = line & x(i) & “, “
Next i
rs.Edit
rs(“Disease/disorder”).Value = line & x(UBound(x))
rs.Update
rs.MoveNext
Wend
rs.Close
Set rs = Nothing
End Sub
Miłe zaskoczenie – Visual Basic for Access zawiera funkcję Split() pozwalajaca na rozdzielenie Stringów, tak jak java za pomocą klasy StringTokenizer. I nie tylko spacje, ale również dowolne znaki.