使用工作表CodeName和避免。选择& .Activate

时间:2017-05-24 07:12:11

标签: excel vba excel-vba select reference

在我的工作簿中,我经常需要使用 CodeName 激活某些工作表,然后在该工作表中搜索某些文本使用行或列号单元格,其中包含我正在寻找的文字。

在这种情况下,我使用的是以下类型的代码:

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 属性工作。 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在这个答案中有几个建议但在这种情况下没有一个可以帮助我。我试图从这个答案的主人那里得到答案,以避免任何重复的问题,但他建议我提出一个新的问题。 (只要我的两个问题都属于我的示例代码并且我将它们连接起来,我就会在一个问题中一起问他们。)

1 个答案:

答案 0 :(得分:3)

将工作表变量设置为代号时,限制是您只能使用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

e.g。使用您的另一个示例代码

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