VBA基础六:遍历、循环的实例DO....WHILE/UNTILL/LOOP

Do While...Loop 语句是条件为True时循环

Do until...Loop 语句是直到条件变成True时才停止循环

如果事先知道循环次数,应该使用For循环,据说它比Do循环速度快

不知道起点和终点,需要在循环内计算结果出来以后才能判断是否该终止循环的,用Do Loop循环。反之,如果很明确需要循环计算的次数,则用For……Next……计量循环。

For 循环有两种:
1. For Each a In C

遍历集合C中所有a元素。当然毫无疑问也可以使用If Then Exit For随时提前退出。
好处是不用设置循环计数变量。因此在很多确实需要遍历全部元素的情况下,是效率最高的循环遍历方式。

2. For i = a To b [Step c]
Next

和For Each 循环相比,因为有了计数器、计数变量i的使用,可以非常灵活和实用。实用之处在于: 【计数变量本身可以用来参与计算】这个在数组循环中尤其重要。
[Step c] 为缺省参数,正常默认设置为 Step 1 即按步长=1进行正向递增循环。

如 For i = 1 To 100
相当于 For i = 1 To 100 Step 1
即从1 循环直到 100为止,共计循环 100-1+1=100次。

而c可以设置为任意正负数(不可设置=0……将陷入死循环。)
注意,如果设置c为负数,即进行逆向负循环时,则要求 a >= b 否则如果a < b则无法启动循环。

例:把>=90分的人打上勾。

Private Sub CommandButton1_Click()
Dim rs%
rs = 1
Do
rs = rs + 1
If rs > 10 Then
Exit Sub
Else
If Cells(rs, 2) >= 90 Then Cells(rs, 3) = '√'
End If
Loop
End Sub

缺点:不能清理。如把51分改为510分,打勾后再改回到51分,再点筛选键,不能清除这个51分的勾。

Range('B7:AG26').Select
  Selection.ClearContents
  Range('D28:AG29').Select
  Selection.ClearContents

指定块清除

从右取字符串截取的笨办法

从左第n个字符:=MID(A1,n,1)
从右第n个字符:=LEFT(RIGHT(A1,n))

=LEFT(RIGHT(A2,2),1)  '从A2行第2列开始,右边数第二个汉字或字母/数字长度为1个字。

如果(A2,2)的内容是“张平之子”,右数第二个字为之,长度为1,结果是“子”。长度为2结果是“之子”

'在不清楚总字符的前提下,只说从右边第几个字符开始提取N个字符,这就不好直接用MID函数指定位置,可以变通用:
(假设对单元格A1从右边第M个字符开始提取N个字符)
=MID(A1,LEN(A1)-(M+N-2),N)'

Private Sub CommandButton1_Click()
Dim rs As Integer
rs = 2
Do While Cells(rs, 1) <> '' '当单元格不等于空时,则循环
If Cells(rs, 1) <> '' Then Cells(rs, 3) = Mid(Cells(rs, 1), 2, 1) '如果第1列长度为4,在该行第3列中取,从第2字取长度为1字符。
rs = rs + 1
Loop '循环
End Sub

一直循环到没有内容为止

Private Sub CommandButton1_Click()
Dim rs As Integer
rs = 2
Do Until Cells(rs, 2) = '' '直到单元格为空为止,才结束
If Cells(rs, 2) >= 90 Then Cells(rs, 3) = '√'
rs = rs + 1
Loop '循环
End Sub

'实例-隔行填色

Sub 隔行填色()
Dim rs As Integer
rs = 2
Do Until Sheet2.Range('a' & rs) = ''
Sheet2.Range('a' & rs & ':g' & rs).Interior.ColorIndex = 7
rs = rs + 2
Loop
End Sub

输入密码验证,3次不正确退出,正确为123

Private Sub CommandButton1_Click()
Dim pss$, i!
Do
i = i + 1
If i > 3 Then Exit Do
pss = InputBox('请输入密码')
Loop While pss <> '123'
End Sub

'FOR...NEXT也是循环语句,与之前的DO...LOOP不同之处在于,for next有一个内置计数器

Sub for next循环2()
Dim i!, j!
For i = 100 To 1 Step -2
j = j + i
Next
MsgBox j
End Sub

Sub fornext循环()
Dim rng!
For rng = 2 To 16
Sheet1.Cells(rng, 4) = Sheet1.Cells(rng, 2) * Sheet1.Cells(rng, 3)
Next
End Sub

有表格,字段为商品,单价,数量,自动填写总金额公式

Private Sub CommandButton1_Click()
Dim rng!
For rng = 2 To 16 '第2到16行,第一行为标题,共有16行
Sheet1.Cells(rng, 4) = Sheet1.Cells(rng, 2) * Sheet1.Cells(rng, 3) '在第4列写出第2列和第3行相乘的结果
Next '从第2行开始,顺序朝下,直到第16行为止
End Sub

Sub 九九乘法表制作()
Dim a!, b!
For a = 1 To 9
For b = 1 To 9
If b > a Then
Sheet2.Cells(a, b) = ''
Else
Sheet2.Cells(a, b) = a & '×' & b & '=' & a * b
End If
Next
Next
End Sub

'exit是退出当前语句
'1.Exit Do
'2.Exit For
'3.Exit Function
'4.Exit Sub
Sub exitfor退出()
Dim i!
For i = 2 To 7
If Sheet1.Cells(i, 1) = '田七' Then
Exit For
End If
Next i
MsgBox '第一个(田七)的位置在' & i & '行'
End Sub

'end结束一个过程或块。
'End
'End Function
'End If
'End Select
'End Sub
Sub aa()
i = 1
End
Exit Sub
j = 1
End Sub

Sub onerrorresume()
Dim i!
On Error Resume Next '当错误的时候继续执行下去
For i = 2 To 8
Cells(i, 4) = Cells(i, 3) + Cells(i, 2)
Next i
End Sub

'On Error GoTo当错误的时候去哪儿?
Sub onerrorgoto()
On Error GoTo 100
For i = 2 To 8
k = Sheet1.Cells(i, 2) + Sheet1.Cells(i, 3)
Next i
100:
MsgBox '对不起,错误发生在第' & i & '行'

End Sub

循环对每行进行分割填写

Private Sub CommandButton1_Click()

Dim i%, j% '定义循环参数
Dim br '定义系列
i = 6 '从第6行开始
Do While Cells(i, 3) <> '' '非空执行:从第6行第3列开始
br = Split(Cells(i, 3), ' ') '从第6行第3行开始,把单元格内容进行拆分
If IsArray(br) Then Cells(i, 4).Resize(, UBound(br) + 1) = br '如果能分成数组,则从第6行4列开始,搂数组+1进行调整得出新数组值
i = i + 1
Loop
End Sub

array('A','B','C','D','E')
UBound(array)返回的是4,因为默认下标是从0开始的。相当于A(0 to 4)。

UBound语法如下:
返回一个 Long 型数据,其值为指定的数组维可用的最大下标。

UBound(arrayname[, dimension])
arrayname
必需的。
数组变量的名称,遵循标准变量命名约定。
dimension
可选的;Variant (Long)。指定返回哪一维的上界。1 表示第一维,2
表示第二维,如此等等。如果省略 dimension,就认为是 1。

对具有下述维数的数组而言,UBound 的返回值见下表:

Dim A(1 To 100, 0 To 3, -3 To 4)

UBound(A, 1) = 100

UBound(A, 2) = 3

UBound(A, 3) = 4
如果没指明下标,下标默认为0。定义一年365天的开支参数,用数组表示如下:
Dim curExpense(364) As Currency
0占一个元素位置+364个元素。

UBound的是数组的上界。
比如一组数组arr(1 to 10),那么ubound(arr)=10
二维数组arr(1 to 10,1 to 100),
ubound(arr,1)=10
表示第一维的上界是10
ubound(arr,2)=100表示第二维的上界是100

数组测试

Private Sub Constant_demo_Click()

Dim a,b as Variant

a = array('Red','Blue','Yellow')

b = '12345'

msgbox('数组类型测试结果组 1 : ' & IsArray(a))

msgbox('数组类型测试结果组 2 : ' & IsArray(b))

End Sub

当执行上面的函数时,它会产生下面的输出。

数组类型测试结果组 1 : True
数组类型测试结果组 2 : False

(0)

相关推荐

  • 循环中使用分支,决定谁来搬桌子

    根据以往的教程,我们学过了一些基础的语法,现在终于可以干点事情了. 今天的教程使用循环里套分支,实现简单的效果. 如下表格,在B列中进行判断,如果A列的值为"男",B列显示&quo ...

  • 【META】标准第六周——循环夺冠!纳雅松鼠兴起!

    结束完标准环境第五周的 MPL/MRL 职业联赛,第六周周末的标准构筑赛事数量突然增多.先从最热闹的 SCG 系列赛开始讲 SCG 系列赛是由 8场预选赛+周日的1场冠军资格赛 构成,在周五至周日的任 ...

  • 7个基础指令4个编程实例,带你学好PLC!

    在PLC学习的过程中,逻辑指令是PLC编程中一个非常重要的环节,其中基础指令是PLC可以识别的语言,在使用PLC之前,我们需要针对现场工况的需求对PLC进行编程,之后PLC才能按照事先写入的程序进行自 ...

  • VBA基础五:单元格cell操作例子

    例一.用cells(行,列)定位 Private Sub CommandButton1_Click() Cells(12, 6) = IIf(Cells(1, 2) > 80, '优秀', '不 ...

  • VBA基础一:对象、属性、方法、变量

    '1.工作簿(Workbooks) ' Workbooks(N)第N个工作簿 ' Workbooks ('工作簿名') ' ActiveWorkbook 活动工作簿 ' ThisWorkBook '代 ...

  • VBA基础七:字典

    常用关键字英汉对照: Dictionary                字典 Key                        关键字 Item                        项 ...

  • 【VBA基础】变量的类型和申明变量类型的重要性

    各位朋友,你们好,今天和你们聊点VBA基础知识:VBA变量. 注: 此文字数约3500字,主要是讲解VBA变量知识,通过一些动图展示变量上的效果: 如果你是初学者,建议先收藏此文,看看最后给初学者的建 ...

  • VBA基础知识整理

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/chenlvzhou/article/d ...

  • VBA基础知识整理(正则表达式)

    '一 正则表达式 '正则表达式是处理字符串的外部工具,它可以根据设置的字符串对比规则,进行字符串的对比.替换等操作. '正则表达式的作用: '1.完成复杂的字符串判断 '2.在字符串判断时,可以最大限 ...

  • VBA 基础

    一.VBA介绍 1.宏和VBA的关系 vba是编程语言,宏是用vba代码保存下来的程序.录制的宏是vba里最简单的程序,正因为如此,录制宏存在许多缺陷:如无法进行判断和循环,不能显示用户窗体,不能进行 ...