繁体   English   中英

使用“ TO”和“ STEP”了解VBA代码

[英]Understanding VBA code using “TO” and “STEP”

我得到了可以在excel中运行的代码,但是我试图理解它的含义。 我特别想知道可变部分吗? 任何帮助将不胜感激。

sub SortNames

Dim LR As Long

Application.ScreenUpdating = False

Sheets("Stores").Select

LR = Cells(Rows.Count, 1).End(xlUp).Row

For i = LR To 2 Step -1

 'Here is where you can add the names

 If Range("f" & i) <> "Amanda Weaver" And Range("f" & i) <> "Debra Wiesemann" And _
   Range("f" & i) <> "Drew Simpson" And  Range("f" & i) <> "James Howard" And _
   Range("f" & i) <> "Jeff Hruby" And Range("f" & i) <> "Jessica Czupryn" And _
   Range("f" & i) <> "Kevin Janke" And Range("f" & i) <> "Matthew Hudspeath" And _
   Range("f" & i) <> "Maurey Peterson" And Range("f" & i) <> "Noah Hadro" And _
   Range("f" & i) <> "Thomas McHenry" And Range("f" & i) <> "Thomas McHenry" Then

  Range("f" & i).EntireRow.Delete Shift:=xlUp
 End If

Next i

Application.ScreenUpdating = True

End Sub

让我们逐行浏览代码。 如果我太基础了,我会提前道歉。 但是,其他人可能会发现该信息很有帮助。

Sub SortNames()

这是程序的名称

Dim LR As Long

创建一个Long类型的变量来存储行号。

之所以在这里使用Long类型(而不是Integer )是因为在较新版本的Excel(2007及更高版本)中,行(1,048,576)超出了Integer 因此,在Excel中获取行号/计数时,应始终使用Long ,否则当数字变大时可能会出错。

Application.ScreenUpdating = False

这是一种很好的通用VBA编码技术。 它可以防止屏幕在执行过程中闪烁,这A.提供了更舒适的用户体验,B。使代码运行更快。 请注意,一旦VBA程序完成,ScreenUpdating将自动重新打开(否则您将无法与Excel进行交互!)。

Sheets("Stores").Select

显然:选择名为“商店”的工作表。 由于前面有ScreenUpdating行,因此在该过程完成之前,用户将看不到此表。 我不确定过程的编写者为什么选择使用“ Select此处”。 我认为使用With... End With块会更好。 一般来说,如果可以避免使用Select ,则应该这样做。

LR = Cells(Rows.Count, 1).End(xlUp).Row

Cells()函数将返回一个引用ActiveSheet (即“商店”)的Range对象。 Cells(Rows.Count, 1)返回第一列的最后一行(在Excel 2007或更高版本中为单元格A1048576 Cells(Rows.Count, 1)的Range对象。 .End()方法从某个起始位置获取行或列中最后使用的单元格。 .End(xlUp)会为您提供从下往上的列中最后使用的单元格。 因此,整个语句都表明:

“转到A列的最底部,然后向上直到找到第一个使用的单元格,然后告诉我是什么行号并将其存储在LR 。”

附带说明:如果按照我上面的建议使用With块,则此行将是:

LR = .Cells(Rows.Count, 1).End(xlUp).Row

请注意,此过程的作者似乎知道他们在做什么。 在整个工作簿中找到最后一个使用的单元格而不是最后一个单元格是一个好主意 否则,在该过程的其余部分中,Excel将无故删除工作簿中的每个空行 除了是计算机电源的浪费(MEH,谁在乎,对不对?),这将需要更长的时间才能完成。 以这种方式从最后使用的行开始是一种非常好的方法,可以加快过程。

For i = LR To 2 Step -1

For循环以LRFor i = LR )开始,执行循环的主体,然后从i减去1( Step -1表示“每个步骤从i减去1” )并再次循环。 直到i等于2( To 2 )为止。 请注意,在循环的最后一次执行时, i = 2(不跳过 2; To语句包含在内)。

 'Here is where you can add the names

这只是一条评论。

 If Range("f" & i) <> "Amanda Weaver" And Range("f" & i) <> "Debra Wiesemann" And _
   Range("f" & i) <> "Drew Simpson" And Range("f" & i) <> "James Howard" And _
   Range("f" & i) <> "Jeff Hruby" And Range("f" & i) <> "Jessica Czupryn" And _
   Range("f" & i) <> "Kevin Janke" And Range("f" & i) <> "Matthew Hudspeath" And _
   Range("f" & i) <> "Maurey Peterson" And Range("f" & i) <> "Noah Hadro" And _
   Range("f" & i) <> "Thomas McHenry" And Range("f" & i) <> "Thomas McHenry" Then

这是一个相当大的If语句,用于测试一个或多个条件, Then在该条件为True执行一些代码。 您可能会猜测If语句在这里做什么,但是我还是会解释。

该语句测试看看Range("f & i) <> "*some name*"的值是否为True Range("f" & i)ActiveSheet返回一个Range对象,其F单元格地址为F和第i行(请记住iLR开始,然后递减至2)。 <>部分是一个运算符 ,仅表示“不等于” And部分是另一个运算符;它只是在同一条件下评估多个条件时间,因此,如果AND运算符两侧的两个条件均为True ,则整个语句的计算结果为true;如果其中之一或两者均为False ,则您得到的是false。将AND串在一起时,它们都必须是TrueTrue ,因此在第一次通过For循环时,如果LR行,F列中的值不等于列表中的任何名称,则将执行If语句的主体。

关于这里到底发生了什么的进一步解释:VBA自动神奇地做一些事情,以使事情变得容易一些。 这些事情之一就是解释您的意图,即使这实际上没有意义。 如果您考虑一下,则将Range对象与类似“ Amanda Weaver”之类的字符串进行比较并没有任何意义。 Range对象不仅包含它所包含的字符串值,还包含更多内容。 这是Range值以外的一部分内容的一小部分内容:公式,名称,背景色,文本颜色,文本格式,地址,父项,行和列,以及许多其他内容。 然而,VBA假设当你说IF Range(F100) <> "Amanda Weaver" ,要它来比较细胞F100为“阿曼达织女”的价值 ,而不是任何其他部分。

  Range("f" & i).EntireRow.Delete Shift:=xlUp

这是If块的主体。 如果您的上述测试条件评估为True ,则此处将发生任何事情。

前面已经解释了Range("f" & i)部分。 EntireRow.Delete部分意味着删除该Range对象所属的整行(请记住:仅 F列中的值不包含列表中的任何名称时,才删除该行)。 最后一位Shift:=xlUp告诉Excel 如何删除行。 这意味着删除的单元格下面的所有单元格都将上移(与删除的单元格右边的所有单元格相反)。

 End If

h-这将结束您的If封锁。

Next i

请记住,我们一直都在For循环中。 For到现在为止的所有内容都将再次执行,除非i等于小于最新值的值1(直到等于2, 包括 2为止)。

Application.ScreenUpdating = True

如前所述,这行可能不是必需的。 但是,这并不是一件坏事,养成在代码中明确声明您打算发生的事情的习惯是一种好习惯,即使它们是自动发生的,也有两个原因:

  1. 稍后,当您返回查看代码时,您将忘记您的意思。 说真的,你完全是。 不要争论
  2. 当其他人要使用您的代码时,您不能假设他们知道您所知道的一切。 因此,尽可能清楚地表明您打算发生什么。

_

End Sub

这样就结束了过程。 好极了。

如何学习VBA

学习VBA可能是令人沮丧的经历(对我来说一直如此),找到自己的答案通常会非常令人满意。 考虑到这一点,让我提供一些建议。

我找到了一个获取有关不熟悉的VBA代码含义的信息的好地方,即MSDN; 但是,实际上在MSDN上找到任何东西都是一个真正的技巧,所以我改用Google。 一种很好的搜索技术是:“ MSDN VBA 此处不熟悉的代码 ”。

这是MSDN页面,描述了For To Next循环结构。

每当您遇到以前从未见过的函数或关键字时,都花时间查找并阅读有关内容。 我发现这是最有效的学习技巧之一。

循环从底部开始(LR是最后一行),然后上升到第2行,每次将行号加-1。 这就是您想要的,因为如果您从第2行开始,每次向下移1行,那么当您删除某行时,所有其余行都将上移并将行号加1将跳过一行。 跳过一行不是您想要的,因此您应该从底部开始。

从底部开始向上移动: For i = LR To 2 Step -1

假设有两行数据(2和3),而4为空。 由于LR为3,所以我们从i = 3开始。如果删除第3行,则第4行变为第3行,但我们不在乎,因为我们将i更改为2并继续。

从顶部开始向下移动: For i = 2 To LR Step 1

假设有两行数据(2和3),而4为空。 因此LR为3。我们从i = 2开始。如果删除第2行,则第3行成为第2行,第4行成为第3行。因此,我们将i更改为3,这是一个空行,我们再也没有机会检查当前行2。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM