2012-07-25 4 views
-4

나는 매우 긴 Excel VBA 코드를 가지고 있으며, 코드를 더 짧고 더 잘 만들 수있는 루프 또는 기타 용도로 사용하는 방법에 대해 궁금합니다. 내가 뭘 하려는지는 통합 문서의 각 열을 복사하여 새로운 통합 문서의 각기 다른 워크 시트에 붙여 넣는 것입니다. 예를 들어 A 열에서 A 열, B 열에서 B 열로 등등. 감사. 다음은 for 루프를 사용하는 방법

Sub S05_0ab_03() 

    Dim wb As Workbook, wbTemp As Workbook 
    Dim ws As Worksheet, wsTemp As Worksheet 

    Set wb = ThisWorkbook 
    Set ws = wb.Sheets("Sheet1") 
    Set ws2 = wb.Sheets("Sheet2") 
    Set ws3 = wb.Sheets("Sheet3") 
    Set ws4 = wb.Sheets("Sheet4") 
    Set ws5 = wb.Sheets("Sheet5") 
    Set ws6 = wb.Sheets("Sheet6") 
    Set ws7 = wb.Sheets("Sheet7") 
    Set ws8 = wb.Sheets("Sheet8") 
    Set ws9 = wb.Sheets("Sheet9") 
    Set ws10 = wb.Sheets("Sheet10") 
    Set ws11 = wb.Sheets("Sheet11") 
    Set ws12 = wb.Sheets("Sheet12") 
    Set ws13 = wb.Sheets("Sheet13") 
    Set ws14 = wb.Sheets("Sheet14") 
    Set ws15 = wb.Sheets("Sheet15") 
    Set ws16 = wb.Sheets("Sheet16") 
    Set ws17 = wb.Sheets("Sheet17") 
    Set ws18 = wb.Sheets("Sheet18") 
    Set ws19 = wb.Sheets("Sheet19") 
    Set ws20 = wb.Sheets("Sheet20") 
    Set ws21 = wb.Sheets("Sheet21") 
    Set ws22 = wb.Sheets("Sheet22") 
    Set ws23 = wb.Sheets("Sheet23") 
    Set ws24 = wb.Sheets("Sheet24") 
    Set ws25 = wb.Sheets("Sheet25") 
    Set ws26 = wb.Sheets("Sheet26") 
    Set ws27 = wb.Sheets("Sheet27") 
    Set ws28 = wb.Sheets("Sheet28") 
    Set ws29 = wb.Sheets("Sheet29") 
    Set ws30 = wb.Sheets("Sheet30") 
    Set ws31 = wb.Sheets("Sheet31") 
    Set ws32 = wb.Sheets("Sheet32") 
    Set ws33 = wb.Sheets("Sheet33") 
    Set ws34 = wb.Sheets("Sheet34") 

    '~~> Change path as applicable 
    Set wbTemp = Workbooks.Open("C:\Users\cl0106.UNT\Documents\Jill\0ab\S05_0ab_03.xlsx") 
    Set wsTemp = wbTemp.Sheets("Sheet1") 

    'copy file 
    wsTemp.Range("A3:A102").copy ws.Range("I3:I102") 
    wsTemp.Range("B3:B102").copy ws2.Range("I3:I102") 
    wsTemp.Range("C3:C102").copy ws3.Range("I3:I102") 
    wsTemp.Range("D3:D102").copy ws4.Range("I3:I102") 
    wsTemp.Range("E3:E102").copy ws5.Range("I3:I102") 
    wsTemp.Range("F3:F102").copy ws6.Range("I3:I102") 
    wsTemp.Range("G3:G102").copy ws7.Range("I3:I102") 
    wsTemp.Range("H3:H102").copy ws8.Range("I3:I102") 
    wsTemp.Range("I3:I102").copy ws9.Range("I3:I102") 
    wsTemp.Range("J3:J102").copy ws10.Range("I3:I102") 
    wsTemp.Range("K3:K102").copy ws11.Range("I3:I102") 
    wsTemp.Range("L3:L102").copy ws12.Range("I3:I102") 
    wsTemp.Range("M3:M102").copy ws13.Range("I3:I102") 
    wsTemp.Range("N3:N102").copy ws14.Range("I3:I102") 
    wsTemp.Range("O3:O102").copy ws15.Range("I3:I102") 
    wsTemp.Range("P3:P102").copy ws16.Range("I3:I102") 
    wsTemp.Range("Q3:Q102").copy ws17.Range("I3:I102") 
    wsTemp.Range("R3:R102").copy ws18.Range("I3:I102") 
    wsTemp.Range("S3:S102").copy ws19.Range("I3:I102") 
    wsTemp.Range("T3:T102").copy ws20.Range("I3:I102") 
    wsTemp.Range("U3:U102").copy ws21.Range("I3:I102") 
    wsTemp.Range("V3:V102").copy ws22.Range("I3:I102") 
    wsTemp.Range("W3:W102").copy ws23.Range("I3:I102") 
    wsTemp.Range("X3:X102").copy ws24.Range("I3:I102") 
    wsTemp.Range("Y3:Y102").copy ws25.Range("I3:I102") 
    wsTemp.Range("Z3:Z102").copy ws26.Range("I3:I102") 
    wsTemp.Range("AA3:AA102").copy ws27.Range("I3:I102") 
    wsTemp.Range("AB3:AB102").copy ws28.Range("I3:I102") 
    wsTemp.Range("AC3:AC102").copy ws29.Range("I3:I102") 
    wsTemp.Range("AD3:AD102").copy ws30.Range("I3:I102") 
    wsTemp.Range("AE3:AE102").copy ws31.Range("I3:I102") 
    wsTemp.Range("AF3:AF102").copy ws32.Range("I3:I102") 
    wsTemp.Range("AG3:AG102").copy ws33.Range("I3:I102") 
    wsTemp.Range("AH3:AH102").copy ws34.Range("I3:I102") 


    Application.CutCopyMode = False 

    '~~> Cleanup 
    wbTemp.Close savechanges:=True 
    Set wb = Nothing: Set wbTemp = Nothing 
    Set ws = Nothing: Set ws2 = Nothing: Set wsTemp = Nothing 

내가 수정 코드입니다.

Sub Move() 


    Dim wb As Workbook, wbTemp As Workbook 
    Dim wsTemp As Worksheet 
    Dim i As Long, colName As String 
    Dim n As Long, colName2 As String 


    Set wb = ThisWorkbook 

    '~~> Change path as applicable 

    For n = 1 To 4 

     Set wbTemp = Workbooks.Open("C:\Users\cl0106.UNT\Documents\Jill\0ab\" & n & ".xlsx") 
     Set wsTemp = wbTemp.Sheets("Sheet1") 
     colName2 = Split(Cells(, n).Address, "$")(1) 

    For i = 1 To 34 
     colName = Split(Cells(, i).Address, "$")(1) 
     wb.Sheets("Sheet" & i).Range(colName2 & "3" & ":" & colName2 & "102").Value = wsTemp.Range(colName & "3" & ":" & colName & "102").Value 

    Next 
    Next 

    Application.CutCopyMode = False 

    '~~> Cleanup 
    wbTemp.Close savechanges:=False 

    Set wb = Nothing: Set wbTemp = Nothing 
    Set wsTemp = Nothing 


End Sub 
+5

을 할 수 있습니다. –

+1

도 ** 배열 ** 변수를 조사하고 싶은데 어떻게하면 쉽게 루프를 만들 수 있습니까? – SeanC

답변

3

이 게시물은 자습서를 읽는 것으로부터 오는 논리는 거의 다루지 않습니다. 이것은 당신이 시간에 경험이있을 때 온다. 대부분의 사이트에서는 For 루프가 작동하는 방식을 설명 할 수 있지만 다른 시나리오에서이를 정확히 적용하는 것은 실제로 스스로 배워야 만하는 것입니다. 이 게시물은 그 논리를 사용하여 코드를 줄이는 방법을 안내합니다 ...

For 루프는 트렌드가있을 때 유용합니다. 그런 말로하면 For 루프는 반복적으로 무언가를하고 싶을 때도 사용할 수 있습니다.

데이터를 보면 추세를 볼 수 있습니다. 예를 들어

시트 1, 시트 2 ... Sheet34

또는

A3 : A102, B3 : B102 ... 아시안 하이웨이 3 호선 : AH102

이제 공통으로 위의 것들을 공유하는 일

?

시트 이름은 1에서 시작하여 34로 끝납니다. 마찬가지로 A3:A102, B3:B102... AH3:AH102에서 열 이름은 A에서 AH까지이며 이는 열 1에서 열 34까지입니다. 이제 Excel에서 열 번호에서 열 이름을 어떻게 가져 옵니까? 이 한 개의 라이너를 사용하여 열 번호에서 열 이름을 가져올 수 있습니다. num는 열 번호입니다

Split(Cells(, num).Address, "$")(1)

그렇게

Split(Cells(, 1).Address, "$")(1) is Col A 
Split(Cells(, 2).Address, "$")(1) is Col B 
' 
' 
' 
Split(Cells(, 34).Address, "$")(1) is Col AH 

다른 부분은 사본 범위는 행의 측면에서 일정이다. 행 3에서 행 102까지입니다.

마찬가지로 대상 범위는 행 또는 열에서 일정합니다. 이렇게하면 일이 더 쉬워집니다.

지금 아마 당신이 먼저 언어를 _learn_한다, 이러한 기본적인 질문에 대해 ...의 시도하고 for 루프에서 그 통합

Sub S05_0ab_03() 
    Dim wb As Workbook, wbTemp As Workbook 
    Dim wsTemp As Worksheet 
    Dim i As Long, colName As String 

    Set wb = ThisWorkbook 

    '~~> Change path as applicable 
    Set wbTemp = Workbooks.Open("C:\Users\cl0106.UNT\Documents\Jill\0ab\S05_0ab_03.xlsx") 
    Set wsTemp = wbTemp.Sheets("Sheet1") 

    For i = 1 To 34 
     colName = Split(Cells(, i).Address, "$")(1) 
     wsTemp.Range(colName & "3" & ":" & colName & "102").Copy _ 
     wb.Sheets("Sheet" & i).Range("I3:I102") 
    Next 

    Application.CutCopyMode = False 

    '~~> Cleanup 
    wbTemp.Close savechanges:=False 

    Set wb = Nothing: Set wbTemp = Nothing 
    Set wsTemp = Nothing 
End Sub 
+0

Hello Siddharth, 코드는 훌륭하게 작동하고 많은 시간을 절약 할 수 있습니다. 그러나이 코드는 현재 하나의 통합 문서와 만 연결됩니다. 30 권이 넘는 통합 문서가 있고 각각 하나의 워크 시트 만있는 경우는 어떻습니까? 각 통합 문서의 모든 열 A를 새 통합 문서의 Sheet1로 이동하고 각 통합 문서의 열 B를 Sheet2로, C 열을 시트 3으로 이동하는 식으로 작업하는 것입니다. 위의 코드를 사용할 수 있습니다. 그러나 각 다른 통합 문서에 대해 대상 열 범위를 수동으로 변경해야합니다. 이것을 쉽게 할 수있는 방법이 있습니까? – user1549922

+1

나는 위에서 언급 한 논리를 살펴 보았을 것이라고 확신한다. 생각해 보라.루프에서 워크 북을 열어 목적지 열을 설정하는 추세를 찾을 수 있는지 확인하십시오. 시도해보십시오. 멈추었을 경우 시도한 코드를 게시하면 거기에서 가져옵니다. –

+0

코드를 조금 수정합니다. 내 파일 이름을 1, 2, 3, 4 등으로 변경합니다. 그냥 더 쉽게 만들려고 노력하십시오. 그러나 내 코드를 실행할 때마다 wb.Sheets ("Sheet"& i) .Range (colName2 & "3"& ":"& colName2 & "102") 오류가 발생합니다. (colName & "3"& ":"& colName & "102"). 값 – user1549922

관련 문제