2017-01-29 3 views
-2

すべてのファイル(フォルダからtxtまたはxlsx)をインポートしたい 私はすでにマクロを作成しています。 (すべての列は文字でなければなりません)マクロによるアクセスにtxt/xlsxファイルをインポートする最も速い方法

私はschema.iniファイルを生成します。 excelファイルをインポートするにはSQLを使用しましたが、速度が遅かったので別の方法を選択しました。

マクロ作成テーブルとその両方にレコードを入れます。

スコア: Txtファイル: 18ファイル、すべてのデータベースにはレコードがいっぱいです。 18個のtxtファイルには249584、それは969 688セルに似ています。 時間:20秒。

Excelファイル:75秒: 1ファイル、8 colummns、14000件のレコードが、それは110880個の細胞(細胞は空ではありません)
時間のようなものです。

P.S Everyfileには別の構造(列数など)があります。データベースのすべての列はVarcharでなければなりません(255)

Btw: Accessのすべてのデータベースをtxtにエクスポートする良い解決策はありますか? それは?TXTファイルのコードページを確認することができる(VBAやEmEditorのを使用することによって。)

+0

これまでに何を試みましたか? –

+0

私はAccessにExcelファイルをインポートしようとしています(列の作成、コードページの設定など) - しかし、私の考えは時間がかかりすぎます。 - 75秒。 txtファイルと同じ速度を得たいです。私はtxtファイルのコードページについての情報を得ようとしています。 –

答えて

1

https://msdn.microsoft.com/en-us/library/office/ff835958.aspx

DoCmd.TransferTextはかなりバスケットをする人です。あなたはインポート仕様を設定する必要があるかもしれません。 Excelファイルで

DoCmd.TransferText acImportDelim, "spec name", "table name", "filename" 

あなたは、独自のargummentsを持ってDoCmd.TransferSpreadsheetを持っていますが、あなたはそれでスペックを使用傾けます。また、Excelのファイルをテキスト区切りファイルに読み込んでそこにフォームをインポートするコードを書くこともできます(これはregで行います)。

ここでは、パイプで区切られたテキストファイルを作成して使用する方法を説明します。それはテストされておらず、あなたのために他の何かを自由にするつもりはありません。それをここで形作ることができないのであれば、あまりにも悪いです。空白を埋めるのを助けることができるもの:Late Binding、テキストファイルへの書き込み、Dir関数、配列へのExcel範囲。

ハッピーコーディング:)

dim NewTextFile as String 
dim oXL as Object 
dim sep as string 
dim path as string 
dim fileName as string 
Dim bringOver as variant 
dim sheet as object 
dim wholeline as string 

sep "|" 
path = "path to excel file" 
fileName = "name of excelfile.xlsx" 

NewTextFile = "path you want file saved to" & "\name.txt" 
Set oXL = WorkBooks.Open(path & fileName) 
With oXL 
    Open NewTextFile For Output As #2 
    For Each sheet in oXL.Sheets 
     bringOver = sheet.UsedRange 
     for i = LBound(bringOver,1) to UBound(bringOver,1) 
      for j = LBound(bringOver,2) to UBound(bringOVer,2) 
       wholeline = wholeline & bringOver(i,j) & sep 
      next j 
      Write #2, wholeline 
      wholelline = vbNullString 
     Next i 
    Next sheet 
End With 
+0

DoCmdコマンドを使用することはできません。なぜなら私はコードページやsepなどを設定できないからです。しかし、CSVとして保存することについてのアイデアは、インポートが良くありません。それを速くするためには、私はメソッドを使用する必要があります:Save as、次にcsvに保存するつもりです(;)delimしかし、いくつかのレコードに ";"文字列で間違っています。 –

+0

パイプで区切られたものもあります –

+0

しかし、デフォルトでは: "save as"私は区切り文字を入れません(ちなみに私はウィンドウ内の設定を変更する必要があります) –

0

あなたはすべてのファイルをループ、とはこのように、それぞれをインポートすることができます。

Private Sub Command1_Click() 

Dim strPathFile As String 
Dim strFile As String 
Dim strPath As String 
Dim strTable As String 
Dim blnHasFieldNames As Boolean 

' Change this next line to True if the first row in CSV worksheet 
' has field names 
blnHasFieldNames = True 

' Replace C:\Documents\ with the real path to the folder that 
' contains the CSV files 
strPath = "C:\your_path_here\" 

' Replace tablename with the real name of the table into which 
' the data are to be imported 

strFile = Dir(strPath & "*.csv") 


Do While Len(strFile) > 0 
     strTable = Left(strFile, Len(strFile) - 4) 
     strPathFile = strPath & strFile 

     ' Link CSV Files 
     DoCmd.TransferText acImportDelim, , strTable, strPathFile, blnHasFieldNames 

     ' Import Excel Files 
     ' DoCmd.TransferSpreadsheet , , strTable, strPathFile, blnHasFieldNames 


' Uncomment out the next code step if you want to delete the 
' file after it's been imported 
'  Kill strPathFile 

     strFile = Dir() 

Loop 

End Sub 
関連する問題