0

いくつかのcsvファイルをExcel2010にインポートして、非常に単純ですが非常に大規模なデータベースを作成する必要があります。
全体の話は、5列と数千行になります。
VBAも単純で、あるシートから別のシートにデータをコピーします。その逆も同様です。
ただし、ファイルサイズが非常に大きくなる可能性があるため、メモリ要件に注意する必要があります。

Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim r1 As Range
Dim r2 As Range
Set ws1 = Sheets("01")
Set ws2 = Sheets("02")
Set r1 = ws1.Range("A1:B10") ' for example
Set r2 = ws2.Range("C5:D14")
r1.Copy Destination:=r2 'first way
r2.Value = r1.Value ' second way

メモリ/時間の範囲で、この2つの方法に違いはありますか?
と私は10,000行以上になります。ファイルのサイズはどのくらいになりますか?

4

2 に答える 2

6

ADOを使用して、データベーステーブルであるかのようにテキストファイルをクエリできます。これにより、SQLクエリを記述して、テキストファイルからデータを引き出すことができます。必要に応じて、任意のテキストファイルまたは.xlsファイルでこれを行うことができます。

そのためのコード/プロセスはかなり単純です。最初にMicrosoftActiveXData Objects 2.Xライブラリを参照してから、次のようなものを使用する必要があります。

Dim cn as New ADODB.Connection
Dim rs as New ADODB.Recordset
Dim i as Integer

With cn
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=C:\SomeFolder;" & _
                        "Extended Properties=""text; HDR=Yes;FMT=Delimited"""
    .Open

    With rs
        .Open "SELECT * from fileName.txt", cn

        'Loop through each row in query
        While Not (.EOF Or .BOF)
            'Loop through each column in row
            For i = 0 to .Fields.Count - 1
                Debug.Print .Fields(i).Value 'Print value of field to Immediate Window
            Next i

            .MoveNext
        Wend

        .Close
    End With

    .Close
End With

Set rs = Nothing
Set cn = Nothing

これにより、テキストファイルがループされ、VBAイミディエイトウィンドウの最初の列の値が表示されます。また、ファイルにヘッダー行があることも前提としています。そうでない場合は、ConnectionStringのHDRをNoに変更する必要があります。

コードは自動的にタイプを推測しようとしますが、正しいタイプ(先行ゼロなど)が見つからないという問題が発生した場合は、ファイルのスキーマを明示的に定義できます。スキーマルートに移動すると、 HDRFMTなどのConnectionString引数が 無視されることに注意することが重要です。スキーマ定義でオーバーライドしない限り、レジストリで定義されているデフォルト設定を保持します。schema.iniファイルの詳細については、http://msdn.microsoft.com/en-us/library/windows/desktop/ms709353(v = vs.85).aspxを参照してください

別の便利なリンクは次のとおりです:http://msdn.microsoft.com/en-us/library/ms974559.aspx。これはMicrosoftScriptingGuysによって書かれた記事であり、私が最初にプロセスについて学んだ方法です。

最後に、このプロセスを.xlsファイルで使用する場合は、OPEN.xlsファイルをクエリしないでください。OPEN .xlsファイルには厄介なメモリリークのバグがあります(詳細はこちら:http ://support.microsoft.com/default.aspx?scid = kb; en-us; 319998&Product = xlw )。CLOSED .xlsドキュメントをクエリする限り、=Dの問題は発生しません。特定のシートをターゲットにする必要があるため、SQL FROM句の構文は少し異なりますが、リンクしたScriptingGuysの記事IIRCでその方法を説明しています。

于 2012-09-18T03:46:58.140 に答える
2

このコードブロックには、私が取り組んでいたプロジェクトの詳細がいくつか含まれていましたが、VBAを介してCSVファイルをインポートする方法(ある程度クリーニングする方法)を開始するのに役立つはずです。

Public Sub ImportCSV(strPath As String, strFile As String, strExt As String, wbDestination As Workbook, Optional wsDest As Worksheet, Optional strRange As String, Optional blHeaders As Boolean = True)
'imports given CSV file into given sheet at given range _
    defaults to comma separated delimiters

Dim wsDestination As Worksheet
Dim strFileName As String
strFileName = strPath & strFile & ".csv"


If wsDest Is Nothing Then Set wsDestination = wbDestination.Worksheets.Add(, wbDestination.Worksheets(wbDestination.Worksheets.Count)) Else: Set wsDestination = wsDest
If strRange = "" Then strRange = "$A$1"

With wsDestination.QueryTables.Add(Connection:="TEXT;" & strFileName, Destination:=wsDestination.Range(strRange))
        .FieldNames = False
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = False
        .AdjustColumnWidth = False
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 437
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = True
        .TextFileSpaceDelimiter = False
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        .Delete
    End With

If Not blHeaders Then wsDestination.Range(strRange).EntireRow.Delete

End Sub
于 2012-09-17T21:17:16.360 に答える