【发布时间】: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