gpt4 book ai didi

vba - 使用工作表 CodeName 并避免 .Select 和 .Activate

转载 作者:行者123 更新时间:2023-12-03 02:30:09 27 4
gpt4 key购买 nike

在我的工作簿中,我经常需要使用代码名称激活某些工作表,然后在该工作表中搜索一些文本使用行号或列号包含我要查找的文本的单元格。

在这种情况下,我使用以下代码:

Sheet16.Select '(Using codename)
Cells.Find(What:="FIRST TEXT I'M LOOKING FOR", After:= _
ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

FirstRow= ActiveCell.Row

Cells.Find(What:="SECOND TEXT I'M LOOKING FOR", After:= _
ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Activate

SecondRow = ActiveCell.Row

Rows(FirstRow & ":" & SecondRow + 1).EntireRow.Hidden = False

一切都运行良好,但现在我正在尝试改进我的代码,并且我希望更快地运行我的代码。

现在

1- 如何轻松引用我的工作表的 CodeName?

(我正在寻找像 ThisWorkbook.Worksheets("Sheet1") 这样的答案 - 不是函数

Dim wb as Workbook, ws as Worksheet
set wb = ThisWorkbook
set ws = wb.CodeName(Sheet16) or wb.Sheet16 or sheet16
'then
ws.Cells.Find(What .......... rest of the code ...... )

它们都不适用于 CodeName 属性。 Fully reference a worksheet by codenameReferencing sheets in another workbook by codename using VBA没有回答我的问题。

2-如何避免使用.Activate来使用Cells.Find()公式的结果单元格。

在该示例中,我首先搜索特定文本,即代码第一部分中的 :="FIRST TEXT I'M LOOKING FOR" ,然后我需要使用该单元格获取它的行号或使用偏移任何东西,因此我觉得自己有义务使用.Activate> 因为,

FirstRow =  Cells.Find(What:="FIRST TEXT I'M LOOKING FOR", After:= _
ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row

这种代码不能正常工作。 How to avoid using Select in Excel VBA macros在这个答案中有几个建议,但在这种情况下它们都没有帮助我。我试图从这个答案的所有者那里得到答案,以避免任何重复的问题,但他建议我问一个新问题。 (只要我的两个问题都属于我的示例代码并且我会将它们连接起来,我就会在一个问题中将它们一起问。)

最佳答案

将工作表变量设置为代号时,限制是您只能在 ThisWorkbook(即包含代码的工作簿)中使用代号。

考虑这段代码...

Dim ws As Worksheet
Set ws = wsData 'where wsData is the CodeName of a sheet.

现在,在您的代码中,您可以在 ws 工作表上操作或执行操作,而无需激活或选择它。实际上,在 CodeNames 的情况下,您不需要声明工作表变量,您可以使用工作表的代号直接引用该工作表,而不管当前哪个工作表处于事件状态。

像...

wsData.Cells.Clear
Set Rng = wsData.Range("A1").CurrentRegion

例如与您的另一个示例代码

Dim ws As Worksheet
Set ws = wsData 'where wsData is the CodeName of a sheet.

FirstRow = ws.Cells.Find(What:="FIRST TEXT I'M LOOKING FOR", After:= _
ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row

'Or just (without declaring the ws sheet variable where wsData is the sheet code name)
FirstRow = wsData.Cells.Find(What:="FIRST TEXT I'M LOOKING FOR", After:= _
ActiveCell, LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False).Row

关于vba - 使用工作表 CodeName 并避免 .Select 和 .Activate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44151396/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com