我得到了这段代码以在 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
Run Code Online (Sandbox Code Playgroud)
让我们一行一行地浏览代码。如果我太基础了,我提前道歉;但是,其他人可能会发现这些信息很有帮助。
Sub SortNames()
Run Code Online (Sandbox Code Playgroud)
这是程序的名称
Dim LR As Long
Run Code Online (Sandbox Code Playgroud)
创建一个类型变量Long来存储行号。
究其原因Long类型正在这里使用(而不是Integer),是因为在Excel的新版本(2007年以后),也有更多的行(1,048,576)而无法放在一个Integer。因此,Long在 Excel 中获取行号/计数时应始终使用,否则当数字变大时可能会出错。
Application.ScreenUpdating = False
Run Code Online (Sandbox Code Playgroud)
这是一种很好的通用 VBA 编码技术;它可以防止在程序执行过程中屏幕闪烁,A. 提供更愉快的用户体验,B. 使代码运行速度更快。请注意,一旦 VBA 过程完成,ScreenUpdating 会自动重新打开(否则您将无法再与 Excel 交互!)。
Sheets("Stores").Select
Run Code Online (Sandbox Code Playgroud)
显然:选择名为“Stores”的工作表。由于前ScreenUpdating一行的原因,用户在该过程完成之前不会看到该工作表被选中。我不知道为什么程序的作者选择在Select这里使用;我认为使用With... End With块会更好。一般来说,如果Select可以避免使用,就应该避免。
LR = Cells(Rows.Count, 1).End(xlUp).Row
Run Code Online (Sandbox Code Playgroud)
该Cells()函数将返回一个Range引用ActiveSheet(即“商店”)的对象。Cells(Rows.Count, 1)返回第一列(即 Excel 2007 或更高版本中的单元格 A1048576)中最后一行的 Range 对象。该.End()方法从某个起始位置获取行或列中最后使用的单元格。.End(xlUp)为您提供一列中最后使用的单元格,从下方开始向上移动。所以这整个声明说:
“转到 A 列的最底部,然后向上直到找到第一个使用的单元格,然后告诉我它是什么行号并将其存储在LR.”中。
顺便说一句:如果With按照我上面的建议使用了一个块,这一行将是:
LR = .Cells(Rows.Count, 1).End(xlUp).Row
Run Code Online (Sandbox Code Playgroud)
请注意,此过程的作者似乎知道他们在做什么;找到最后使用的单元格开始,而不是从整个工作簿中的最后一个单元格开始,是一个很好的主意。否则,在剩下的过程中,Excel 会无缘无故地删除工作簿中的每个空行!除了作为电脑的电源(MEH,谁在乎,对不对?),也需要浪费很多时间才能完成。以这种方式从最后使用的行开始是加快程序的一种非常好的技术。
For i = LR To 2 Step -1
Run Code Online (Sandbox Code Playgroud)
这个For循环从LR( For i = LR)开始,执行循环体,然后从i(Step -1意思是“i每一步减去 1 ” )减去 1,然后再次循环。它这样做直到i等于 2 ( To 2)。请注意,在最后一次执行循环时,i= 2(它不会跳过2;该To语句是包含性的)。
'Here is where you can add the names
Run Code Online (Sandbox Code Playgroud)
这只是一个评论。
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
Run Code Online (Sandbox Code Playgroud)
这是一个相当大的If语句,它测试一个或多个条件,并Then在该条件为 时执行一些代码True。您可能会猜到If这里的语句在做什么,但我还是会解释一下。
该语句测试是否Range("f & i) <> "*some name*"评估为 的值True。Range("f" & i)返回具有列 F 和行的单元格地址的Range对象(记住从 开始,然后倒数到 2)。该部分是一个运算符,仅表示“不等于”。的部分是另一个运营商; 它只是同时评估多个条件。因此,如果运算符两侧的 BOTH 条件都为,则整个语句的计算结果为真。如果其中一个或两个都是,那么您会得到一个错误。当您将s串在一起时,它们都必须得到一个. 所以在第一次通过ActiveSheetiiLR<>AndANDTrueFalseANDTrueTrueFor循环,如果 row LR, column F 中的值不等于列表中的任何名称,则If语句体将执行。
进一步解释这里到底发生了什么:VBA 会自动神奇地做一些事情,以使事情变得更容易一些。其中一件事就是解释你的意图,即使它实际上没有意义。如果您考虑一下,将Range对象与像"Amanda Weaver"这样的字符串进行比较并没有什么意义。该Range对象不仅仅是它包含字符串值得多; 这是一个小列表,其中包含Range除值之外的部分内容:公式、名称、背景颜色、文本颜色、文本格式、地址、父项、行和列,以及许多其他内容。但是,VBA 假定当您说IF Range(F100) <> "Amanda Weaver"时,您希望它比较值 单元格 F100 到“Amanda Weaver”,而不是任何其他部分。
Range("f" & i).EntireRow.Delete Shift:=xlUp
Run Code Online (Sandbox Code Playgroud)
这是If块的主体。如果上面的测试条件评估为True.
该Range("f" & i)部分之前已经解释过。该部分的EntireRow.Delete意思是删除该Range对象所属的整行(请记住:如果列 F 中的值不包含列表中的任何名称,它只会删除该行)。最后一位,Shift:=xlUp告诉 Excel如何删除该行。这意味着已删除单元格下方的所有单元格都将向上移动(与已删除单元格右侧的所有单元格向左移动相反)。
End If
Run Code Online (Sandbox Code Playgroud)
呃 - 这结束了你的If街区。
Next i
Run Code Online (Sandbox Code Playgroud)
请记住,我们一直在该For循环中。从For直到这一点的所有内容都将再次执行,除了i等于 1 的值比最近的值小(直到它等于 2,包括2 )。
Application.ScreenUpdating = True
Run Code Online (Sandbox Code Playgroud)
正如我上面所解释的,这条线可能不是必需的。然而,这并不是一件坏事,养成明确说出你打算在代码中发生的事情的习惯是一种好习惯,即使它们自动神奇地发生,有两个原因:
_
End Sub
Run Code Online (Sandbox Code Playgroud)
程序到此结束。好极了。
学习 VBA 可能是一种令人沮丧的经历(对我来说一直如此),找到自己的答案通常会非常令人满意。考虑到这一点,让我提供一些建议。
我找到了一个很好的地方来了解不熟悉的 VBA 代码的含义是 MSDN;然而,实际上在 MSDN 上找到任何东西都可能是一个真正的技巧,所以我改用谷歌。一个很好的搜索技巧是:“此处为MSDN VBA不熟悉的代码”。
每当您遇到以前从未见过的函数或关键字时,请花时间查找并阅读它。我发现这是最有效的学习技巧之一。
| 归档时间: |
|
| 查看次数: |
2932 次 |
| 最近记录: |