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

Dir*_*101 0 excel vba excel-vba

我正在学习VBA,我正在尝试理解For Each ... Next语句的语法.如果语法是:

For Each element In group
[statements]
[Exit For]
[statements]
Next [element]
Run Code Online (Sandbox Code Playgroud)

您可以为"元素"和"组"使用哪种变量,并定义它们吗?我问,因为我为函数找到的大多数例子都没有定义"元素".

假设我有一个满是"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
Run Code Online (Sandbox Code Playgroud)

If MyCell.Value = "a" Then虽然我已经知道我必须使用错误的组或数组,但这会给出"类型不匹配"错误.

非常感谢任何帮助这样的初学者问题.

Dav*_*ens 10

首先要做的事情:

假设我有一个满是"a","b","c","d"和"N/A"的列,我想确定每个列出现在列中的次数.

应该只使用这个CountIf功能:)

但作为一种学习练习......您的代码最有可能因为计算的工作表/单元格中的"错误"值而引发错误.

你可以解决它

If Cstr(MyCell.Value) = "a"...
Run Code Online (Sandbox Code Playgroud)

确保也为其他条件执行此操作,或者您可以执行以下操作:

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
Run Code Online (Sandbox Code Playgroud)

为什么

因为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
Run Code Online (Sandbox Code Playgroud)

这可能不是你所期待的.相反,做:

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
Run Code Online (Sandbox Code Playgroud)

或者它们可以是索引集合的长整数

Dim w as Integer
For w = 1 to ThisWorkbook.Worksheets.Count
    Debug.Print w
Next
Run Code Online (Sandbox Code Playgroud)

另外,请查看文档:

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

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