ACCESS でCSV出力ツール作ってみた(その2)

 データ並べ替え部分です。ここがこのACCESSのキモかも
しれないです。まあ頭は使いました。(笑)


Function Sorter(strConfTableName As String, strInTableName As String, strOutTableName As String) As String
'=========================================================================
'関数名:Sorter (ファイル変換処理用)
'
'機能 :入力テーブルを受け取って定義テーブルに設定されたとおりに並替して
'    指定されたテーブルに出力する。
'
'使い方:strRet = SampleTemplate1("定義テーブル名","入力テーブル名","出力テーブル名")
'
'戻り値: "True" 正常終了
'         "False" 異常終了(エラーNOを持たせる場合はそれぞれで個別定義必要)
'=========================================================================

    Const MAXBYTE = 255         '出力テーブル作成時のフィールドデータのサイズ
    Const COLUMCNT = 256        'カラム数

   
'//* 変数定義
    Dim strConf As String       '定義テーブル
    Dim strIFile As String      '入力テーブル
    Dim strOFile As String      '出力先テーブル
   
    Dim strClum(COLUMCNT) As String
    Dim strFieldName(COLUMCNT) As String       'フィールド名(カラム数分の配列)
    Dim balRetTableExists As Boolean
   
    Dim db_Dao(2) As DAO.Database
    Dim Rst_Dao(2) As DAO.Recordset
    Dim Qdf_Dao As DAO.QueryDef
   
    Dim dbsCurrent As DAO.Database
    Dim strSQL As String
    Dim tdfNew As DAO.TableDef
    Dim tdffld(COLUMCNT) As DAO.Field
   
    Dim intFieldNO(COLUMCNT) As Integer '入力テーブルのカラム位置
    Dim intFCNT As Integer              '上記テーブル内の値をセット
    Dim intLASTDATA   As Integer        '保存されているデータのレコード数
    Dim intFieldLast  As Integer        'フィールド数の最大値
   
'//* 引数のエラーチェック
    Sorter = "False"                    '関数初期化
   
    If strConfTableName <> "" And strInTableName <> "" And strOutTableName <> "" Then
        strConf = strConfTableName
        strIFile = strInTableName
        strOFile = strOutTableName
    Else
        Exit Function
    End If
   
    '入力テーブル存在チェック
    balRetTableExists = TableOparate.TableExists(strIFile)
    If balRetTableExists = False Then
        Exit Function
    End If
   
    '定義テーブル存在チェック
    balRetTableExists = TableOparate.TableExists(strConf)
    If balRetTableExists = False Then
        Exit Function
    End If
   

'//* ワークテーブルの存在を確認した後,ワークテーブルが存在すればワークテーブル削除
    balRetTableExists = TableOparate.TableExists(strOFile)
    If balRetTableExists = True Then
        DoCmd.DeleteObject acTable, strOFile
    End If

'//* 定義テーブル読込
    strSQL = ""
    strSQL = strSQL & " SELECT " & strConf & ".*"
    strSQL = strSQL & " FROM "
    strSQL = strSQL & strConf
    strSQL = strSQL & " WHERE ((" & strConf & ".f_OutputFlg) = '1')"
    strSQL = strSQL & " ORDER BY " & strConf & ".f_OutputColum;"
    strSQL = strSQL & ""

'    'デバッグ用
'    Debug.Print strSQL
   
    Set db_Dao(0) = CurrentDb
    Set Qdf_Dao = db_Dao(0).CreateQueryDef("", strSQL)
    Set Rst_Dao(0) = Qdf_Dao.OpenRecordset()
   
   
'//* 出力テーブル作成
    Set dbsCurrent = CurrentDb
    Set tdfNew = dbsCurrent.CreateTableDef(strOFile)
    i = Rst_Dao(0).RecordCount
   
    If i = 0 Then        'レコード件数が0の場合は処理できない。
         Exit Function
    Else
        'フィールド数を取得する
        Rst_Dao(0).MoveLast
        intFieldLast = Rst_Dao(0).RecordCount
        Rst_Dao(0).MoveFirst
    End If
               
    Do Until k = intFieldLast
        strFieldName(k) = Nz(Rst_Dao(0).Fields(2))                              'フィールド名
        Set tdffld(k) = tdfNew.CreateField(strFieldName(k), dbText, MAXBYTE)
        tdffld(k).AllowZeroLength = True                                        '空文字列の許可
        tdfNew.Fields.Append tdffld(k)
       
        intFieldNO(k) = Nz(Rst_Dao(0).Fields(0).Value)  '入力テーブルカラムの値をセット
       
'    Debug.Print k & "テーブル作成時格納" & intFieldNO(k)
   
        Rst_Dao(0).MoveNext
        k = k + 1
    Loop

    tdfNew.Fields.Refresh
    dbsCurrent.TableDefs.Append tdfNew
    dbsCurrent.TableDefs.Refresh
    dbsCurrent.Close

    Set db_Dao(1) = CurrentDb
    Set Rst_Dao(1) = db_Dao(1).OpenRecordset(strOFile, dbOpenTable)

'出力データ生成
'// 入力テーブル読込
    Set db_Dao(2) = CurrentDb
    Set Rst_Dao(2) = db_Dao(0).OpenRecordset(strIFile)
    i = Rst_Dao(2).RecordCount

    If i = 0 Then
         Exit Function
    Else
        Rst_Dao(2).MoveLast
        intLASTDATA = Rst_Dao(2).RecordCount
        Rst_Dao(2).MoveFirst
    End If
   
    i = 0
    Do Until i = intLASTDATA
        k = 0
       
        Rst_Dao(1).AddNew
        Do Until k = intFieldLast
            intFCount = intFieldNO(k)
            Rst_Dao(1).Fields(k).Value = Nz(Rst_Dao(2).Fields(intFCount).Value)
            k = k + 1
            intFCount = intFCount + 1
        Loop
        Rst_Dao(1).Update
       
        Rst_Dao(2).MoveNext
        i = i + 1
    Loop

'* DBのクローズ
    For F = 0 To 3
        Set Rst_Dao(0) = Nothing
        Set db_Dao(0) = Nothing
    Next F
    Sorter = "True"
    Exit Function

ERROR_SUB:
    For F = 0 To 3
        Set Rst_Dao(0) = Nothing
        Set db_Dao(0) = Nothing
    Next F
    Sorter = "False"

End Function

コメント

このブログの人気の投稿

証券外務員1種勉強(計算式暗記用メモ)

GASでGoogleDriveのサブフォルダとファイル一覧を出力する

マクロ経済学(IS-LM分析)