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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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
Excel 当目标位于验证列表中时,Application.Intersect失败_Excel_Vba - Fatal编程技术网

Excel 当目标位于验证列表中时,Application.Intersect失败

Excel 当目标位于验证列表中时,Application.Intersect失败,excel,vba,Excel,Vba,在我的几个项目中,我在整个活动程序中广泛使用以下功能。每隔一段时间,它就会失败,并在指示行上出现下标错误 Function Insect(Target As Range, ParamArray Rng() As Variant) As Boolean Dim Fun As Variant ' range intersection / return boolean Dim Area As Range ' Range.Area

在我的几个项目中,我在整个活动程序中广泛使用以下功能。每隔一段时间,它就会失败,并在指示行上出现下标错误

Function Insect(Target As Range, ParamArray Rng() As Variant) As Boolean

    Dim Fun     As Variant          ' range intersection / return boolean
    Dim Area    As Range            ' Range.Area
    Dim i       As Integer          ' index
    
    For i = 0 To UBound(Rng)
        For Each Area In Rng(i).Areas
            Set Fun = Application.Intersect(Target, Area)  ' failure occurs here
            Fun = Not Fun Is Nothing
            If Fun Then Exit For
        Next Area
        If Fun Then Exit For
    Next i
    Insect = Fun
End Function
据我回忆,当函数从一个事件过程调用时,所有的失败都发生了,该过程通过数据验证响应单元格中的更改,这意味着(在上述过程的上下文中)只有一个单元格的简单范围,因此只有一个区域,没有什么比函数能够处理的更奇怪的了。在每种情况下,测试都表明这两个范围都可用(检查地址和值),对于所有外观,该功能都应该工作。在每种情况下,当动作重复时,它都起作用。很难得出结论,因为我不能随意产生错误

我现在认为这是由于鼠标操作不精确造成的,不知何故,鼠标的点击并没有准确地出现在下拉列表中的一个项目上,或者可能在做出选择后但在单元格中显示之前滑向相邻的单元格。这一理论将意味着变更事件发生在验证完成之前,也就是说变更“批准”之前。然后,该理论会得出结论,如果不将Application.Intersect绑定到一个不必要的复杂函数中,它也会失败。因此,我的问题是:-

  • 是否有人有过与数据验证下拉列表相关的应用程序中断的经验
  • 为了在错误发生之前纠正错误,有谁能告诉我在验证和更改之间发生的事件顺序吗。有没有办法检查点击是否准确
  • 是否有人会鼓励(或不鼓励)我在错误发生后尝试捕获错误,比如下次只需将相同的范围重新提交给相同的函数
  • 在最后一种情况下要回答的问题是,是在函数中还是在事件过程中执行此操作。由于这两个范围在函数中都是可用的,所以我试图捕获错误并再次运行相同的数据。但由于我不知道是什么原因导致了错误,我可能会创建一个无休止的循环。也许使用DoEvents冷却一段时间会有所帮助

    更好地理解操作和事件的顺序可能会使我找到修复导致故障的损坏数据的方法。在事件过程中,这可能更容易做到。例如,如果其中一个范围缺少有关其父对象的信息,而这些信息在函数中不可用,但在事件过程中很容易提供—如果我知道范围对象可能以何种方式损坏的话

    有什么想法吗?欢迎所有建议

    根据@FaneDuru的建议,我对函数进行了如下修改

    Dim Fun     As Boolean          ' return boolean
    Dim Sect    As Range            ' intersection range
    Dim Area    As Range            ' Range.Area
    Dim i       As Integer          ' index
    
    For i = 0 To UBound(Rng)
        For Each Area In Rng(i).Areas
            Set Sect = Application.Intersect(Target, Area)
            Fun = Not Sect Is Nothing
            If Fun Then Exit For
        Next Area
        If Fun Then Exit For
    Next i
    Insect = Fun
    
    不幸的是,这似乎没有什么不同。下一次崩溃再次发生在同一行(
    Set Sect=Application.Intersect(Target,Area)
    ),但我认为错误消息是另一条,“对象不支持此属性或方法”。Target.Address,Rng(I).Address和Area.Address(打印到即时窗口)都与预期的一样。我发现的唯一不规则之处是目标显示为空(忘记检查是否包含错误)。尽管我可能尝试,但我无法使用相同或不同的数据在同一位置复制错误。我的测试包括输入“”我仍然认为触发单元格具有数据验证的重要性(列表是从同一工作簿中的不同工作表中动态提取的,因此可能会稍微延迟到达-我不知道)


    当时运行的唯一其他应用程序是MS Edge(和VBE)。已修改程序以指定
    Set Sect=Excel.application.Intersect(目标,区域)
    并将继续使用该功能,直到它可能再次崩溃。

    购买新鼠标解决了该问题。结果表明,我观察到的闪烁不是由不精确的单击引起的,而是由不精确的单击解释引起的。当新鼠标开始工作时,整个问题消失了。这发生在3个月前,同一代码一直在完美地工作。

    请尝试声明
    Dim Fun As Range
    Intersect
    返回一个范围。
    布尔值
    仅通过范围分析得出是否为
    的结果。理论上,
    As Varian
    我的范围也包括一个范围,但有时VBA可能是b如果不准确地声明为变量,则e会感到困惑…抛出的错误是什么?验证通常会同时失败吗?@JMP感谢您的时间。这是一个下标错误。我已修改了我的问题,以包含这些信息。不,验证没有失败。我只是觉得在我创建se的方式中有一个摇摆回忆。@FaneDuru谢谢你的时间。不,乐趣不应该是一个范围。`Fun=不乐趣什么都不是。`Fun=不乐趣什么都不是`。错误发生在那之前的一行。哈哈-我忘了我是如何编写自己的函数的。很抱歉理解得太慢,但现在我想你说对了。我将拆分
    Fun
    的两个函数,并使用两个变量:范围和布尔。因为不是每次使用都会出错,我会测试一周,然后回来。谢谢你的耐心。