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
最终,您使用什么方法进行迭代取决于您要完成的任务以及您正在使用的数据结构.
| 归档时间: |
|
| 查看次数: |
7294 次 |
| 最近记录: |