Excel VBA - 如何使用For Each ... Next语句

时间:2014-05-12 21:30:37

标签: excel vba excel-vba

我正在学习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提供了“类型不匹配”错误,但我已经知道我必须使用错误的组或数组。

非常感谢任何有关此类初学者问题的帮助。

1 个答案:

答案 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

最终,您使用什么方法进行迭代取决于您要完成的工作以及您正在使用的数据结构。