2014-12-30 2 views
1

워크 시트의 전체 행을 반복 할 때 이름이 변경되는 다른 워크 시트로 이동하려고 시도했습니다. temp1 (마스터 시트의 데이터)이 temp2 (DCM 시트의 데이터)와 같으면 워크 시트가 일반 이름으로 작성되거나 워크 시트가 이미있는 경우 마스터의 전체 행을 복사합니다 워크 시트를 새로운 (또는 이미 존재하는) 워크 시트에 추가하십시오. 여기 내 코드가있다. 다음 줄에 "첨자가 범위를 벗어남"오류가 발생합니다.변수 이름을 사용하여 행을 워크 시트로 이동

ActiveWorkbook.Sheets("Master").Cells(i, 1).EntireRow.Copy _ 
         Destination:=Worksheets(" & temp2 & ").Range("A" & Rows.Count).End(xlUp).Offset(1) 

Private Sub AddtoWorksheet() 
Dim temp1 As String 
Dim temp2 As String 
Dim i As Integer 
Dim x As Integer 
Dim RowsUsed As Long 
Dim RowsUsed2 As Long 

RowsUsed = ActiveWorkbook.Sheets("Master").UsedRange.Rows.Count 
RowsUsed2 = ActiveWorkbook.Sheets("DCM").UsedRange.Rows.Count 

For i = 2 To RowsUsed 
    temp1 = ActiveWorkbook.Sheets("Master").Cells(i, 1).Value 
     For x = 1 To RowsUsed2 
      temp2 = ActiveWorkbook.Sheets("DCM").Cells(x, 1).Value 
      If temp1 = temp2 Then 
      AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value) 
      ActiveWorkbook.Sheets("Master").Cells(i, 1).EntireRow.Copy _ 
         Destination:=Worksheets(" & temp2 & ").Range("A" & Rows.Count).End(xlUp).Offset(1) 
      Else: 
      End If 
      Next x 

     Next i 
End Sub 

Function AddSheetIfMissing(Name As String) As Worksheet 

    On Error Resume Next 
    Set AddSheetIfMissing = ThisWorkbook.Worksheets(Name) 
    If AddSheetIfMissing Is Nothing Then 
     Set AddSheetIfMissing = ThisWorkbook.Worksheets.Add 
     AddSheetIfMissing.Name = Name 
    End If 

End Function 
+0

대상 : = 워크 시트 (temp2). 범위 (....) – Jeeped

+0

많은 ActiveWorkbook이 있습니다. 통합 문서를 두 개 이상 사용하고 있습니까? 아니면 한 장에 모든 시트가 있습니까? – peege

답변

1

이 솔루션을 살펴보십시오. 몇 가지 문제를 해결하고 수행하려는 작업을 단순화하거나이 문제에 접근하기위한 새로운 방법에 대한 아이디어를 줄 수 있습니다.

일부 노트 :

  • 당신은 당신의 루프 긴 정수 대신 사용해야합니다. 시트가 같은 통합 문서의 모든 경우

  • , 당신은 당신이 당신의 목적지의 정의 내부에 아무것도의 변수 문자열을 연결하는 시도했다 "ActiveWorkbook.Sheets"

  • 를 선언 할 필요가 없습니다. '(& temp2 &)'입니다. 문자열을 만들 때만 그렇게해야하지만, temp1과 temp2는 이미 문자열이며 변수 형식이므로이 작업을 수행 할 필요가 없습니다. 또한이 값은 사용중인 시점에서 동일한 값을 가지므로 둘 중 하나가 해당 행에서 작동합니다.

  • 작성하지 않으려면 Else 문을 포함 할 필요가 없습니다.

  • 아래의 행은 행 i를 참조하지만 DCM은 행 i가 아니며 x 행에 있습니다. 잘못된 시트 이름을 가져옵니다. Master (i)와 DCM (x)을 일치 시켰으며 DCM (i)의 값을 사용하고 있습니다.이 값은 처리되지 않은 시트의 다른 부분입니다. 또한 그 라인에서, 당신은 정말로 값을 전달하고 있기 때문에, 이미 그 값을 가지고있는 temp1/temp2를 전달하려하지 않습니까? 참고 위의

:

AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value) 
  • 당신은 대신에 선택 문을 피하는 데 도움이되는 행을 복사하는 컬럼을 통해 루프를 사용하여 값을 설정할 수 있습니다. 이것은 단지 그것을하는 또 다른 방법 일뿐입니다. 행을 복사하는 것이 필자가 선호하는 방법이며, 필요한 경우 특정 값을 건너 뛸 수 있도록 제어 할 수 있습니다.

한 시트에서 다른 시트로 전체 행을 복사하는 루프 예제. 시트는 새로운 있다면 진정한 제공 부울 테스트을 반환

Private Sub AddtoWorksheet() 
Dim temp1 As String, temp2 As String 
Dim i As Long, x As Long, tRow As Long 
Dim lastRow1 As Long, lastRow2 As Long, lastCol As Long 
Dim Sheet1 As String, Sheet2 As String, tempSheet As String 
Dim isNew As Boolean 

'Define your sheet names 
Sheet1 = "Master" 
Sheet2 = "DCM" 

'Get last row for each sheet 
lastRow1 = Sheets(Sheet1).Range("A" & Rows.count).End(xlUp).row 
lastRow2 = Sheets(Sheet2).Range("A" & Rows.count).End(xlUp).row 

For i = 2 To lastRow1 
    temp1 = Sheets(Sheet1).Cells(i, 1).Value 
    For x = 1 To lastRow2 
     temp2 = Sheets(Sheet2).Cells(x, 1).Value 
     If temp1 = temp2 Then 

'   AddSheetIfMissing (ActiveWorkbook.Sheets("DCM").Cells(i, 1).Value) 
      isNew = AddSheetIfMissing(temp1) 

      'Grab the last column number from Master sheet 
      lastCol = Sheets(Sheet1).Cells(1, Columns.count).End(xlToLeft).column 

      'Set the row on the new sheet 
      If isNew = True Then 
       tRow = 1 
      Else 
       tRow = Sheets(temp1).Range("A" & Rows.count).End(xlUp).row + 1 
      End If 

'   ActiveWorkbook.Sheets("Master").Cells(i, 1).EntireRow.Copy _ 
'    Destination:=Worksheets(" & temp2 & ").Range("A" & Rows.count).End(xlUp).Offset(1) 
      For lCol = 1 To lastCol 
       Sheets(temp1).Cells(tRow, lCol).Value = Sheets(Sheet1).Cells(i, lCol).Value 
      Next lCol 
     End If 
    Next x 
Next i 

End Sub 

기능 :

For lCol = 1 to lastCol Sheets(sheet2).Cells(tRow, lCol) = Sheets(sheet1).Cells(lRow, lCol) Next lCol 

이 솔루션을 고려하십시오. 그렇지 않으면 거짓.

Function AddSheetIfMissing(tempName As String) As Boolean 
Dim ws As Worksheet 
Dim isNew As Boolean 
isNew = False 
    On Error Resume Next 
    Set ws = ThisWorkbook.Worksheets(tempName) 
    If ws Is Nothing Then 
     Set ws = ThisWorkbook.Worksheets.Add 
     ws.name = tempName 
     isNew = True 
    End If 
AddSheetIfMissing = isNew 
End Function 

당신이 원래의 코드에 아직 워크 시트를 반환하도록 설정 한 기능, 당신은 그것을 필요하지, 그래서 사실, 그 변수를 잡아 아무것도 없었다. 시트를 새로 만들었는지 아닌지 확인하기 위해 테스트를 반환해야 데이터를 옮길 필요가있는 행을 결정하는 데 도움이됩니다.

the difference between subs and functions에 대해 더 자세히 설명하는 링크를 확인하십시오.
그 단순한 요약은 두 가지 모두 수행하지만 함수는 값을 반환한다는 것입니다.

+1

정말 고마워요, 완벽하게 작동했습니다! –

관련 문제