2014-09-20 5 views
0

누군가 나를 도와 줄 수 있기를 바랍니다. 그래서 다음과 같은 코드가 있습니다. 독립 코드는 스스로 잘 작동하지만 스크립트를 실행할 때 첫 번째 조건 만 반복합니다. 내가 원하는 것은 매번 모든 코드를 반복하는 것입니다. 나는 이것이 내가 누락 된 작은 것 같지만 해결책을 찾지 못하는 것 같다.sub는 두 번째 if 문을 반복하지 않습니다. vba

Sub Copypre() 
Dim i As Integer 
Dim n As Integer 

For i = 2 To 10 

'Checks the number of entries in the "Pre" table, to make sure that there are no spaces between the lines 

On Error Resume Next 
    n = Worksheets("Pre").Range("A2:A6000").Cells.SpecialCells(xlCellTypeConstants).Count 
     If n = Null Then 
      n = i 

'Goes through the different sheets to find all "pre" values and paste them in the "Pre" sheet 

    If ThisWorkbook.Sheets("273").Range("A" & i).Value = "Pre" Then 

     Range(Cells(i, 1), Cells(i, 3)).Select 
     Selection.Copy 
     Sheets("Pre").Select 
     Range("A" & n).Select 
     ActiveSheet.Paste 
     Sheets("2736").Select 

       End If 
      End If 
     Next i 
    End Sub 
+1

소스 워크 시트의 이름이 * 273 *인지 * 2736 *인지는 분명하지 않습니다. – Jeeped

+0

문제가 무엇인지 알아내는 것은 어렵지만'If n = null'이라는 잘못된 코드가있을 것입니다. 'n'은 정수로 정의되며 null 일 수 없습니다. 테스트를'If n = 0'으로 변경해야합니다. 어쩌면이 문제가 해결 될 것입니다. – DeanOC

+0

한 시트에서 다음 시트로 이동하는 방법 (원하는 경우) – pnuts

답변

0

루프는 긴 데이터 열에 신속하게 시간을 소비 할 수 있으며 코드가 과도하게 수정되었다고 생각됩니다. 이 방법을 사용하여 대상 워크 시트에 블록 복사를 시도하십시오.

Sub Copypre() 
    With Sheets("273").Cells(1, 1).CurrentRegion 
     .AutoFilter 
     .Columns(1).AutoFilter field:=1, Criteria1:="=Pre" 
     If CBool(Application.Subtotal(103, .Offset(1, 0))) Then 
      .Offset(1, 0).Resize(, 3).Copy _ 
       Destination:=Sheets("Pre").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) 
     End If 
     .AutoFilter 
    End With 
End Sub 

단일 변수 선언없이 수행 할 수있는 모든 것.

부록 :

원래의 질문으로, 전체 if "pre"/copy/paste 섹션 n = Null에 해당하는 경우 때문에 만 도달 할 수있는 if n = Null 내에 중첩된다. 계산에 .SpecialCells(xlCellTypeConstants)이 없으면 n이 기본값 (예 :)으로 지정됩니다. 0이과 같지 않음 Null이 조건을 충족시키지 못합니다. 코드를 확인하려면 다음 행을 추가하십시오.

On Error Resume Next 
n = Worksheets("Pre").Range("A2:A6000").Cells.SpecialCells(xlCellTypeConstants).Count 
Debug.Print "n is " & n 

를 실행 한 후, Ctrl+G으로 즉시 창을 엽니 다. Pre! A2 : A6000에 수식 이외의 값이 없으면 n is 0이 표시됩니다.

+0

하지만 OP는 두 장 이상의 시트를 처리하려고합니다. – pnuts

+0

@pnuts = 예, 워크 시트 이름에 약간의 모호성이 있습니다. 나는 그것이 오타 이상에 지나지 않는다고 추측했지만 나는 그 점에서 매우 잘못 될 수있다. – Jeeped

+0

동의서는 오타 일 수도 있고 아닐 수도 있지만 "다른 장을 통과합니다 ..."라고 생각하고있었습니다. – pnuts

1

코드와 관련하여 몇 가지 문제가 있지만 If n = Null은 정수가 Null 일 수 없으므로 절대로 안 될 수 있습니다. 이것을 If n = 0으로 변경할 수 있습니다.

몇 가지 고려해야 할 :

오류 처리 : 항상 가능한 한 빨리 On Error GoTo 0으로 처리하는 일반적인 오류로 돌아갑니다. 이 방법을 사용하면 코드가 존재하지 않는 시트를 선택하려고 시도하고 있음을 알 수 있습니다 (통합 문서에 시트 "2736"이 없다고 가정).

인수 범위 :Range (및 Cells) 인수를 사용할 때 시트를 지정하지 않을 때는주의하십시오. 선택한 다른 용지 사이에서 뒤로 및 네 번째로 전환하면 Range이 어떤 시트를 반환하는지 추적 할 수있는 변경 사항이 있습니다. 각 워크 시트를 선언 한 다음 범위를 복사하는 것을 고려하십시오.

Dim w273 As Worksheet 
Set w273 = ThisWorkbook.Sheets("273") 
w273.Range(w273.Cells(i, 1), w273.Cells(i, 3)).Copy 
0

감사의 말에 감사드립니다. null 트릭이 효과가있다! 나는 VBA에 완전히 익숙하지 않기 때문에 전문가의 조언과 트릭을 얻는 것이 좋습니다. 매우 우아한 것은 아니기 때문에 Jeeped가 언급 한 것처럼 코드를 더 간단하게 만들려고 노력할 것입니다. 시트에 관해서는, 나는 혼란을 완전히 이해할 수있다. 나는 또한 그것을 고쳤다.이제 작동하고 다음과 같이 보입니다 :

Sub Copypre() 

    Dim i As Integer 
    Dim n As Integer 

    For i = 2 To 5000 
     ' Checks the number of entries in the "Pre" table, to make sure that there are no spaces between the lines 

     On Error Resume Next 
     n = Worksheets("Pre").Range("A2:A6000").Cells.SpecialCells(xlCellTypeConstants).Count 

     ' Goes through the different sheets to find all pre values and paste them in the "Pre" sheet 
     If ThisWorkbook.Sheets("2736").Range("A" & i).Value = "Pre" Then 

      Sheets("2736").Select 
      Sheets("2736").Range(Cells(i, 1), Cells(i, 3)).Select 
      Selection.Copy 
      Sheets("Pre").Select 
      Range("A" & (n + 2)).Select 
      ActiveSheet.Paste 
      Sheets("2736").Select 

      Sheets("2736").Select 
      Range(Cells(i, 5), Cells(i, 6)).Select 
      Selection.Copy 
      Sheets("Pre").Select 
      Range("E" & (n + 2)).Select 
      ActiveSheet.Paste 
      Sheets("2736").Select 

     End If 
    Next i 
End Sub 
관련 문제