1523905429 ACCESS2013の操作について教えてください。 Add Star

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

回答の条件
  • 1人1回まで
  • 13歳以上
  • 登録:2018/04/17 04:03:49
  • 終了:2018/04/19 09:31:45

ベストアンサー

id:Z1000S No.1

Z1000S回答回数25ベストアンサー獲得回数202018/04/17 22:47:34

ポイント100pt

具体的にどういった結果が欲しいのかわかりません。
質問がザックリしたものなので、回答もザックリしてます。

推測となりますが、手順としては
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で検証しています。

id:Z1000S

ベストアンサーありがとうございます。

2018/04/19 21:15:02

その他の回答(1件)

id:Z1000S No.1

Z1000S回答回数25ベストアンサー獲得回数202018/04/17 22:47:34ここでベストアンサー

ポイント100pt

具体的にどういった結果が欲しいのかわかりません。
質問がザックリしたものなので、回答もザックリしてます。

推測となりますが、手順としては
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で検証しています。

id:Z1000S

ベストアンサーありがとうございます。

2018/04/19 21:15:02
id:kaoato No.2

kaoato回答回数142ベストアンサー獲得回数602018/04/19 07:06:28

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

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


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

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません