2017-04-11 1 views
1

메인 시트가 Mainsheet이고 다른 12 개의 시트가 매월 하나씩 있습니다. 내가 데이터를 복사 할 필요가 1 월이나 2 대개 2 월 등의 개월VBA 데이터 값에 따라 메인 시트에서 다른 시트로 데이터 복사 및 붙여 넣기

Mainsheet 가질 수있는 데이터는 달이 때문이다 따라서 내 mainsheet에 반영 Jan 중 하나 Feb에 붙여 넣습니다. 여기

Sub Macro1() 

    Dim i, LastRow 
    LastRow = Sheets("Mainsheet").Range("A" & Rows.Count).End(xlUp).Row 

    For i = 5 To LastRow 

     If Sheets("Mainsheet").Cells(i, "E").Value = "1/20/2017" Then 
      Sheets("Mainsheet").Cells(i, "A").EntireRow.Copy 
      Destination:=Sheets("Jan").Range("A" & Rows.Count).End(xlUp).Offset(1) 
     End If 

    Next i 

End Sub 

내 질문은 데이터가 Feb하지 Jan의 달 경우 I 매크로를 계속 어떻게입니다 .. 내가 지금까지 가지고 무엇인가? 그리고 어떻게하면 1 월의 달을 지정할 수 있습니까?하지만 내 코드의 1/20/2017과 같은 특정 날짜는 지정하지 않으십니까?

A5:M5의 범위와 마지막 채워진 셀까지의 행을 복사하는 대신 마지막 열이 사용 될 때까지 A:5의 전체 범위를 복사하는 방법은 무엇입니까?

답변

1

잘 했어! 월 시트를 처리하는 코드를 작성했습니다.

지금 그 덩어리를 가지고, 복사 - 대신 아래에 붙여 넣기 및 "Feb""Jan" 교체 등등 ... 12 회 ....이 할의 :

Private Sub UpdateMonthlyData(ByVal target As Worksheet) 

End Sub 

그런 다음 거기에 붙여 넣습니다, Sheets("Jan")target으로 대체하십시오. 프로젝트 탐색기에서 Mainsheet (Sheet1) 개체를 두 번 클릭 -

Private Sub UpdateMonthlyData(ByVal target As Worksheet) 
    Dim i, LastRow 
    LastRow = Sheets("Mainsheet").Range("A" & Rows.Count).End(xlUp).Row 
    For i = 5 To LastRow 
     If Sheets("Mainsheet").Cells(i, "E").Value = "1/20/2017" Then 
      Sheets("Mainsheet").Cells(i, "A").EntireRow.Copy 
      Destination:=target.Range("A" & target.Rows.Count).End(xlUp).Offset(1) 
     End If  
    Next i 
End Sub 

이의 조금이 정리하자 (Ctrl 키 + R을 - Rubberduck으로 코드 탐색기를 불러옵니다)과 : 당신이 남아있어 그런 다음 F4를 눌러 속성을 불러옵니다. (Name) 속성을 Sheet1에서 MainSheet으로 변경하십시오. 이제 당신은이 작업을 수행 할 수 있습니다

Private Sub UpdateMonthlyData(ByVal target As Worksheet) 
    With MainSheet 

     Dim lastRow As Long 
     lastRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     Dim i As Long 
     For i = 5 To lastRow 
      If .Cells(i, "E").Value = #1/20/2017# Then 
       .Cells(i, "A").EntireRow.Copy target.Range("A" & target.Rows.Count).End(xlUp).Offset(1) 
      End If 
     Next 

    End With 
End Sub 

MainSheet 당신이 MainSheet에 그 (Name) 속성을 설정하여있어 "무료"글로벌 범위 개체 변수입니다 - VBA는 이름을 따서 글로벌 범위 객체를 생성하고, 당신은 그것을 사용할 수 있습니다 어디에서나 을 참조하면 코드는입니다.

그래서 여기에 무엇이 있습니까? 우리는 복사 할 시트 인 monthSheet 매개 변수를 얻습니다. 그 값을 알아내는 것이 그 자체의 또 다른 문제이며, 우리는 그것에 귀찮게 할 필요가 없습니다. 선언을 명시된 형식으로 옮기고 선언문에 명시 적 형식을 지정했으며 .이라는 점을 사용하는 모든 항목에 With MainSheet 명령을 적용하여 개체 인 개체를 정규화했습니다.

자격 물건은 중요하다 :이 명시 적으로 워크 시트 참조, Range, Cells, Rows, Columns 앞에 않을 때는 ... 그들은 모두 암시 적으로 ActiveSheet를 참조하십시오 - 당신은 을 아니라 모든 시트를 작업 할 때 활성 시트를하면 암시 적으로 활성 시트를 호출하면 문제가 발생합니다.

나는 # 대신 "으로 #date literal#을 동봉 - 그 문자열 리터럴입니다. #date literal#을 사용하면 String에서 Date으로의 암시 적 변환을 피할 수 있습니다. .Cells(i, "E").ValueVariant/Date이어야하기 때문입니다.

다음으로 우리는 달 매개 변수화 및 워크 시트 추론 :

For i = 1 To 12 
    UpdateMonthlyData i 
Next 

그렇지 않은 : 이제 호출자는 12 일에서 루프를 실행하는 데 필요한

Private Sub UpdateMonthlyData(ByVal monthIndex As Long) 
    With MainSheet 

     On Error GoTo ErrHandler 

     Dim name As String 
     name = MonthName(monthIndex, True) 

     Dim target As Worksheet 
     target = ThisWorkbook.Worksheets(name) 

     On Error GoTo 0 'from this point onward any error bubbles up to the caller 

     Dim lastRow As Long 
     lastRow = .Range("A" & .Rows.Count).End(xlUp).Row 

     Dim i As Long 
     For i = 5 To lastRow 
      Dim monthCell As Range 
      monthCell = .Cells(i, "E") 
      If Not IsError(monthCell.Value) Then 
       If CStr(monthCell.Value) = name Then 
        .Cells(i, "A").EntireRow.Copy target.Range("A" & target.Rows.Count).End(xlUp).Offset(1) 
       End If 
      Else 
       Debug.Print "Cell " & monthCell.Address & " contains an error value and cannot be processed." 
      End If 
     Next 

    End With 
    Exit Sub 

ErrHandler: 
    Debug.Print "Could not find a worksheet for month " & monthIndex & "." 
End Sub 

은 모든 시트를 처리하기를 내가 생각하는 것보다 훨씬 더 깨끗해진다.

지금, 그 .Copy 작업은 여전히 ​​네가하고 싶은대로하지 않는다. - 슬프게도,이 대답은 이미 충분히 길다! 행운을 빕니다!

+0

매트의 머그잔, 시간 내 주셔서 감사 드리며 모든 것이 완벽하게 작동했습니다! 놀랄 만한! – Tom

+1

@Tom Pleasure! 위쪽/아래쪽 투표 버튼 바로 아래에있는 녹색 체크 표시를 체크하십시오 :) –

+0

@Tom https://meta.stackexchange.com/a/5235/289619 참조 – 0m3r

관련 문제