2012-10-21 2 views
1

여러 워크 시트의 특정 범위 ("C2 : C11")의 평균을 새 워크 시트로 계산해야합니다. 새 시트가 추가되고 데이터가 지정된 범위에 입력되면이 기능은 계속 작동해야합니다.Vba에서 여러 시트의 평균 수집

지금까지 내가 가진이

....

Sheets.Add 

Dim myavg As Collection 
Set myavg = New Collection 

For Each wsheet In Worksheets 
    myavg.Add wsheet.Range("B2:B11") 
Next  
For i = 1 To myavg.Count 
    avg1 = Application.WorksheetFunction.Average(Range("B2:B11")) 
Next 

curColumn = 5 
curRow = 4 

For i = 1 To myavg.Count 
    ActiveSheet.Cells(curRow, curColumn).Value = avg1 
    curRow = curRow + 1 
Next 

...

그것은 하나 개의 번호 새로운 시트의 원하는 범위에 반환하고 정확하지

내가 뭘 잘못하고 있는지 이해하도록 도와주세요. 미리 감사드립니다. Collection이 작업에 대한 좋은 아이디어인지 여부를 따로 두는

+2

가있다 이 코드에는 많은 잔인 함이 있습니다. 이것을 달성하기 위해 반드시 Collection을 사용할 필요는 없습니다. 'Worksheets'에서'for each'를 사용하고, 평균을 계산하고 루프를 위해 3 (!!) 대신에 한꺼번에 적절한 셀에 출력하십시오. – ApplePie

+0

정확도 문제에 대해서는'avg1'의 데이터 타입은 무엇입니까? – ApplePie

답변

0

, 코드를 검사 할 수 있습니다 : 당신은 이미이 작업을 수행 한 수

일반하지만
을 반복 사용 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에서 RangeCollection을 만듭니다 (방금 만든 책 포함). 나는 당신이 그 것을 포함하고 싶지 않다고 생각합니다. 유지 보수를 쉽게하기 위해서는 범위를 유지하고 코드 전체에서 변수를 사용하는 변수를 만들어야합니다.당신은 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 

같은

뭔가이 코드는 여전히 당신의 정확한 요구 사항에 따라 문제가있을 수 있습니다 (예 : "요약"시트가 이미 존재하는 경우,이 평균 루프를 처리합니다)

+0

와우. 정말 고맙습니다. 내 문제를 이해하고 실수를 설명 할 시간을 내 주셔서 감사드립니다. 약간 수정 한 후에 나는 완벽하게 달릴 수있었습니다. 나는 많은 것을 배웠다. 다시 한번 감사 드려라. :) – MyCatTiger