2014-04-09 3 views
0

200,000 개를 초과하는 데이터베이스가 있습니다. VBA 스크립트를 작성할 때 VBA 스크립트가 빠르게 실행 되었기 때문에 데이터베이스가 필터링되었는지 여부는 신경 쓰지 않았으므로 약 2 만 행의 데이터베이스가있었습니다. 데이터베이스가 거대하고 VBA 스크립트를 테스트한다는 사실을 감안할 때 얼마나 천천히 실행되었는지를 눈치 채고 놀랐습니다. 그래서 더없이 내 코드 같은 모습입니다 대답 :Excel VBA - 보이는 셀에서만 작업 수행

Set wsDB = ThisWorkbook.Sheets("DB") 
Dim nameIndex As Long: nameIndex = Application.Match(name, wsDB.Rows(1), 0) 
Dim formula As String 
    formula = "=IFERROR(AVERAGEIFS(" + GRA(nameIndex) + "," + GRA(dateIndex) + ",R2C," + GRA(cellNameIndex) + ",RC1" + "),"""")" 

을 GRA이 컬럼의 범위의 주소를 반환하는 함수입니다.

Private Function GRA(ByRef rngIndex As Long) 
    GRA = "DB!" + CStr(Range(Cells(2, rngIndex), Cells(rowNos, rngIndex)).Address(1, 1, xlR1C1, 0, 0)) 
End Function 

그래서 지금은 모든 숨겨진 행을 무시하고 눈에 보이는 것만을 고려 있도록 내 코드를 조정할 수있는 방법을 사전에 테이블을 필터링 주어진. 물론 단순한 더러운 솔루션은 단순히 필터 데이터베이스를 복사하여 새로운 시트에 붙여 넣는 것이지만 성능 향상에 영향을 줄 것이라는 것을 알고 있습니다.

+1

아마도 YourRange.SpecialCells (xlCellTypeVisible) .FormulaR1C1 = formula'입니까? – tigeravatar

답변

0

다음 함수를 사용하여 보이는 셀 범위 만 반환 할 수 있습니다.

Function VisibleCells(Rng As Range) As Variant 
Dim R As Range 
Dim Arr() As Integer 
Dim RNdx As Long 
Dim CNdx As Long 

If Rng.Areas.Count > 1 Then 
    VisibleCells = CVErr(xlErrRef) 
    Exit Function 
End If 

ReDim Arr(1 To Rng.Rows.Count, 1 To Rng.Columns.Count) 

For RNdx = 1 To Rng.Rows.Count 
    For CNdx = 1 To Rng.Columns.Count 
     Set R = Rng(RNdx, CNdx) 
     If (R.EntireRow.Hidden = True) Or _ 
       (R.EntireColumn.Hidden = True) Then 
      Arr(RNdx, CNdx) = 0 
     Else 
      Arr(RNdx, CNdx) = 1 
     End If 
    Next CNdx 
Next RNdx 

VisibleCells = Arr 

End Function 

위의 코드는 http://www.cpearson.com/excel/VisibleCells.aspx에서 온 것입니다.

일반적으로 나는 내가 쓰고있는 코드를 게시 하겠지만 이것은 정확히 내가 생각했던 것입니다.