Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 32位Excel 2010大型工作表\u更改程序的变通方法?_Vba_Excel_32bit 64bit_Worksheet - Fatal编程技术网

Vba 32位Excel 2010大型工作表\u更改程序的变通方法?

Vba 32位Excel 2010大型工作表\u更改程序的变通方法?,vba,excel,32bit-64bit,worksheet,Vba,Excel,32bit 64bit,Worksheet,我有一个电子表格,用于数据输入,我已经标准化并验证了输入电子表格上每个感兴趣单元的数据。数据验证/标准化是使用工作表\u Change事件完成的。我选择使用VBA而不是Excel内置数据验证,因为后者仅在键入值时有效,从其他电子表格复制和粘贴将覆盖任何数据验证 考虑到需要验证的数据字段(单元格)的数量,工作表的更改变得非常大。这对于64位Excel来说没有问题,但是32位Excel会因过程太大而阻塞错误。唯一的方法是分解过程,但鉴于过程的性质(更改事件),这是不可能的。任何帮助都会很好 编辑:我

我有一个电子表格,用于数据输入,我已经标准化并验证了输入电子表格上每个感兴趣单元的数据。数据验证/标准化是使用
工作表\u Change
事件完成的。我选择使用VBA而不是Excel内置数据验证,因为后者仅在键入值时有效,从其他电子表格复制和粘贴将覆盖任何数据验证

考虑到需要验证的数据字段(单元格)的数量,工作表的更改变得非常大。这对于64位Excel来说没有问题,但是32位Excel会因
过程太大而阻塞
错误。唯一的方法是分解过程,但鉴于过程的性质(更改事件),这是不可能的。任何帮助都会很好

编辑:我已经包含了一个片段来显示
工作表\u更改的结构
sub

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

谢谢,

在不知道验证代码部分看起来如何的情况下,我可以做如下事情。您为每个验证类型编写单独的方法,因此代码不应超过允许的长度

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

你有所有的东西在改变吗?或者你是从_change事件中调用Sub?End If和End Sub之间发生了多少变化。。。有1000多行代码,我有近100个命名范围。其中有多少是共享的?如中所示,您是否有100种不同类型的验证?我认为您需要确定使用了多少种独特的验证类型。然后为每个特定类型指定一个子类,接受来自_change事件的传入参数。例如,SSN、日期、电话、仅限号码、仅限alpha等。不要重复你自己。