잘 했어! 월 시트를 처리하는 코드를 작성했습니다.
지금 그 덩어리를 가지고, 복사 - 대신 아래에 붙여 넣기 및 "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").Value
은 Variant/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
작업은 여전히 네가하고 싶은대로하지 않는다. - 슬프게도,이 대답은 이미 충분히 길다! 행운을 빕니다!
매트의 머그잔, 시간 내 주셔서 감사 드리며 모든 것이 완벽하게 작동했습니다! 놀랄 만한! – Tom
@Tom Pleasure! 위쪽/아래쪽 투표 버튼 바로 아래에있는 녹색 체크 표시를 체크하십시오 :) –
@Tom https://meta.stackexchange.com/a/5235/289619 참조 – 0m3r