人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ACCESS2013の操作について教えてください。 Add Star
画像の列にあるタイトルですが、これをエクセルでいうところの区切り位置で分けて
2つのフィールドに分ける方法を教えて下さい。
分けて欲しいのはタイトル
裏千家茶道教科〈教養編 5〉茶人の消息 (1979年)↓
裏千家茶道教科〈教養編 5〉茶人の消息、(1979年)
のように
(1979年)など、()で西暦が表示されている部分があるモノだけを全て分けて別のフィールドに反映させたいです。宜しくお願いします。

1523905429
●拡大する

●質問者: ラフマニノフ
●カテゴリ:ウェブ制作
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

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で検証しています。


Z1000Sさんのコメント
ベストアンサーありがとうございます。

2 ● kaoato
●0ポイント

Accessの関数で氏名を氏と名に分割する方法 | できるネット
https://dekiru.net/article/15569/

上記で空白を”(”に変更したら、それっぽいことができるけど・・。


フィールドを(で機械的に分けた後は、質問文の感じでは自力で要望のデータ加工ができるのでは?

関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ