与目标相交

时间:2018-01-21 00:19:30

标签: excel vba excel-vba

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

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

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

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

要强调,在调试窗口中? target返回空但是? 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

2 个答案:

答案 0 :(得分:0)

我认为您的问题不是来自您的代码,而是来自您的期望,即? 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

答案 1 :(得分:0)

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

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

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