簡體   English   中英

Excel VBA-如何使用For Each…Next語句

[英]Excel VBA - How to use the For Each…Next statement

我目前正在通過練習來學習VBA,並且正在嘗試了解For Each ... Next語句的語法。 如果語法是:

For Each element In group
[statements]
[Exit For]
[statements]
Next [element]

您可以將哪種變量用於“元素”和“組”,並定義它們? 我問,因為我為該函數找到的大多數示例都未定義“元素”。

假設我有一個充滿“ a”,“ b”,“ c”,“ d”和“ N / A”的列,我想確定每個出現在該列中的次數。

到目前為止,我有以下內容:

Sub Count()

Dim lastRow, aCount, bCount, cCount, dCount, NACount As Long

lastRow = Range("A" & Rows.Count).End(xlUp).Row
aCount = 0
bCount = 0
cCount = 0
dCount = 0
NACount = 0

For Each MyCell In Range("A1:A" & lastRow)
    If MyCell.Value = "a" Then
        aCount = aCount + 1
    ElseIf MyCell.Value = "b" Then
        bCount = bCount + 1
    ElseIf MyCell.Value = "c" Then
        cCount = cCount + 1
    ElseIf MyCell.Value = "d" Then
        dCount = dCount + 1
    ElseIf MyCell.Value = "b" Then
        bCount = bCount + 1
    Else
        NACount = NACount + 1
    End If
Next

End Sub

If MyCell.Value = "a" ThenIf MyCell.Value = "a" Then出現“類型不匹配”錯誤,盡管我已經知道我必須使用錯誤的組或數組。

非常感謝您對此類初學者問題的任何幫助。

首先要注意的是:

假設我有一個充滿“ a”,“ b”,“ c”,“ d”和“ N / A”的列,我想確定每個出現在該列中的次數。

應該只使用CountIf函數:)

但是作為一項學習練習,您的代碼最有可能引發錯誤,因為正在計算工作表/單元格中的“錯誤”值。

您可以像修復它

If Cstr(MyCell.Value) = "a"...

確保也對其他條件執行此操作,否則您可以執行以下操作:

For Each myCell In Range("A1:A" & lastRow)
Dim clVal As String
clVal = CStr(myCell)
    If clVal = "a" Then
        aCount = aCount + 1
    ElseIf clVal = "b" Then
        bCount = bCount + 1
    ElseIf clVal = "c" Then
        cCount = cCount + 1
    ElseIf clVal = "d" Then
        dCount = dCount + 1
    ElseIf clVal = "b" Then
        bCount = bCount + 1
    Else
        NACount = NACount + 1
    End If
Next

為什么

由於未聲明MyCell ,因此它可以是錯誤類型。 您無法對錯誤和字符串進行字符串比較,因此會引發Type Mismatch錯誤。 您可以使用CStr函數將MyCell.Value為字符串,這樣可以避免該錯誤。

關於聲明變量的說明...

您應該聲明所有變量並正確鍵入它們。 VBA不支持多個隱式內聯聲明,例如:

Dim lastRow, aCount, bCount, cCount, dCount, NACount As Long

這在功能上等同於:

Dim lastRow   'As Variant
Dim aCount    'As Variant
Dim bCount    'As Variant
Dim cCount    'As Variant
Dim dCount    'As Variant
Dim naCount As Long

這可能不是您所期望的。 相反,請執行以下操作:

Dim lastRow as Long, aCount as Long, bCount as Long, _ cCount as Long, dCount as Long, NACount As Long

您還應該始終聲明所有變量,包括MyCell這樣的循環迭代器。 強制執行此操作的一種方法是始終將Option Explicit放在模塊頂部。 這會強制進行變量聲明,因此,如果您在某處使用了錯誤拼寫的變量名,則會引發編譯錯誤。(這是非常常見的,實際上,因此始終使用Option Explicit !,它將為您節省很多麻煩。) 。

循環迭代器可以是Variant類型,或者它們必須與在集合/數組中可迭代的類型匹配,例如:

Dim ws as Worksheet
For each ws in ThisWorkbook.Worksheets
    Debug.Print ws.Name
Next

或者它們可以是索引集合的long / integer

Dim w as Integer
For w = 1 to ThisWorkbook.Worksheets.Count
    Debug.Print w
Next

另外,請查看文檔:

http://msdn.microsoft.com/zh-CN/library/office/gg264596(v=office.15).aspx

最終,您使用哪種迭代方法取決於您要完成的工作以及要使用的數據的結構。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM