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
コメント