2016-08-29 2 views
0

세 가지 작업을 수행하고 싶습니다. 열 2 및 3의 값이 기준을 충족하면 하나의 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

VBA 전용 대신 ADODB 연결을 사용하여 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이 필요합니다. 그것들은 합리적으로 쉽고 설치가 빠릅니다.

하면 다음 수 중 하나

가) 실행은 MS-Access 쿼리와 같은 MS 액세스에서 직접에서 SQL 쿼리 말했다

또는

B)과 같이 MS 액세스 - 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 

일반 비고 :

  • 것은 당신 때문에

  • 을 개발하는 동안 백업 원래 CSV로 확인이 대략 다음과 같이 먼저 ADODB.Connection을 설정하도록 요구 각 행 (셀 B2 및 C2)에 대해 동일한 필터 기준을 사용하고 SQL을 조정하는 것은 간단합니다. Excel 에서처럼 셀 내용을 읽거나 예를 들어 사용자 정의 폼을 사용하여 수행 할 수 있습니다 (액세스).

  • c)에서 나는 이라는 ACCDB에 처음 연결했습니다.이 코드는 the proper connection string으로 텍스트 파일에 직접 연결할 수 있기 때문에 분명히 내 코드에서는 의미가 없습니다. 그러나 일부 매핑을 수행하려는 경우 해당 액세스 데이터베이스에서 매핑 테이블을 유지 관리하고 SQL (조인과 함께)에서 사용할 수 있습니다.

  • 또한 개인적으로이 경우 약간의 성능 저하가 있더라도 모든 경로 정보가 SQL 문 안에 포함되어 있습니다.

편집 : 당신은 오히려 출력-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

의견을 보내 주셔서 감사합니다. 일부 접근성 문제로 인해 VBA만을 선호하는 선택으로 인해 SQL/VBA 사용을 고려하지 않았습니다. – DJohnson1990

관련 문제