ACCESS でCSV出力ツール作ってみた(その3)
この辺りはNETで調べれば出てくるんでまあ掲載の必要もないですが・・・・
参考までに・・・・。EXCELのインポートとエクスポート部分です。
参考までに・・・・。EXCELのインポートとエクスポート部分です。
Function FromExcel(strTableName As String, strImportTableName As String, strXlsFileName As String, strSheet As String) '==================================================================== ' テーブルから定義情報を取得してインポートする。 ' 可変EXCEL(カラム追加の可能性のあるテーブル)インポート関数 ' 2010.05.19 Created By M.Nishimura '*使い方 ' str_rtn = FromExcel(定義テーブル名,取込テーブル名,EXCELファイル名) '*戻り値 ' 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 xls As Excel.Application Dim wkb As Excel.Workbook Dim vntList As Variant 'EXCELのセル数値取得 Dim strTname As String '定義テーブル名 Dim striTname As String 'インポート先テーブル名 Dim strFlName As String '取込ファイル名 Dim strSheetName 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 balRetTableExists As Boolean Dim i As Integer 'レコードカウント用 Dim j As Integer 'カラム数 Dim k As Integer 'カラム比較用 Dim CNT As Long 'EXCEL用 Dim ExSheetCount As Integer 'EXCELシート取得 Dim ArrSheets() As String 'EXCELシート名格納 Dim strSheetCheck As String 'EXCELシートチェック結果 strTname = strTableName striTname = strImportTableName FromExcel = "False" strFlName = strXlsFileName strSheetName = strSheet 'ワークテーブルの存在を確認した後,ワークテーブルが存在すればワークテーブル削除 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 & "" ' 'デバッグ用 ' 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(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) '//** EXCEL取込 **** Set xls = CreateObject("Excel.Application") Set wkb = xls.Workbooks.Open(Filename:=strFlName, ReadOnly:=True) 'シート名を指定したい場合は関数呼出し時にシート名をセット If strSheetName = "" Or strSheetName = Null Then strSheetName = InputBox("Excelファイルのシート名を記述します。", , "Sheet1") End If 'シート名の存在チェック ExSheetCount = xls.Worksheets.Count ReDim ArrSheets(ExSheetCount - 1) '配列変数再定義 For i = 1 To ExSheetCount 'シートのチェック ArrSheets(i - 1) = xls.Worksheets(i).Name If strSheetName = ArrSheets(i - 1) Then strSheetCheck = "True" Exit For End If Next i If strSheetCheck = "True" Then '読み込み開始位置セット With wkb.Worksheets(strSheetName).Range("A2").CurrentRegion vntList = .Resize(.Rows.Count - 1).Offset(1, 0).Value End With Else wkb.Close SaveChanges:=False xls.Quit Set wkb = Nothing Set xls = Nothing Exit Function End If wkb.Close SaveChanges:=False xls.Quit Set wkb = Nothing Set xls = Nothing '//* データ読込部(データが存在する間中データ読込) For CNT = LBound(vntList, 1) To UBound(vntList, 1) i = 0 Rst_Dao(1).AddNew Do Until i = j Rst_Dao(1).Fields(i).Value = vntList(CNT, i + 1) 'i+1としているのはセルが1から開始のため i = i + 1 Loop Rst_Dao(1).Update Next '* DBのクローズ Rst_Dao(0).Close db_Dao(0).Close Rst_Dao(1).Close db_Dao(1).Close FromExcel = "True" Exit Function '//* エラー処理 *// ERROR_SUB: MsgBox "Error番号:" & Err.Number & vbNewLine & _ "Error内容:" & Err.Description, 16, "管理者" FromExcel = "False" xls.Quit Set wkb = Nothing Set xls = Nothing Exit Function End Function Function ToExcel(StrDataName As String, StrFileName As Variant, strSheetName As String) As String '==================================================================== ' EXCELデータエクスポート ' 2010.05.19 Updated By M.Nishimura '*使い方 ' str_rtn = ToExcel(出力元テーブル名,出力先EXCELファイル,出力先シート名) '*戻り値 ' True:処理正常終了 ' False:処理失敗 ' '==================================================================== On Error GoTo err_a Const FIRSTG = 2 'EXCEL行初期値 Const FIRSTR = 1 'EXCEL列初期値 Dim db_Dao As DAO.Database Dim Rst_Dao As DAO.Recordset Dim xls As Excel.Application Dim wkb As Excel.Workbook Dim strMsg As String Dim varinput1, varinput2, varinput3 As Variant Dim lngGcnt As Long 'EXCEL行数用カウンタ Dim lngRcnt As Long 'EXCEL列数用カウンタ Dim i As Integer '出力テーブルフィールドカウント用 Dim j As Integer '最終フィールド数 Const CORUM = 0 'データ部フィールドカウンタの初期値 Dim ExSheetCount As Integer 'EXCELシート取得 Dim ArrSheets() As String 'EXCELシート名格納 Dim strSheetCheck As String 'EXCELシートチェック結果 Dim balRetTableExists As Boolean ToExcel = "False" '出力用テーブルチェック balRetTableExists = TableOparate.TableExists(StrDataName) If balRetTableExists = False Then Exit Function End If Set db_Dao = CurrentDb '出力元のテーブルまたはクエリ名です。 varinput3 = StrDataName If varinput3 <> "" Then Set Rst_Dao = db_Dao.OpenRecordset(StrDataName) Else Exit Function End If 'ファイル名指定 varinput1 = StrFileName If IsNull(varinput1) Then End Set xls = CreateObject("Excel.Application") 'EXCELオブジェクト定義 Set wkb = xls.Workbooks.Open(Filename:=varinput1) 'シート名の存在判定、入力されたシートが存在しない場合にはシートを追加する If strSheetName = "" Or strSheetName = Null Then varinput2 = InputBox("Excelファイルのシート名を記述します。", , "Sheet1") End If ExSheetCount = xls.Worksheets.Count ReDim ArrSheets(ExSheetCount - 1) '配列変数再定義 For i = 1 To ExSheetCount 'シートのチェック ArrSheets(i - 1) = xls.Worksheets(i).Name If strSheetName = ArrSheets(i - 1) Then strSheetCheck = "True" Exit For End If Next i If strSheetCheck = "True" Then varinput2 = strSheetName xls.Worksheets(varinput2).Select Else '新規シートを最後尾に追加 varinput2 = strSheetName wkb.Worksheets.Add after:=wkb.Worksheets(i - 1) wkb.Worksheets(i).Name = varinput2 End If 'セルにデータを出力。(セルの行、セルの列)で位置指定 'レコードの終了までループ処理で繰り返し j = Rst_Dao.Fields.Count Rst_Dao.MoveFirst '// 見出出力部分(1行目を見出しとする。) i = CORUM '行を進める際にACCESSテーブルのフィールド先頭にカウンタを戻す。 lngRcnt = FIRSTR 'EXCELの列をA列にセット Do Until i >= j 'ACCESSテーブルのフィールド最終列まで繰り返してデータを出力 xls.Cells(FIRSTR, lngRcnt).Value = Rst_Dao.Fields(i).Name i = i + 1 lngRcnt = lngRcnt + 1 Loop '// データ出力部分 lngGcnt = FIRSTG Do Until Rst_Dao.EOF i = CORUM lngRcnt = FIRSTR Do Until i >= j 'データの値を出力 xls.Cells(lngGcnt, lngRcnt).Value = Rst_Dao.Fields(i).Value ''**********文字数字混在で強制的に文字列出力したい場合はCORUMを制御したい列番号にしてコメント解除 '' If i = CORUM Then '' xls.Cells(lngGcnt, lngRcnt).Value = "'" & Rst_Dao.Fields(i).Value '' End If ''**********文字数字混在で強制的に文字列出力したい場合はCORUMを制御したい列番号にしてコメント解除 i = i + 1 lngRcnt = lngRcnt + 1 Loop lngGcnt = lngGcnt + 1 Rst_Dao.MoveNext '次レコードへ Loop wkb.Save 'セーブ時にEXCELのメッセージを表示しない wkb.Close False xls.Quit 'EXCEL開放 Set Rst_Dao = Nothing Set db_Dao = Nothing ToExcel = "True" Exit Function err_a: MsgBox "Error番号:" & Err.Number & vbNewLine & _ "Error内容:" & Err.Description, 16, "管理者" wkb.Close False xls.Quit 'EXCEL開放 Set Rst_Dao = Nothing Set db_Dao = Nothing End Function
コメント