[英]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
循環以LR
( For 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
行(請記住i
從LR
開始,然后遞減至2)。 <>
部分是一個運算符 ,僅表示“不等於” And
部分是另一個運算符;它只是在同一條件下評估多個條件時間,因此,如果AND
運算符兩側的兩個條件均為True
,則整個語句的計算結果為true;如果其中之一或兩者均為False
,則您得到的是false。將AND
串在一起時,它們都必須是True
為True
,因此在第一次通過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
如前所述,這行可能不是必需的。 但是,這並不是一件壞事,養成在代碼中明確聲明您打算發生的事情的習慣是一種好習慣,即使它們是自動發生的,也有兩個原因:
_
End Sub
這樣就結束了過程。 好極了。
學習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.