Excel VBA之For Each遍历循环的应用

【分享成果,随喜正能量】事,不困于心,烦扰,方不乱心。众生,是众缘和合而生。众生万物,皆是平等,我们能做的,唯有敬畏、珍惜、善待,呵护好这世间的美好。。

《VBA之Excel应用》(10178983)是非常经典的,是我推出的第七套教程,定位于初级,目前是第一版修订。这套教程从简单的录制宏开始讲解,一直到窗体的搭建,内容丰富,实例众多。大家可以非常容易的掌握相关的知识,这套教程共三册,十七章,都是我们在利用EXCEL工作过程中需要掌握的知识点,希望大家能掌握利用。今日讲解的内容是“VBA之EXCEL应用”的第三章内容: Excel VBA之For Each遍历循环的应用

大家好,我们在这讲中将讲解遍历循环语句,这种语句在VBA代码中利用的十分普遍,也是我们在VBA代码中经常利用的三种循环语句之一:For Each循环。下面我们将看到Excel vba中的一个程序,它遍历循环所有打开的工作簿和工作表,并显示所有的名称。

语法:

For Each element In group[ statements ][ Exit For ][ statements ]Next [ element ]

参数:

1)element 必需。用于循环访问集合或数组的变量。对于集合,element只能为Variant变量、通用对象变量或任何特定的对象变量。对于数组,element仅可是Variant变量。

2)group 必需。对象集合或数组(用户定义类型除外)的名称。

3)statements 可选。在每个项目上执行的一个或多个语句。

注意点:

  • 如果group中有至少一个元素,则进入“For Each”循环。在进入循环后, 循环中的所有语句都将对group中的每一个元素执行。如果group中有多个元素,则继续为每个元素执行循环中的语句。group中不再有元素时,退出循环并继续执行“Next”语句后的语句。
  • 可以将任意数量的Exit For语句作为另一种退出方式放置在循环中的任何位置。\”退出\” 通常在评估某些条件后使用, 例如,if…then…, 将执行下一个紧接着的语句。
  • 可通过将“For Each…Next”循环放置在另一个该循环内来嵌套“For…Each…Next”循环。 但是,每个循环element必须是唯一的。
  • 如果忽略Next [ element ] 语句中的[ element ],循环一样继续执行。不可随用户定义类型的数组一起使用“For Each…Next”语句,因为“Variant”不可包含用户定义类型。

下面代码中,我们将利用“For Each…Next”语句遍历所有打开的工作薄和每个工作薄的工作表的名称。

Sub mynzH() \’遍历循环

Dim book As Workbook, sheet As Worksheet, text As String

For Each book In Workbooks

text = text & \”Workbook: \” & book.Name & vbNewLine & \”Worksheets: \” & vbNewLine

For Each sheet In book.Worksheets

text = text & sheet.Name & vbNewLine

Next

text = text & vbNewLine

Next

MsgBox text

End Sub

代码截图:

代码讲解:

1) Dim book As Workbook, sheet As Worksheet, text As String 这句是对变量的声明,声明book、sheet、text分别为Workbook、Workbook、String。

2) For Each sheet In book.Worksheets

text = text & sheet.Name & vbNewLine

Next

以上是内层循环,将提取每个工作表的名称。

3) For Each book In Workbooks

text = text & \”Workbook: \” & book.Name & vbNewLine & \”Worksheets: \” & vbNewLine

。。。。。

text = text & vbNewLine

Next

以上是外层循环讲提取每个工作薄的名称。

4) MsgBox text

将弹出一个对话框,告诉用户提取的内容。

  • 注意:可以使用&运算符连接(联接)元素。若要开始新行,可以使用vbNewLine。

我们先添加一个空白的工作薄,然后运行上述代码:

我们看到,最后弹出的对话框中包括每个打开的工作薄名称及每个工作薄中工作表的名称。

今日内容回向:

1) 什么是遍历语句?

2) 遍历语句的语法是什么样的?

3) 如何应用遍历语句?

本讲内容参考程序文件:工作簿03.xlsm

我20多年的VBA成果全在下面的资料中:

【分享成果,随喜正能量】带着感激和欣赏得眼光,看待周遭得一切,你会惊异于,生活处处都是美好。你是怎样的人,自己懂就好。过怎样的日子,你自己享受或者承担就好。。

js的15种循环遍历,你掌握了几种

While语句包括一个循环条件和一段代码块,只要条件为真,就不断循环执行代码块。while (条件) 语句;

do…while循环与while循环类似,唯一的区别就是先运行一次循环体,然后判断循环条件。do 语句 while (条件);

for(var i=0;i<filterarray.length;i++){alert(filterarray[i]);}

注意:fo…in循环一般用于对象的遍历,但是这里有一个坑需要注意: 任何对象都继承了Object对象,或者其它对象,继承的类的属性是默认不可遍历的,for… in循环遍历的时候会跳过,但是这个属性是可以更改为可以遍历的,那么就会造成遍历到不属于自身的属性。 举例来说,对象都继承了toString属性,但是for…in循环不会遍历到这个属性。

如果继承的属性是可遍历的,那么就会被for…in循环遍历到。但如果只想遍历自身的属性,使用for…in的时候,应该结合使用hasOwnProperty方法,在循环内部判断一下,某个属性是否为对象自身的属性。否则就可以产生遍历失真的情况。

此外,for循环遍历json对象有点奇葩:

无规律json数组:

为什么要 l=json.length;i<l呢?小伙伴们自己思考下吧!哈哈哈哈……

有规律json数组:

map方法将数组的所有成员依次传入参数函数,然后把每一次的执行结果组成一个新数组返回。注意:是返回一个新数组,而不会改变原数组。

map方法接受一个函数作为参数。该函数调用时,map方法向它传入三个参数:当前成员、当前位置和数组本身。

此外,map()循环还可以接受第二个参数,用来绑定回调函数内部的this变量,将回调函数内部的this对象,指向第二个参数,间接操作这个参数(一般是数组)。

上面代码通过map方法的第二个参数,将回调函数内部的this对象,指向arr数组。间接操作了数组arr; forEach同样具有这个功能。

forEach方法与map方法很相似,也是对数组的所有成员依次执行参数函数。但是,forEach方法不返回值,只用来操作数据。也就是说,如果数组遍历的目的是为了得到返回值,那么使用map方法,否则使用forEach方法。forEach的用法与map方法一致,参数是一个函数,该函数同样接受三个参数:当前值、当前位置、整个数组。

此外,forEach循环和map循环一样也可以用绑定回调函数内部的this变量,间接操作其它变量(参考上面的map()循环例子)。

filter方法用于过滤数组成员,满足条件的成员组成一个新数组返回。它的参数是一个函数,所有数组成员依次执行该函数,返回结果为true的成员组成一个新数组返回。该方法不会改变原数组。

// 上面代码将大于3的数组成员,作为一个新数组返回。

filter方法的参数函数也可以接受三个参数:当前成员,当前位置和整个数 组。

此外,filter方法也可以接受第二个参数,用来绑定参数函数内部的this变量。

上面代码中,过滤器myFilter内部有this变量,它可以被filter方法的第二个参数obj绑定,返回大于3的成员。

这两个方法类似“断言”(assert),返回一个布尔值,表示判断数组成员是否符合某种条件。

它们接受一个函数作为参数,所有数组成员依次执行该函数。该函数接受三个参数:当前成员、当前位置和整个数组,然后返回一个布尔值。

some方法是只要一个成员的返回值是true,则整个some方法的返回值就是true,否则返回false。

而every方法则相反,所有成员的返回值都是true,整个every方法才返回true,否则返回false。两相比较,some()只要有一个是true,便返回true;而every()只要有一个是false,便返回false.

这两个方法在实际开发中,大有可用之处。比如在判定用户是否勾选了不可操作的数据,或者是否勾选了一条可以操作的数据可以使用这两个方法遍历循环数组。

reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是,reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员),其他完全一样。

reduce方法和reduceRight方法的第一个参数都是一个函数。该函数接受以下四个参数。

累积变量,默认为数组的第一个成员当前变量,默认为数组的第二个成员当前位置(从0开始)原数组 这四个参数之中,只有前两个是必须的,后两个则是可选的。

如果要对累积变量指定初值,可以把它放在reduce方法和reduceRight方法的第二个参数。

上面的第二个参数相当于设定了默认值,处理空数组时尤其有用,可避免一些空指针异常。

由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。比如,找出字符长度最长的数组成员。

上面代码中,reduce的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。

Object.keys方法的参数是一个对象,返回一个数组。该数组的成员都是该对象自身的(而不是继承的)所有属性名,且只返回可枚举的属性。

Object.getOwnPropertyNames方法与Object.keys类似,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但它能返回不可枚举的属性。

上面代码中,数组的length属性是不可枚举的属性,所以只出现在Object.getOwnPropertyNames方法的返回结果中。

由于 JavaScript 没有提供计算对象属性个数的方法,所以可以用这两个方法代替。

1.foreach,map,filter循环中途是无法停止的,总是会将所有成员遍历完。

2.他们都可以接受第二个参数,用来绑定回调函数内部的this变量,将回调函数内部的this对象,指向第二个参数,间接操作这个参数(一般是数组)。

forEach循环没有返回值;map,filter循环有返回值。

上面代码中,map方法不会跳过undefined和null,但是会跳过空位。forEach方法也会跳过数组的空位,这里就不举例了。

some()只要有一个是true,便返回true;而every()只要有一个是false,便返回false.

reduce是从左到右处理(从第一个成员到最后一个成员),reduceRight则是从右到左(从最后一个成员到第一个成员)。

他们都是遍历对象的属性,也是接受一个对象作为参数,返回一个数组,包含了该对象自身的所有属性名。但Object.keys不能返回不可枚举的属性;Object.getOwnPropertyNames能返回不可枚举的属性。

grep()循环能够遍历数组,并筛选符合条件的元素,组成新的数组,并返回。

inArray()循环能返回参数在数组中对应的坐标。

map循环常用语往数组中添加新元素,第二种写法:

map() 把每个元素通过函数传递到当前匹配集合中,生成包含返回值的新的 jQuery 对象。此用法与原生js的map循环用法一致。

哈哈哈哈,亲爱的同学们,是不是感觉好多啊,其实不要特意去记忆啊,个人建议吧原生for循环,forEach循环,还有Juery的each熟悉就可以啦!如果你再开发者发现这几个循环不好用的话,那就来我这里找找看,这15种循环中,绝对有你有需要的。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。