▽1
●
Z1000S ●100ポイント ![]() |
具体的にどういった結果が欲しいのかわかりません。
質問がザックリしたものなので、回答もザックリしてます。
推測となりますが、手順としては
1.丸括弧で西暦年が表示されているレコードを抽出し
2.そのレコードのタイトルを西暦年とそれより前に分割し
3.別のフィールドに反映???
・・何をどう反映するの???
・・元となるタイトルフィールドも更新するの?
とりあえず考えられるのは、
1.更新クエリを作って実行する。
2.ADOのExecuteメソッドで、SQL(UPDATE)を実行する。
3.ADOのレコードセットで、対象レコードをループして更新する。
のいずれかになるのでは?
文字列の分割に関しては、
()で西暦が表示されている部分があるモノ
は、「4桁の数字」と「年」の文字を丸括弧でくくってある文字列とみなし、
かつ、それが文字列の最後に位置するとして良いのであれば、下記の関数
getTitleMainで、上記年(丸括弧を含む)より前の部分を取得でき、
getTitleYearで、上記年(丸括弧を含む)を取得できます。
提示されたサンプル文字列「 裏千家茶道教科〈教養編 5〉茶人の消息 (1979年)」
を例にすれば、
getTitleMain("裏千家茶道教科〈教養編 5〉茶人の消息 (1979年)")で、
"千家茶道教科〈教養編 5〉茶人の消息 "を取得できます。
getTitleYear("裏千家茶道教科〈教養編 5〉茶人の消息 (1979年)")で、
"(1979年)"が取得できます。
また、丸括弧でくくられた西暦+年を含むレコードの抽出条件は、
タイトルフィールド Like "*[((]####年[))]"
でいけると思います。
文字列分割関数
'参照設定:Microsoft VBScript Regular Expressions 5.5 Public Function getTitleMain(ByVal sSource As String) As String Dim sResult(1) As String Call splitTarget(sSource, sResult) getTitleMain = sResult(0) End Function Public Function getTitleYear(ByVal sSource As String) As String Dim sResult(1) As String Call splitTarget(sSource, sResult) getTitleYear = sResult(1) End Function Private Sub splitTarget(ByVal sSource As String, ByRef sResult() As String) Dim re As New RegExp Dim mc As MatchCollection Dim m As Match With re '正規表現パターン .Pattern = "^(.*)((\(|()([0-90-9]{4}年)(\)|)))$" '大文字、小文字を区別しない .IgnoreCase = True '複数マッチを行わない .Global = False End With If re.Test(sSource) = False Then 'パターンにマッチしなければ、インデックス0にパラメータをそのまま返す sResult(0) = sSource sResult(1) = "" Set re = Nothing Exit Sub End If 'パターンにマッチする部分を検索、取得 Set mc = .Execute(sSource) Set m = mc.Item(mc.Count - 1) sResult(0) = m.SubMatches(0) sResult(1) = m.SubMatches(1) Set m = Nothing Set mc = Nothing Set re = Nothing End Sub
現状で提供できる情報は、これくらいでしょうか。
更新に必要なデータは、ここいらあたりかなと思っていますが・・・
ちなみに、私はAccessを持っていないので、上記コードはExcelで検証しています。
Accessの関数で氏名を氏と名に分割する方法 | できるネット
https://dekiru.net/article/15569/
上記で空白を”(”に変更したら、それっぽいことができるけど・・。
フィールドを(で機械的に分けた後は、質問文の感じでは自力で要望のデータ加工ができるのでは?