![](/img/trans.png)
[英]Excel VBA: How to use changing cell values in For Each statement?
[英]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" Then
, If 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.