【问题标题】:Excel VBA named range scope, and intersect functionExcel VBA 命名范围范围和相交函数
【发布时间】:2021-06-04 14:03:59
【问题描述】:

我有一张表格,用户可以在其中从下拉列表中选择一个值。然后我在另一张纸上搜索该值,并返回该单元格的地址。该地址被提供给一个函数,该函数查看每个命名范围并寻找相交。我已经在该函数上输入了一些“调试”信息,只是为了查看它是否正在触发,而事实并非如此。我有 3 张可能会看穿的工作表,所以我必须小心不要抛出 1004 错误来寻找不同工作表上的相交。我在这里不知所措。我确定这是愚蠢的,但我找不到它。任何帮助表示赞赏。

For i = 1 To EndWRow
    For j = 1 To EndWColumn
        If woodSearch = Worksheets("Woods").Cells(i, j).Value Then
            
            Worksheets("Woods").Activate
            
            x = ActiveSheet.Name
            y = Worksheets("Woods").Cells(i, j).Address
            Set wMatchCell = Worksheets("Woods").Cells(i, j)
            
            If IsNamedRange(wMatchCell, woodRangeName) Then
                MsgBox "Range Name:= " & woodRangeName.Name & Chr(10) & _
                    "Range RefersTo:= " & woodRangeName
                    
                woodRangeNameString = woodRangeName.Name
                'Worksheets("Woods").Range(woodRangeNameString).Copy
                'Worksheets("Bag 1").Range("B2:H23").PasteSpecial xlPasteValuesAndNumberFormats
                'Worksheets("Bag 1").Range("B2:H23").PasteSpecial xlPasteFormats
                'Worksheets("Bag 1").Range("B2:H23").PasteSpecial xlPasteColumnWidths
                
            Else
                MsgBox "Invalid Selection. Sheet name is: " & x & " and selected address is: " & y
            End If
            
            Exit For
            
        End If
    Next j
Next i

查找命名范围函数:

Function IsNamedRange(ByVal Target As Range, ByRef NamedRange As Name) As Boolean
Dim nm As Name
Dim i As Integer
i = 7

With ThisWorkbook.Sheets(Target.Parent.Name)
    For Each nm In .Names
        Sheets("User Entry").Range("B" & i).Value = nm
        If Not Application.Intersect(Target, Range(nm)) Is Nothing Then
                IsNamedRange = True
                Set NamedRange = nm
                Exit Function
        End If
    i = i + 1
    Next nm
End With
End Function

至少,我觉得这个函数至少应该在我的工作表上打印所有命名的范围(不是真的想要,但我把它扔进去调试),它什么也没做。总而言之,“else”最终会执行......

【问题讨论】:

  • 确定您姓名的范围(不是 referTo)在工作表上吗?如果它在工作簿上,则需要遍历工作簿的名称。使用名称管理器进行检查。
  • 它们都是工作簿范围的。如果我遍历整本书,则 Intersect 会引发 1004 错误。输入 On Error GotTo Next?但是放在哪里呢?当我签入名称管理器时,更改范围的选项显示为灰色
  • 最简单的方法是重新定义名称,以便范围基于工作表。
  • 通过创建一个只有工作表范围的新命名范围进行测试。作品。看起来我需要删除并重新创建每个命名范围。 叹息

标签: excel vba named-ranges


【解决方案1】:

您可以进行一些更改以使其更通用。还更新了方法名称并将名称作为函数的返回值返回 - 我不确定 Boolean + ByRef 是否能得到比测试返回值更多的东西?

Sub Tester()
    Dim nm As Name
    
    Set nm = GetMatchedRange(Selection)
    If Not nm Is Nothing Then
        Debug.Print nm.Name, nm.RefersToRange.Address
    Else
        Debug.Print "no name"
    End If

End Sub

Function GetMatchedRange(ByVal Target As Range) As Name
    Dim nm As Name, i As Integer, rng As Range
    'always operate on the parent workbook of Target
    For Each nm In Target.Worksheet.Parent.Names
        'Sheets("User Entry").Range("B" & i).Value = nm
        Set rng = Nothing
        On Error Resume Next
        Set rng = nm.RefersToRange 'not all names refer to ranges...
        On Error GoTo 0
        If Not rng Is Nothing Then
            'does this name refer to a range on the same sheet as Target?
            If rng.Parent.Name = Target.Parent.Name Then
                If Not Application.Intersect(Target, rng) Is Nothing Then
                    Set GetMatchedRange = nm
                    Exit Function
                End If
            End If
        End If
        i = i + 1
    Next nm
End Function

【讨论】:

  • 经过测试,这也有效。感谢您的回复!我最终只是按照现在的预期重新创建了命名范围和原始作品。长话短说,不要在 Mac 版本的 Excel 中创建命名范围。我必须在我的 Windows 工作笔记本电脑上创建命名范围才能对它们进行范围控制。
猜你喜欢
  • 2019-12-05
  • 2017-10-01
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-19
  • 1970-01-01
相关资源
最近更新 更多