ACCESS2003の質問です。

下記のようなテーブルがあります。

[受注番号] [商品]

12345   A
      *******

67890   B
      -------
       C
      -------
       D
      *******

68427   F
      -------
       E
      *******

レコード数は3です。
商品フィールドには、改行が入っています。
-------や*******は、段落の区切りとしていれてある
そのままの文字列です。
商品が複数の場合は、間に-------が入り、
1番最後には、かならず*******が入っています。

これを
[受注番号] [商品]
12345    A
67890    B
67890    C
67890    D
68427    F
68427    E

という6つのレコードに分けたいです。
方法を教えてください。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/03/09 15:17:06
  • 終了:2010/03/09 18:07:42

ベストアンサー

id:GreenStar No.1

GreenStar回答回数192ベストアンサー獲得回数462010/03/09 16:57:32

ポイント100pt
Sub cr()
    ' 改行で行分割するコード
    ' 変数宣言 今回はDAOを使った。ツール→参照設定でMicrosoft DAO 3.6 Object Library にチェック!
    ' http://support.microsoft.com/kb/825796/ja も見ておくと良い
    Dim db As DAO.Database
    Dim rs1 As DAO.Recordset, sqlStr1 As String
    Dim rs2 As DAO.Recordset, sqlStr2 As String
    Dim splitStr As String, splitArray As Variant, splitArrayUbound As Long
    Dim i As Long, d As String
    
    ' 読み込むテーブル(SQLで書く)
    sqlStr1 = "SELECT * FROM テーブルA"
    ' 書き込むするテーブル(テーブル名だけ書く。テーブルは事前に作っておくこと)
    sqlStr2 = "テーブルB"
    ' 改行コードの指定
    'Excelで作ったデータの場合は Chr(10) のみにするなど適宜変更必要
    splitStr = Chr(13) + Chr(10)
    
    ' データ削除実行(確認メッセージがウザイ場合はSetWarnings コメントをはずす)
    ' DoCmd.SetWarnings False
    DoCmd.RunSQL "DELETE FROM " + sqlStr2
    ' DoCmd.SetWarnings True
    
    ' レコードセット準備
    Set db = CurrentDb
    Set rs1 = db.OpenRecordset(sqlStr1, dbOpenForwardOnly)
    Set rs2 = db.OpenRecordset(sqlStr2, dbOpenTable)
    
    ' 分割と書き込みの作業
    Do Until rs1.EOF
        splitArray = Split(rs1!商品, splitStr)
        splitArrayUbound = UBound(splitArray)
        d = ""
        For i = 0 To splitArrayUbound
            If splitArray(i) = "-----" Or splitArray(i) = "*****" Then
                rs2.AddNew
                rs2!受注番号 = rs1!受注番号
                rs2!商品 = d
                rs2.Update
                d = ""
            ElseIf d = "" Then
                d = splitArray(i)
            Else
                d = d + Chr(13) + Chr(10) + splitArray(i)
            End If
        Next i
        rs1.MoveNext
    Loop
    
    ' 変数開放(自動的に開放してくれるのだがVB系では必須と思っておいたほうが無難)
    rs2.Close: Set rs2 = Nothing
    rs1.Close: Set rs1 = Nothing
    db.Close: Set db = Nothing

    ' 完了報告(メッセージがウザイ場合はコメント化あるいは消す)
    MsgBox ("完了")
End Sub
id:rupopon

ありがとうございました。

上記のテーブルを作って試してみたのですが

完了してもテーブルBが空のままです。

分岐のところで、すべてElseにいってしまっているようです。

また、splitArray(i) =インデックスが有効範囲にありません

と出てくるときがあるのですが、関係あるでしょうか。

2010/03/09 17:23:46
  • id:GreenStar
    -------や******* は必ず偶数行になってると考えてOK?
  • id:rupopon
    いえ、必ずではないです。
    よろしくお願いします。
  • id:GreenStar
    了解です。少し改良してから回答します。
  • id:HALSPECIAL
    HALSPECIAL 2010/03/09 16:46:50
    テーブルの設計を見直すのがベストかと
  • id:rupopon
    ありがとうございます。
    残念ながら、テーブルはいじれないです。
    split関数を使えないかなあ・・と思ってます。
  • id:bmax
    このテーブルはこの2列だけでしょうか?
    商品Cのレコードの受注番号は空白?
    もしそうであれば不可能ではないかな…
    Excelのデータと違って並び順が保証されるものじゃないし。
  • id:rupopon
    ありがとうございます。
    テーブルは2列です。
    上のテーブルでいくと、
    レコード数は3で
    2行目のレコードにB~Dが入っている状態です。
  • id:bmax
    すいません。
    質問文を見落とし、レコード数を完全に勘違いしてました。
    丁寧に回答いただき申し訳ないです。

  • id:GreenStar
    動かしたものを貼ってるので、コード中にコメントしてある箇所の調整と、
    あと書き忘れたのですが"-----" と"*****"を現実のものに合わせるとか、やってもらえれば動くはずなのですが?
  • id:rupopon
    すみません"-----"の"-"の数を変えたところ動きました。
    たいへんありがとうございました。

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

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

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

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