使用工作表CodeName和避免.Select&.Activate

在我的工作簿中,我经常需要使用他们的CodeName来激活一些工作表,然后在该工作表中search一些文本 ,并使用包含我正在查找的文本的单元格的行号或列号

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

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 

Eveything运作良好,但现在我正在努力提高我的代码,我想更快地运行我的代码。

现在,

1-如何轻松地引用我的WorkSheets的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属性工作。 通过代码名称完全引用工作表或使用VBA 的代码名称 引用另一个工作表中的工作表并没有回答我的问题。

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

再次在这个例子中,我首先search特定的文本,在我的代码的第一部分:=“FIRST TEXT I'M LOOKING FOR” ,然后我需要使用该单元格来获取它的行号或使用偏移任何东西 ,因为我觉得自己有义务使用。 激活,因为,

 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 

种类的代码不起作用。 如何避免使用在Excel中selectVBAmacros这里的答案有几个build议,但没有一个在这种情况下帮助我。 我试图从这个答案的所有者得到一个答案,以避免任何重复的问题,但他build议我问一个新的问题。 (只要我的两个问题都属于我的示例代码,我将把它们连接起来,我在一个问题中一起问了他们。)

将代码片段variables设置为代码名时,限制是只能使用ThisWorkbook中的代码名,即包含代码的工作簿。

考虑这个代码…

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

现在在您的代码中,您可以在ws表单上操作或执行操作,而无需激活或select它。 实际上,在CodeNames的情况下,您不需要声明一个表单variables,您可以直接使用它的代号来引用表单,而不pipe当前哪个表单处于活动状态。

喜欢…

 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