解密Excel宏; Range.Select,然后是Range.Activate,然后是Selection.ClearContents?

时间:2018-03-09 23:39:14

标签: excel vba excel-vba

这是我在工作中制作的[非常复杂]电子表格中的代码:

Sub ClearSheet()
'
' Macro5 Macro
'
'
Range("E9,E2:F7,C14:I39,Q41:Q55,N14:N39,N41:N55").Select
Range("Q14").Activate
Range("E9,E2:F7,C14:I39,C41:I55,Q41:Q55,N14:N39,N41:N55,L41:L55").Select
Range("Q41").Activate
Selection.ClearContents

我以前从未如此瞥过一个excel宏,所以我不得不看一些东西。我得到第一个范围被选中,然后Q14成为活动单元格。然后再次进行,有一些重叠部分,Q41进入活动单元格。所有选择都被清除了。我确定这是一个简单的问题,但我不明白.Activates的重点是什么,或者为什么有人会将需要清除的部分分成两个独立的部分?从我非常有限的理解来看,我认为Activate就像聚焦一样,现在那个细胞集中在用户端易于使用。但是,如果焦点在一毫秒内从第一个细胞变为第二个细胞,那有什么用呢? 我所知道的是我需要这些细胞:

E9,E2:F7,C14:I39,N14:N39,C41:I55,L41:L55,N41:N55,Q41:Q55

清除运行此代码的时间,如果此代码除此之外还执行了某些操作,那么它是什么? 这只是写得不好还是我太无知了? 〜小说〜

2 个答案:

答案 0 :(得分:1)

使用

Range("E9,E2:F7,C14:I39,N14:N39,C41:I55,L41:L55,N41:N55,Q41:Q55").ClearContents

最好还是指定工作簿和工作表来执行此操作,例如

ThisWorkbook.Worksheets("Sheet1").Range("E9,E2:F7,C14:I39,N14:N39,C41:I55,L41:L55,N41:N55,Q41:Q55").ClearContents

以表1为例。在清除内容之前,您希望确保在正确的表格中。如果您没有指定,并且只保留范围,则使用当前的活动工作表。

在你所谈到的代码中,每个选择都将焦点从先前的选择转移到以前的选择上。

特别是使用Select通常不是一件好事,它意味着触摸'这张纸可能会产生不必要的性能开销。

如评论中所述,并由' Macro5 Macro表示,这至少部分可能是所有宏生成代码。宏观含义"很多"。在这种情况下有很多说明。宏记录器至少可以说是冗长的。它记录您正在做的所有事情,包括滚动,范围选择中的错误等。它是一个很好的学习工具,通常可以提供有用的见解一些对象和方法。宝贵的技能是学习要保留哪些元素以及如何将这些冗长的代码转换为结构化编程。

答案 1 :(得分:0)

您解释SelectActivate的方式是正确的,一个用于实际选择,另一个用于关注。

Select作为方法名称建议选择对象。此方法不仅限于范围对象,而是由Excel中的大多数对象共享。一些例子:

Range("A1").Select '/* selecting a Range Object */
Worksheets("Sheet1").Select '/* selecting a Sheet Object */
另一方面,

Activate在您选择了一个对象时起作用。

  

激活单个单元格,该单元格必须位于当前选择内。要选择一系列单元格,请使用Select方法。

那么当您激活不在当前选择中的单元格时会发生什么? 它成为选中的单元格,正如您所说的那样,Excel首先执行Select然后以mili或nano或pico秒执行Activate(上帝知道有多快)间隔。

范围对象中,SelectActivate的使用几乎可以互换。
但是你必须注意,SelectionActiveCell之间会有所不同。 1}}和Range("A1:B10").Select Range("B5").Activate Debug.Print Selection.Address Debug.Print ActiveCell.Address 。例如:

Selection

这意味着您可以在当前选择中的激活的所有单元格上实际执行内容(例如格式化,清除,添加公式,添加文本等),但仍然保留Range("A1")个对象指向的内容。

有些情况激活对象至关重要。例如,您想要选择下面的多个工作表,然后选择 Sheet3 Worksheets(Array("Sheet1", "Sheet3", "Sheet5")).Select Worksheets("Sheet3").Activate '/* vital */ Worksheets("Sheet3").Range("A1").Select

Activate

上面是多个工作表选择的正确选择命令,并在所选工作表中选择1个范围。但如果没有Range("C2")部分,它有可能会返回:

  

运行时错误' 1004':选择Range类失败的方法

因为数组中的第一张工作表将始终是select之后的激活工作表对象。现在,如何避免这种烦恼?简单,avoid using select and activate。 〜小说续集〜