Option Explicit

Sub import_Specific_Rows_Only()
    Const lngFrom As Long = 11  '텍스트 파일 불러올 시작행을 넣을 변수
    Const lngTo As Long = 20     '텍스트 파일 불러올 마지막행을 넣을 변수
    Dim strPath As String            '폴더의 경로를 넣을 변수
    Dim fileName As String          '각 파일 이름을 넣을 변수
    Dim objFSO As Object           '파일시스템 개체를 넣을 변수
    Dim objFile As Object            '파일을 넣을 변수
    Dim r As Long                      '행을 늘려갈 변수
    Dim varTemp As Variant         '각 행을 콤마(,)로 나누어 넣을 배열변수
    Dim rngC As Range               '각 셀을 넣을 변수
   
    Application.ScreenUpdating = False       '화면 업데이트 (일시) 정지
    ActiveSheet.UsedRange.ClearContents  '기존 데이터 삭제
   
    Set objFSO = CreateObject("Scripting.FileSystemObject")
                                                             '파일시스템 개체를 생성
    With Application.FileDialog(msoFileDialogFolderPicker)  '폴더선택 창에서
        .Show                                            '폴더 선택창 띄우기
 
        If .SelectedItems.Count = 0 Then        '취소 선택 시
            Exit Sub                                      '매크로 중단
        Else
            strPath = .SelectedItems(1) & "\"   '폴더 경로를 변수에 넣음
        End If
    End With
 
    fileName = Dir(strPath & "*.csv")            '(폴더내)각 csv파일 이름을 변수에 넣음
    If fileName = "" Then                             '폴더에 파일이 없으면
        MsgBox "폴더에 파일이 없습니다."     '메시지 출력
        Exit Sub                                          '매크로 중단
    End If
   
    Do While fileName <> ""                        '이름이 없지 않다면, 즉, csv파일이 존재하면
       
        Set objFile = objFSO.OpenTextFile(fileName:=strPath & fileName, _
        IOMode:=1, Create:=False, Format:=-2) 'csv 파일을 열어서 변수에 넣음
 

        For r = 1 To lngTo                               '1 ~ 20행까지 반복
            If Not objFile.AtEndOfStream Then    '만일 파일의 제일 마지막행이 아니라면
                If r < lngFrom Then                     '행이 11보다 작으면
                    objFile.SkipLine                     '행을 건너뜀
                Else                                         '11 ~ 20 행이라면
                    varTemp = Split(objFile.ReadLine, ",")
                                                               '행을 읽어들이고 문자를 콤마로 나누어 배열에 넣음
                    Cells(Rows.Count, 1).End(3)(2).Resize(, UBound(varTemp) + 1) = varTemp
                End If                                       '배열로 읽어드린 값을 셀에 뿌림
            End If
        Next r
 

        objFile.Close                                     '파일을 닫음
        fileName = Dir                                     '다음 파일을 파일이름에 넣음
    Loop                                                     '무한 반복
 

    For Each rngC In ActiveSheet.UsedRange '(읽어드린 숫자가 문자이므로)문자를 숫자로 변환
        With rngC                                          '각 셀에서
            .Value = .Value                              '(문자값을 숫자로) 각 셀을 복사
        End With
    Next rngC
   
    Set objFSO = Nothing                              '개체변수들 초기화(메모리 비우기)
    Set objFile = Nothing
   
End Sub

 

 

object.OpenTextFile (filename [, iomode[, create[, format]]]) : OpenTextFile은 텍스트파일을 열고 TextStreamObject 를 반환한다.


IOmode :

       Constant       Value    용도                           

    ForReading        1       읽기 위해 파일을 연다

    ForWriting          2       쓰기 위해 파일을 연다

    ForAppending    3       추가(append)하기 위해 파일을 연다

 

Create : True일 경우 파일이 존재하지 않으면 파일을 생성하고, False일 경우는 안함

 

Format :

       Constant       Value    용도                           

    TristateTrue            -1     Unicode로 파일을 연다

    TristateFalse           0     ASCII로 파일을 연다

    TristateUseDefault   -2    'Default값이며 시스템 설정값으로 연다

 

Late Binding하여도 왠만하면 에러나지 않겠지만, 혹시 FileSystemObject에서 에러가 날 경우 Microsoft Scripting Runtime을 활성화.

 

+ Recent posts