ACCESSでCSV出力ツール作ってみた(その1)
とりあえずCSV制御部分の備忘録
テーブルで入力するファイルを定義し、出力したいテーブルと出力項目を
テーブルで設定します。
テーブルは別途用意する必要があります。(笑)
テーブルで入力するファイルを定義し、出力したいテーブルと出力項目を
テーブルで設定します。
テーブルは別途用意する必要があります。(笑)
Function FromCSV(strTableName As String, strImportTableName As String, strCsvFileName As String, strMode As String) As String
On Error GoTo ERROR_SUB
'====================================================================
' テーブルからCSVの定義を取得してインポートする。
' 可変CSV(カラム追加の可能性のあるテーブル)インポート関数
' 2010.02.02 Created By M.Nishimura
'*使い方
' str_rtn = FromCSV(定義テーブル名,取込テーブル名,CSVファイル名)
'*戻り値
' True:処理正常終了
' False:処理失敗
'
'====================================================================
Const COLUMCNT = 256 'カラム数
Dim db_Dao(1) As DAO.Database
Dim Rst_Dao(1) As DAO.Recordset
Dim Qdf_Dao As DAO.QueryDef
Dim strTname As String 'テーブル名
Dim dbsCurrent As DAO.Database
Dim strSQL As String
Dim tdfNew As DAO.TableDef
Dim tdffld(COLUMCNT) As DAO.Field
Dim strClum(COLUMCNT) As String
Dim strFieldName(COLUMCNT) As String 'フィールド名(カラム数分の配列)
Dim strFieldSize(COLUMCNT) As String 'フィールドサイズ(カラム数分の配列)
Dim intFieldSize(COLUMCNT) As Integer 'フィールドサイズ(カラム数分の配列)
Dim striTname As String 'インポートテーブル名
Dim balRetTableExists As Boolean
Dim i As Integer 'レコードカウント用
Dim j As Integer 'カラム数
Dim k As Integer 'カラム比較用
Dim F As Integer 'CSV先頭行除外用
Const CSVTOP = 0
Dim strC As String '区切文字
Dim Swork As String
'テキストの場合はタブ区切り(条件分岐させれば区切文字可変可能)
strC = vbTab
i = 0
j = 0
k = 0
strTname = strTableName
striTname = strImportTableName
FromCSV = "False"
strFlName = strCsvFileName
'ワークテーブルの存在を確認した後,ワークテーブルが存在すればワークテーブル削除
balRetTableExists = TableOparate.TableExists(striTname)
If balRetTableExists = True Then
DoCmd.DeleteObject acTable, striTname
End If
'呼出しテーブル定義
strSQL = ""
strSQL = strSQL & " SELECT " & strTname & ".*"
strSQL = strSQL & " FROM "
strSQL = strSQL & strTname & ";"
strSQL = 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(striTname)
i = Rst_Dao(0).RecordCount
'レコード数取得
If i <> 0 Then
Rst_Dao(0).MoveLast
j = Rst_Dao(0).RecordCount
Rst_Dao(0).MoveFirst
End If
k = 0
'//** テーブル作成(テーブルを新規作成<カラムは可変(全てテキスト型)>) **
Do Until k = j
strFieldName(k) = Nz(Rst_Dao(0).Fields(2)) 'フィールド名
strFieldSize(k) = Nz(Rst_Dao(0).Fields(3)) 'フィールドサイズ
intFieldSize(k) = CInt(strFieldSize(k))
Set tdffld(k) = tdfNew.CreateField(strFieldName(k), dbText, intFieldSize(k))
tdffld(k).AllowZeroLength = True '空文字列の許可
tdfNew.Fields.Append tdffld(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(striTname, dbOpenTable)
'//** CSVデータ取込 ****
'//** ファイル拡張子において区分けしている。CSV以外はsplitで処理
Open strFlName For Input As #1
F = 0
Select Case strMode
'//* CSV(カンマ区切)の処理
Case Is = ".csv"
Do Until EOF(1)
k = 0
Do Until k = j
Input #1, strClum(k)
k = k + 1
Loop
'先頭1行は表題なのでテーブルに書き込まない
If F <> CSVTOP Then
k = 0
Rst_Dao(1).AddNew
Do Until k = j
Rst_Dao(1).Fields(k) = Nz(strClum(k))
k = k + 1
Loop
Rst_Dao(1).Update
End If
F = F + 1
Loop
'//* txtファイルの処理
Case Is = ".txt"
Do Until EOF(1)
k = 0
Line Input #1, Swork
If F <> CSVTOP Then
Rst_Dao(1).AddNew
Do Until k = j
'タブ区切でないTXTだとエラーとなるため処理を中止する。
If Swork <> "" Then
strClum(k) = Split(Swork, strC)(k)
Rst_Dao(1).Fields(k) = Nz(strClum(k))
k = k + 1
Else
GoTo ERROR_SUB
End If
Loop
Rst_Dao(1).Update
End If
F = F + 1
Loop
Case Else
GoTo ERROR_SUB
End Select
Close #1
'* DBのクローズ
Rst_Dao(0).Close
db_Dao(0).Close
Rst_Dao(1).Close
db_Dao(1).Close
FromCSV = "True"
Exit Function
'//* エラー処理 *//
ERROR_SUB:
'エラー処理
' Call MsgBox(CStr(Err.Number) & "," & Err.Description) '*デバッグ用
MsgBox "TXTファイルはタブ区切、CSVファイルはカンマ区切です。" & Chr(13) & _
"ファイル形式に誤りがある可能性があります。取込ファイルを修正してください。" & Chr(13) & _
"ファイルを修正してもエラーが続く場合は、定義テーブルを確認してください。" & Chr(13) & _
"それでもエラーが解消されない場合はシステム管理者に連絡してください。"
Close #1
FromCSV = "False"
Exit Function
End Function
Function ToCsv(StrDataName As String, StrFileName As Variant, strMode As String) As String
'====================================================================
' CSVデータエクスポート
' 2010.05.18 Created By M.Nishimura
'*使い方
' str_rtn = ToCSV(出力元テーブル名,出力先CSVファイル)
'*戻り値
' True:処理正常終了
' False:処理失敗
'
'====================================================================
On Error GoTo err_a
Dim db_Dao As DAO.Database
Dim Rst_Dao As DAO.Recordset
Dim strMsg As String
Dim intmsg As Integer
Dim varinput1, varinput2 As Variant
Dim outi As Integer '出力テーブルフィールドカウント用
Dim lasti As Integer '最終フィールド数
Const CORUM = 0 'データ部フィールドカウンタの初期値
Dim strF As String '「"」表現用
Dim strC As String '区切記号用
Dim strOutput As String 'CSV出力用文字列
Dim balRetTableExists As Boolean
strMsg = "CSVファイルへデータを出力しますか ?"
intmsg = MsgBox(strMsg, 17, "管理者")
ToCsv = "False"
'出力用テーブルチェック
balRetTableExists = TableOparate.TableExists(StrDataName)
If balRetTableExists = False Then
Exit Function
End If
If intmsg = 1 Then
Set db_Dao = CurrentDb
'出力元のテーブルまたはクエリ名です。
varinput2 = StrDataName
If varinput2 <> "" Then
Set Rst_Dao = db_Dao.OpenRecordset(varinput2)
Else
Exit Function
End If
'ファイル名指定
varinput1 = StrFileName
If IsNull(varinput1) Then End
'CSVファイルの場合は「"",""」形式、テキストの場合はタブ区切り
'***** CSVファイルを「,」のみ形式にしたいときはstrFを""に書替
If strMode = ".csv" Then
strF = Chr(34)
strC = Chr(44)
Else
strF = ""
strC = vbTab
End If
lasti = Rst_Dao.Fields.Count
Rst_Dao.MoveFirst
'// CSVデータ出力
Open varinput1 For Append As #1 '出力ファイルを開く
'* タイトル出力
outi = CORUM
Do Until outi = lasti
If outi = lasti - 1 Then
strOutput = strOutput & strF & Rst_Dao.Fields(outi).Name & strF '最終レコードはカンマなし
Else
strOutput = strOutput & strF & Rst_Dao.Fields(outi).Name & strF & strC
End If
outi = outi + 1
Loop
Print #1, strOutput
'* データ本体出力
Do Until Rst_Dao.EOF
outi = CORUM 'フィールドを1列目にセット
strOutput = ""
Do Until outi = lasti 'フィールド出力
If outi = lasti - 1 Then
strOutput = strOutput & strF & Rst_Dao.Fields(outi).Value & strF
Else
strOutput = strOutput & strF & Rst_Dao.Fields(outi).Value & strF & strC
End If
outi = outi + 1
Loop
Print #1, strOutput
Rst_Dao.MoveNext
Loop
Rst_Dao.Close
Close #1 '出力ファイルを閉じる
Set Rst_Dao = Nothing
Set db_Dao = Nothing
ToCsv = "True"
Else
MsgBox "処理を中止しました", 1, "管理者"
Set Rst_Dao = Nothing
Set db_Dao = Nothing
End If
Exit Function
err_a:
MsgBox "Error番号:" & Err.Number & vbNewLine & _
"Error内容:" & Err.Description, 16, "管理者"
Close #1
ToCsv = "False"
End Function
コメント