![0d4ce2fe38f7e4586a23c03310eca2ed.gif](https://i-blog.csdnimg.cn/blog_migrate/d5c822d38817bbb3b86235aeaa731052.gif)
![1f3cac361d93f43440dc3ef33e8f855c.gif](https://i-blog.csdnimg.cn/blog_migrate/c69bf425fa1a4ae07054a34f0e4e3f16.gif)
让相同的代码重复执行多次
如果想在活动工作表前插入一张工作表,代码可以写为:
![9343f5b98cf6256bb943b24cecb91bd6.png](https://i-blog.csdnimg.cn/blog_migrate/fc8071fcbe95d85376097d69222d3771.png)
如果想将这行代码重复执行 5 次,可以在过程中编写 5 行相同的代码,如:
![fe15c0d4e9186eccc03e7a5e6d5a1663.png](https://i-blog.csdnimg.cn/blog_migrate/d27a56025dbf7871d0761ee7bba7e56b.png)
前面说过,VBA代码就像录下来歌曲,执行代码就像播放歌曲,音乐可以循环播放,过程中的VBA代码也可以设置循环执行,For…Next语句就是设置代码循环执行的一种开关。
如果想让插入工作表的代码循环执行 5 次,可以将过程写为:
![b5bb83be237f21df0694cb851f2a0404.png](https://i-blog.csdnimg.cn/blog_migrate/557651e2b52b6473f490c85e9e9b3988.png)
执行这个过程的效果如图 4-12 所示。
![d34a5f71f3d3eb36a18f53d26f14ffe7.png](https://i-blog.csdnimg.cn/blog_migrate/dd78b6a3afa96a23aba0a1e5a0acf27e.png)
For…Next 语句是怎样工作的
执行过程后能在工作簿中插入 5 张新工作表,这是因为过程中的For…Next语句让代码“Worksheets.Add”重复执行了 5 次。
![fa6255bc20a02bdfb040f5e4b412c211.png](https://i-blog.csdnimg.cn/blog_migrate/b6b55731cd2291d505cb2baa5ef99928.png)
VBA靠“For i = 1 To 5 Step 1”中的 3 个数字确定重复执行代码的次数。这行代码中的i是循环变量,数字 1、5、1 分别是循环变量的初值、终值和改变的步长值。每个For…Next语句都可以写成这样的结构:
![accf9d1e35b2af1212f34ee4fb23d375.png](https://i-blog.csdnimg.cn/blog_migrate/d512ec52fbf05dacef0bd15c1a2910ff.png)
将For…Next语句的第一行代码写为“For i = 1 To 5 Step 1”,说明在执行过程时,VBA会让循环变量i的值从 1 增加到 5,每次增加 1(增加多少,由Step后的步长值确定)。因为从 1 到 5 共有 5 个数字,所以会执行 5 次循环体部分的代码,如图 4-13 所示。
![44bd7b89c9b9021ed7acc025bab3b231.png](https://i-blog.csdnimg.cn/blog_migrate/f0894012816095100f0703f3683e9f0d.png)
如果For…Next语句的第一行是“For i = 3 To 13 Step 2”,则VBA会执行循环体部分的代码 6 次,具体的执行流程如图 4-14 所示。
![417c3344693ca8885be61eee60a72172.png](https://i-blog.csdnimg.cn/blog_migrate/4df005e2118d523449f956eb59fa120c.png)
也可以将终值设置为小于初值的数,但此时应将步长值设置为负整数,如:
![4d04ae51ef9a24b12b5be2e43fb8be1c.png](https://i-blog.csdnimg.cn/blog_migrate/3e6e2e154a7d17f1174bf16bf03baeba.png)
将代码写成这样,VBA每执行一次循环体,变量i就增加-1,直到小于终值 1 才终止执行For…Next语句。具体的执行流程如图 4-15 所示。
![85c7afcf08472761b2d556da51478105.png](https://i-blog.csdnimg.cn/blog_migrate/75cb4a7bab863efae07d72a55eb690e0.png)
使用 Exit For 语句跳出 For…Next 循环
可以在循环体中任意位置加入Exit For来终止并跳出循环,如:
![62bca3ad86dce70594ccaf5e41e86aed.png](https://i-blog.csdnimg.cn/blog_migrate/0c81ad3e694fddb039a7393331efa097.png)
无论For…Next语句设置执行循环体多少次,当执行Exit For语句后,VBA都会跳出For…Next循环,执行Next之后的代码,如图 4-16 所示。
![8bd90a2780eac45842b206caa9f40671.png](https://i-blog.csdnimg.cn/blog_migrate/f0d5af5f7725fa14d0b507d02abf06c2.png)
For…Next语句总可以写成这样的结构:
![d365148c35e79940035a216c2767ba6d.png](https://i-blog.csdnimg.cn/blog_migrate/04093f1b6e86afac878fe064b7d1797e.png)
借助循环为多个成绩评定等次
![dda0d12c4a977913b61f62a5f65557d3.png](https://i-blog.csdnimg.cn/blog_migrate/cec30dd37f8ed051e8ce7df508742d75.png)
如图 4-17 所示,如果要为B2 的成绩评定等次,可以用下面的过程:
![35a94262a1574770b261dbb84ba6d6e8.png](https://i-blog.csdnimg.cn/blog_migrate/3c2af188d68766d3633408df3512af38.png)
可是,这样的过程只能处理一条记录,如果要处理的是图 4-18 所示的数据,应该怎么办呢?
![9469445a6bbe8e605469647460f5110f.png](https://i-blog.csdnimg.cn/blog_migrate/bc887baf69836083b07457a97f7933f4.png)
![2bde5ac4a32b8edc08050c54695a6688.png](https://i-blog.csdnimg.cn/blog_migrate/57b284e9386d940a1c2ea195ff5da72d.png)
没错,思路正确。但你可能会将过程写成这样,如:
![7573cb0018d2f37f81f0b99e03f857d8.png](https://i-blog.csdnimg.cn/blog_migrate/5cc7a4c29ab157f4d7098a3ff97d0b83.png)
![4d0cb2d0534c6c1c445ebff82c712bdc.png](https://i-blog.csdnimg.cn/blog_migrate/2f3d7812ee3b9cb2133557a8f234e74e.png)
想知道评定等次的Select…Case语句有没有被执行 10 次,可以将光标定位到过程中的任意位置,连续执行【调试】→【逐语句】(或连续按键)观察过程的执行过程,如图4-20 所示。
![9741a52ee0dc6887501c0c6d22e69ded.png](https://i-blog.csdnimg.cn/blog_migrate/b8f7bf234ad45bf2ff7a7c231778ff9d.png)
很显然,评定等次的Select…Case语句虽然执行了 10 次,但这 10 次都是处理相同的单元格,所以只为一个成绩评定了等次。
为什么会这样呢?看看Select…Case语句中用来对比的成绩和写入等次的单元格,应该就明白了。
![7397686c3b966ece194711225998ccae.png](https://i-blog.csdnimg.cn/blog_migrate/87b210149266a4657d1ef9f1aaba5568.png)
要解决这个问题,不仅要让Select…Case语句重复执行 10 次,还要让每次执行时,参与计算的单元格都不是固定的单元格:执行第 1 次,操作的是B2 和C2,执行第 2 次,操作的是B3 和C3……执行第 10 次,操作的是B11 和C11。这就需要用一个变量去代替Range("B2")和Range("C2")中的数字 2,让这个变量每执行一次就在原来的基础上增加 1,如:
![ee78aa19cc6ad5c644333de712388d08.png](https://i-blog.csdnimg.cn/blog_migrate/535eca62da2ab8e2f986be26221847c8.png)
修改完成后,再次执行过程,就能得到如图 4-21
所示的结果了。
![b542557fa5c34ed11a60cc897a98e529.png](https://i-blog.csdnimg.cn/blog_migrate/4e4ac3e900564473b6930778d3036d61.png)
在这个过程中,一共使用了两个变量:循环变量i和表示行号的变量Irow,其中i用来控制重复执行Select…Case语句的次数,Irow用来控制代码要处理的单元格。也可以用同一个变量来完成这两个任务,将代码写为:
![6617b7bf7a153a4399cbbd45a4aff358.png](https://i-blog.csdnimg.cn/blog_migrate/a3ac78fc032bc3257e173590f0d43dc8.png)
提示:变量是存储数据的容器。如果变量i中存储的数据是 2,那么代码"C" & i与"C" & 2 的效果
是相同的,返回的结果都是“C2”。
推荐阅读
北京大学出版社
《别怕,Excel VBA其实很简单(第3版)》
![ac2af0f2021b061196b62d35f184a89f.png](https://i-blog.csdnimg.cn/blog_migrate/cee94522be2b28f8ed9dabd971f27a81.jpeg)
一句顶一万句的“懒人心法”,教你一键搞定所有报表! 久经读者和市场检验的超级畅销书,升级!
*注:本文部分图片来源于互联网,仅供学习、交流使用。不具有任何商业用途,若有侵权, 请联系删除。 往期阅读![080b23eeca5ccd38652fc42b5f1c9f19.png](https://i-blog.csdnimg.cn/blog_migrate/e2c4812d84c30c82341537c7175360c5.jpeg)
![27f3b5ee12162b8f354f552331e05ca8.png](https://i-blog.csdnimg.cn/blog_migrate/b2d81e6949a6bd2c379243a94782ec09.jpeg)
![2b5addc1f214ac4305eb5ed612975fc2.png](https://i-blog.csdnimg.cn/blog_migrate/bd4cfc05878f37a15f39d746625fe656.jpeg)
![aa99bb2763bf07f85c7d0dadbb8d33c2.png](https://i-blog.csdnimg.cn/blog_migrate/c7736b9e8917a69229744c8468a0a6a1.png)
![b9a6055d815439aaa980fc22aecedeed.png](https://i-blog.csdnimg.cn/blog_migrate/85abe686601a3b85300366bb784554e2.png)
![6933fc41de5c947fcf198e8fa1fe971a.png](https://i-blog.csdnimg.cn/blog_migrate/e27ffd644a87597a9015372dd5309783.png)