2014-12-26 7 views
0

스프레드 시트에서 관심있는 각 셀에 입력되는 데이터를 표준화하고 유효성을 검사 한 데이터 입력을 제공하는 스프레드 시트가 있습니다. 데이터 확인/표준화 작업은 Worksheet_Change 이벤트를 사용하여 수행되었습니다. Excel에서 내장 된 데이터 유효성 검사 대신 VBA를 사용하기로 선택한 이유는 값을 입력 할 때만 작동하기 때문에 다른 스프레드 시트에서 복사 및 붙여 넣기가 데이터 유효성 검사를 덮어 씁니다.32 비트 Excel 2010에 대한 대규모 Worksheet_Change 절차의 해결 방법은 무엇입니까?

유효성을 검사해야하는 데이터 필드 (셀)의 수가 주어지면 Worksheet_Change 하위가 매우 커졌습니다. 64 비트 Excel에서는 문제가 없었지만 Procedure too large 오류가있는 32 비트 Excel 초크입니다. 유일한 방법은 프로 시저를 세분화하는 것이지만 프로 시저의 특성 (변경 이벤트)을 고려할 때 불가능합니다. 어떤 도움이라도 좋을 것입니다.

편집 : 내가 뭔가의 일이 할 수처럼 검증을위한 코드의 일부 모양을 나는 알고없이 Worksheet_Change 서브

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim cell As Range 
    Set cell = Range("Range1") 
    If Not Application.Intersect(cell, Range(Target.Address)) Is Nothing Then 
     'Run Validation for Range1 
    End If 
    Set cell = Range("Range2") 
    If Not Application.Intersect(cell, Range(Target.Address)) Is Nothing Then 
     'Run Validation for Range2 
    End If 
    .... 
End Sub 

감사의 구조,

+0

_Change 이벤트의 모든 것이 있습니까? 또는 _change 이벤트에서 subs 호출합니까? – peege

+0

End If와 End Sub 사이의 거리는 얼마나됩니까? ... – peege

+0

코드 1000 개가 넘고 이름이 100 개의 범위에 가깝습니다. –

답변

0

을 보여주기 위해 조각을 포함했다 수행원. 각 유효성 검사 유형에 대해 구분 된 메서드를 작성하므로 코드 길이가 허용되는 길이를 초과하면 안됩니다.

Option Explicit 

Private Sub Worksheet_Change(ByVal Target As Range) 
    WorksheetChanged Target 
End Sub 

Private Sub WorksheetChanged(ByVal Target As Range) 
    Dim names As Variant 
    Dim name As Variant 
    Dim namedRange As Range 

    names = Array("Range1", "Range2", "Range3") ' etc. until all your 100 named ranges 

    For Each name In names 
     Set namedRange = Range(name) 
     If Not Application.Intersect(namedRange, Range(Target.Address)) Is Nothing Then 
      Validate Target, namedRange 
      Exit For 
     End If 
    Next name 
End Sub 

Private Sub Validate(ByVal Target As Range, ByVal namedRange As Range) 
    Select Case namedRange.name.name 
     Case "Range1", "Range2" 
      ' Run Validation for Range1,2 
      Validate1 Target 
     Case "Range3" 
      ' Run Validation for Range3 
      Validate2 Target 
     Case Else 
      Err.Raise 123, "This name is not supported for validation" 
    End Select 
End Sub 

Private Sub Validate1(ByVal Target As Range) 
    ' Specific validation here 
End Sub 

Private Sub Validate2(ByVal Target As Range) 
    ' Specific validation here 
End Sub