Excel VBA – 如何使用For Each … Next语句
我目前正在学习VBA,并试图理解For Each … Next语句的语法。 如果语法是:
For Each element In group [statements] [Exit For] [statements] Next [element]
你可以使用什么样的variables来“元素”和“组”,你是否定义了它们? 我问,因为我发现的function的大多数例子没有定义“元素”。
假设我有一列填满了“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
,这将给出“types不匹配”错误。 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
未声明,因此可能是错误types。 你不能做一个错误和一个string的string比较,所以这是提高types不匹配错误。 您可以使用CStr
函数将MyCell.Value
为string,并可以避免该错误。
关于声明variables的说明…
你应该声明所有的variables并且适当地input它们。 VBA不支持多个隐式内联声明,如:
Dim lastRow, aCount, bCount, cCount, dCount, NACount As Long
这在function上相当于:
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
你也应该声明所有的variables,包括你的循环迭代器,比如MyCell
。 一种强制执行的方法是始终将Option Explicit
放在模块的顶部。 这强制variables声明,因此,如果你在某个地方拼写错误的variables名等,会引发一个编译错误(这实际上是非常常见的,所以总是使用Option Explicit!,这会节省你很多的头发) 。
循环迭代器可以是Variant
types,或者它们必须匹配一个在集合/数组中可迭代的types,例如:
Dim ws as Worksheet For each ws in ThisWorkbook.Worksheets Debug.Print ws.Name Next
或者它们可以是索引集合的长/整数
Dim w as Integer For w = 1 to ThisWorkbook.Worksheets.Count Debug.Print w Next
另外,请查看文档:
http://msdn.microsoft.com/en-us/library/office/gg264596(v=office.15).aspx
最终你用什么方法来迭代取决于你想要完成什么以及你正在使用的数据的结构。