【问题标题】:Intersect with Target与目标相交
【发布时间】:2018-01-21 00:19:29
【问题描述】:

我不知道如何使下面的代码工作。每次调用都会导致 Intersection = Nothing 并且选择了 ELSE 语句,并且 yes rngIntersect 是有效且非空的,并且交集不是空的,因此问题出在目标部分。

当我调试代码并询问时?目标结果是 zilch。然而,target.column、target.row 和 target.address 分别都是正确的 3,9 和 $C$9)。

这一定是一些基本的东西,但毕竟在不同的网站上环顾四周,我还没有想出一个解决方案。

我可以使用 target.column 和 target.row 找到目标是否在范围内,但我无法让下面更优雅的代码工作。无论出于何种原因,目标似乎“有点但不是完全空的”。

为了强调,在调试窗口中?目标返回空但是? target.address 返回 $C$9,因为这是用户选择的单元格,并且 rngIntersect = $C$9:$N$9,因此 Intersect = $C$9 肯定 没有。

我试过了吗?范围(目标)和? target.range 但会产生错误。

本质上,我如何让目标返回它应该的范围,毕竟它被定义为一个以正确开头的范围?

Sub OnSelectionChange(ByVal target As Range, wksChange As Worksheet)

On Error GoTo ErrorHandler

Dim rngIntersect As Range, rngTarget As Range

Set rngIntersect = wksChange.Range("RNGINTERSECT")
Set rngTarget = target

    If Not Application.Intersect(rngTarget, rngIntersect) Is Nothing Then
        Call WorksheetSelectionChange(target.Column, wksChange)
    Else
        Call MAIN.ZoomAdjust(wksChange, False)
    End If

ErrorExit:
    Exit Sub

ErrorHandler:
    Call LogError(Err.Number, Err.Description, C_MODULE, "OnSelectionChange")
    Resume ErrorExit

End Sub

【问题讨论】:

  • 您为什么不使用私有 Worksheet_SelectionChange 或 Workbook_SheetSelectionChange?
  • target 在哪张纸上? FWIW ? target 正在做?target.Value 如果targetRange - 那么target 所在工作表的单元格C9 中的值是多少?如果您不确定您指的是哪个工作表,请执行?target.Worksheet.Name
  • 这里需要两个参数吗?您有target 和父工作表,但正如@YowE3K 指出的那样,这与target.Worksheet(或target.Parent)相同。这里不是您的核心问题,但您可以稍微简化您的方法调用...

标签: vba excel


【解决方案1】:

我认为您的问题不是来自您的代码,而是来自您的期望,即? Target 应该打印一些东西。 Target 是一个范围,当您不指定要打印的属性时,将打印默认属性.Value。单元格可能为空这一事实并不能说明它作为范围对象的存在。

Target 是一个范围对象。因此,您不需要将其转换为范围对象,如 rngTarget。作为一个范围对象,它的一个属性是.Worksheet,因此,您不需要将其作为附加参数传递。请记住,Application.Intersect 也返回一个范围对象。

下面是工作代码。我已经删除了任何可能让你感到困惑的东西,特别是你的错误处理程序。如果这种代码产生了错误,您想立即知道它,而不是在 3 小时徒劳的搜索之后才知道。

Option Explicit

Private Sub TestIntersect()
    OnSelectionChange Range("C9")
    OnSelectionChange Range("C3")
End Sub

Sub OnSelectionChange(ByVal Target As Range)

    Dim WksChange As Worksheet
    Dim RngIntersect As Range

    Set WksChange = Target.Worksheet
'    Set RngIntersect = WksChange.Range("RNGINTERSECT")
    Set RngIntersect = WksChange.Range("C9:N9")

    If Not Application.Intersect(Target, RngIntersect) Is Nothing Then
        WorksheetSelectionChange Target.Column, WksChange
    Else
        MAINZoomAdjust WksChange, False
    End If
End Sub

Private Sub WorksheetSelectionChange(ByVal C As Long, _
                                     Ws As Worksheet)
    MsgBox "Here is WorksheetSelectionChange" & vbCr & _
           "Column " & C
End Sub

Private Sub MAINZoomAdjust(Ws As Worksheet, _
                           ByVal TooBig As Boolean)
    MsgBox "Here is MAINZoomAdjust" & vbCr & _
           "TooBig = " & TooBig
End Sub

【讨论】:

  • 非常感谢您的帮助和提供代码。我刚刚发现我的问题是什么。 wksChange.Range("RNGINTERSECT") 不返回我需要的范围,而是我需要的范围的字符串表示形式。正确的代码是 If Not Application.Intersect(target, wksChange.Range(wksChange.Range("RNGINTERSECT"))) Is Nothing Then
【解决方案2】:

我确实发现了问题。正确的代码应该是 如果不是 Application.Intersect(target, wksChange.Range(wksChange.Range("RNGINTERSECT"))) 则什么都没有

而不是 如果不是 Application.Intersect(target, wksChange.Range("RNGINTERSECT")) 则什么都没有

原因是 wksChange.Range("RNGINTERSECT") 返回感兴趣范围的字符串值,而不是范围本身

【讨论】:

  • 除非您说,在您的数据中,范围名称为“RNGINTERSECT”的单元格包含一个值,该值是另一个范围名称(即使下一个范围名称类似于“$B$10 ") 那么这个答案是错误的。而且,如果您说是这种情况,那么应该关闭或删除该问题,因为任何人都无法根据问题确定这是这种情况,并且该问题对其他人没有用处谁在寻找答案时偶然发现了它。
  • @YowE3K 代码有效,我想我不能与成功争论,可以吗? RNGINTERSECT 是一个命名变量,引用工作表 ActionLog 中的单元格 Y3(在我的代码中称为 wksChange)。 Y3 的值是 $C$9:$N$9 我需要的交叉点范围。因此 wksChange.Range(wksChange.Range("RNGINTERSECT")) 指向所需的范围。
  • OK - 所以您在wksChange.Range("RNGINTERSECT") 引用的单元格中确实有一个范围名称。 FWIW - 你真的应该说If Not Application.Intersect(target, wksChange.Range(wksChange.Range("RNGINTERSECT").Value)) Is Nothing。当您引用RangeValue 时,显式使用.Value 属性,而不是仅仅默认使用它,这将在将来减少您的问题,因为它会使您的代码更容易理解。跨度>
  • 我仍然建议您更新问题 - 您在“rngIntersect = $C$9:$N$9”问题中的陈述是错误的。如果您在问题中声明“rngIntersect”是单元格 Y3,那么人们将有机会回答。
猜你喜欢
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-21
  • 2019-01-20
  • 1970-01-01
  • 2017-05-02
相关资源
最近更新 更多