2016-08-29 5 views
0

私は3つのことをしたいと思います:列2と3の値が基準を満たしていれば1つのCSVからデータをインポートし、マッピングキーに基づいてこのデータを翻訳し、新しいCSVに変換します。CSVからデータをコピーして別のものに出力する

Sub in_out() 



dim file_path as string 
file_path = Worksheets("Sheet1").Range("A1").Value 
open file_path for input as #1 
row_count = 0 

sheets("Sheet1").UsedRange.ClearContents 
Range("A1").Select 

Do Until EOF(1) 
    Line Input #1, Line_FromFile 
    Line_Items = Split(Line_FromFile, ",") 

    If Line_Item(2) = Worksheets("sheet1").Range("B2").Value And Line_Item(3) = Worksheets("sheet1").Range("C2").Value Then 


    ActiveCell.Offset(row_count, 0).Value = Line_Items(1) 
    ActiveCell.Offset(row_count, 1).Value = Line_Items(2) 

    row_count = row_count +1 
    Loop 

    else 
    row_count = row_count +1 
    Loop 

    end if 

    row_count = row_count +1 
    Loop 




Close #1 

End sub 
+0

'オプションを使用してみてくださいあなたのモジュールの始めに「間接的に」これはrow_countの代わりにrow_numを使うようなエラーを防ぐのに役立ちます。 'activecell'にも依存しないでください。 – Jochen

答えて

3

あなたはADODB-接続の代わりに、VBAだけでSQLを使用することを検討してください可能性があります。大規模なCSVの場合、これは各行をループするよりもかなり速いはずです。

このようなSQLステートメントは、このトリックを行うことができます。

SELECT * 
INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv 
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv 
WHERE column2 = criteria1 AND column2 = criteria2 

あなたには、CSVの構造を説明するschema.ini-Fileが必要です。それらは合理的に簡単でセットアップが迅速です。

あなたはその後、

a)の実行がMS-Accessクエリ

または

bと直接のMS AccessからSQLクエリ言っ可能性のいずれか)がそうのようなMSのAccess-VBAでSQLを実行します。

Dim sql As String 
sql = "SELECT * INTO ... FROM ... WHERE ..." 
CurrentDb.Execute sql, dbFailOnError 
または

C)は、Excelを使用する必要がある場合は、エクセルVBAからそれを実行します。

Dim MyConn As ADODB.Connection 
Dim MyCmd As ADODB.Command 

With MyConn 
    .Provider = "Microsoft.ACE.OLEDB.12.0" 
    .Open yourDB.accdb 
End With 

With MyCmd 
    Set .ActiveConnection = MyConn 
    .CommandText = strSQL 
    .CommandType = adCmdText 
    .Execute 
End With 

Set MyCmd = Nothing 
Set MyConn = Nothing 

総論:これは大体このように、最初のADODB.Connectionのを設定するためにあなたを必要とする

  • はあなたので

  • を開発中にバックアップ元のCSVにしてください各行(セルB2とC2)に同じフィルター基準を使用すると、SQLを調整するのは簡単です.Excelで行ったようにCell-Contentsを読んだり、UserFormを使って(アクセス中)。

  • 私は最初にと呼ばれるACCDBに接続しました。このコードは明らかにthe proper connection stringというテキストファイルに直接接続できるので、私のコードでは分かりません。ただし、マッピングを行う予定がある場合は、そのAccess-Database内のMapping-Tablesをメンテナンスし、SQLで(Joinを使用して)使用できます。

  • また、私は個人的には、パフォーマンスが少し低下していても、この場合はすべてのパス情報がSQL文内に含まれているのが好きです。

EDIT:あなたは、むしろ出力-CSV(それを置き換えるのではなく)にデータを追加するかどう は当然のことながら、あなたはこのようINSERT -statementを使用することができます。

INSERT INTO [Text;DATABASE=L:\Out-Folder].tblOut.csv 
SELECT * 
FROM [Text;DATABASE=L:\In-Folder].tblIn.csv 
WHERE column2 = criteria1 AND column2 = criteria2 
+0

フィードバックいただきありがとうございます。私はSQL/VBAを使用することを検討していませんでした。なぜなら、いくつかのアクセシビリティ上の問題がVBAだけを選択したからです。 – DJohnson1990

関連する問題