excel 与目标相交

t2a7ltrp  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(118)

我不知道如何使下面的代码工作。每次调用的结果是Intersection = Nothing和ELSE语句选择和yes rngIntersect是有效的和非空的,交集不为空,所以问题是与目标部分。
当我调试代码并询问?target时,结果是zilch。然而,目标.列、目标.行和目标.地址都是正确的(分别为3、9和$C$9)。
这一定是一些基本的东西,但毕竟在不同的网站上四处寻找,我还没有拿出一个解决方案。
我可以通过使用target.column和target.row来判断目标是否在范围之内,但是我无法使用下面更优雅的代码。不管出于什么原因,目标似乎“有点空,但不完全空”。
需要强调的是,在调试窗口中,?target返回空值,但是?target.address返回$C$9,因为这是用户选择的单元格,并且rngIntersect = $C$9:$N$9,因此Intersect = $C$9肯定〈〉Nothing。
我已经尝试了?range(target)和?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
e5nszbig

e5nszbig1#

我认为你的问题不在于你的代码,而在于你的期望,即? Target应该打印一些东西。Target是一个范围,当你不指定你想要打印的属性时,默认属性将被打印,即.Value。单元格可能是空的事实并不说明它作为一个范围对象存在。
Target是一个range对象。因此你不需要把它转换成一个range对象,比如rngTarget。作为一个range对象,它的一个属性是.Worksheet,因此你不需要传递一个额外的参数。记住Application.Intersect也返回一个range对象。
下面是工作代码。我已经剔除了任何可能让你困惑的东西,特别是你的错误处理程序。如果这种代码曾经创建了一个错误,你想立即知道它,而不是仅仅在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
xwbd5t1u

xwbd5t1u2#

我确实发现了问题。正确的代码应该是

If Not Application.Intersect(target, wksChange.Range(wksChange.Range("RNGINTERSECT"))) Is Nothing Then

代替

If Not Application.Intersect(target, wksChange.Range("RNGINTERSECT")) Is Nothing Then

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

相关问题