, 코드를 검사 할 수 있습니다 : 당신은 이미이 작업을 수행 한 수
일반하지만
을 반복 사용 Option Explicit
및 decalre warrents 모든 변수
코드
Sheets.Add
이것은 활성 Workbook
에 새로운 Worksheet
을 추가하고 현재 활성 시트 앞에 놓은 다음 새 시트를 활성화합니다.
문제 : Worksheet
의 새 기능을 사용하는 기본 동작을 사용하는 경우 새 시트의 위치를 알 수없고 참조 할 필요가 없습니다.
제안 :
통합 문서 개체에 대한 참조를 확인하고 사용하는 코드 전반에 걸쳐
Dim wb As Workbook
Set wb = ActiveWorkbook
제어 무엇을, 당신은 통합 문서
Dim wsSummary as Worksheet
Set wsSummary = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
wsSummary.Name = "Summary"
에 추가하는 방법 내 코드
For Each wsheet In Worksheets
myavg.Add wsheet.Range("B2:B11")
Next
책에서 Worksheet
에서 Range
의 Collection
을 만듭니다 (방금 만든 책 포함). 나는 당신이 그 것을 포함하고 싶지 않다고 생각합니다. 유지 보수를 쉽게하기 위해서는 범위를 유지하고 코드 전체에서 변수를 사용하는 변수를 만들어야합니다.당신은 Collection
반복하지만 루프를 참조하지 않는 : 위
Dim wsheet as WorkSheet
Dim RangeAddress As String
RangeAddress = "B2:B11"
For Each wsheet In wb.Worksheets
If wsheet.name <> wsSummary.Name Then
myavg.Add wsheet.Range(RangeAddress)
End If
Next
코드를
For i = 1 To myavg.Count
avg1 = Application.WorksheetFunction.Average(Range("B2:B11"))
Next
문제를 적용 할 수 있습니다. 매회마다 avg1
을 계산하고 다음 루프에서 덮어 씁니다. 당신이
제안 (방금 추가 한 빈 새 시트가 될 것이다) 활성 시트에 범위의 평균을 계산 루프를
때마다 : 당신의 평균을 나열 할 것처럼 앞으로 점프
, 그것은 보인다 새로운 시트. 연속 한 행에 1 장씩. 따라서 배열의 평균을 나중에 요약 시트에 저장할 수 있습니다. Range
중 하나라도 비어 있으면 Average
오류가 발생합니다.
Dim avg() as Variant
Redim avg(1 to myavg.Count, 1 To 1)
For i = 1 To myavg.Count
avg(i, 1) = Application.WorksheetFunction.Average(myavg(i))
Next
코드
curColumn = 5
curRow = 4
For i = 1 To myavg.Count
ActiveSheet.Cells(curRow, curColumn).Value = avg1
curRow = curRow + 1
Next
문제 :이
이 코드는 단순히 새에 결과를 두는 연속 행
에 avg1
의 마지막 계산 된 값을 넣습니다 시트 : 동료가 있음 cted 배열로 평균은, 지금까지와 삼각근 Error Handling
하지 뭐죠 시트
Dim curColumn as Long, curRow As Long
curColumn = 5
curRow = 4
wsSummary.Cells(curRow, curColumn).Resize(UBound(avg, 1), 1) = avg
에 해당 넣을 수 있습니다. 여러 가지 방법으로 코드가 잘못 될 수 있으므로 코드에 Error Handling
을 포함하는 것이 좋습니다. 예를 들어 '요약'이라는 시트가 이미 있다면? Average
가 오류를 반환하면 어떻게됩니까? 이 좋은 방법인지에 선삭
, 그 결과를 보유하는 배열을 생성 한 것이 명백하다, 그 배열은 통합을 통한 통과에 채울 수 있었다. 이
Sub Demo()
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim RangeAddress As String
RangeAddress = "B2:B11"
Dim wsSummary As Worksheet
Dim avg() As Variant
ReDim avg(1 To wb.Worksheets.Count, 1 To 1)
For i = 1 To UBound(avg, 1)
With wb.Worksheets(i).Range(RangeAddress)
If WorksheetFunction.Count(.Value) > 0 Then
avg(i, 1) = WorksheetFunction.Average(.Value)
Else
avg(i, 1) = "No Values On Sheet"
End If
End With
Next
Dim curColumn As Long, curRow As Long
curColumn = 5
curRow = 4
On Error Resume Next
wsSummary = wb.Worksheets("Summary")
If Err.Number <> 0 Then
' Summary sheet does not exist, create it
Err.Clear
On Error GoTo 0
Set wsSummary = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))
wsSummary.Name = "Summary"
Else
On Error GoTo 0
' Summary sheet already exists
' what do you wnat to do?
End If
wsSummary.Cells(curRow, curColumn).Resize(UBound(avg, 1), 1) = avg
End Sub
같은
뭔가이 코드는 여전히 당신의 정확한 요구 사항에 따라 문제가있을 수 있습니다 (예 : "요약"시트가 이미 존재하는 경우,이 평균 루프를 처리합니다)
가있다 이 코드에는 많은 잔인 함이 있습니다. 이것을 달성하기 위해 반드시 Collection을 사용할 필요는 없습니다. 'Worksheets'에서'for each'를 사용하고, 평균을 계산하고 루프를 위해 3 (!!) 대신에 한꺼번에 적절한 셀에 출력하십시오. – ApplePie
정확도 문제에 대해서는'avg1'의 데이터 타입은 무엇입니까? – ApplePie