我正在学习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
提供了“类型不匹配”错误,但我已经知道我必须使用错误的组或数组。
非常感谢任何有关此类初学者问题的帮助。
答案 0 :(得分:10)
首先要做的事情:
说我有一个满是“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
<强> WHY 强>
由于MyCell
未声明,因此可能是错误类型。您不能对错误和字符串进行字符串比较,因此会引发类型不匹配错误。您可以使用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
或者它们可以是索引集合的长整数
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 强>
最终,您使用什么方法进行迭代取决于您要完成的工作以及您正在使用的数据结构。