Excel VBA循环:下一个,虽然,做直到,每个(与示例)

为了充分利用Excel和VBA,你需要知道如何有效地使用循环。

在VBA中,循环允许您遍历一组对象/值,并逐个分析它。您还可以为每个循环执行特定的任务。

以下是在Excel中使用VBA循环的简单示例。

假设您有一个数据集,您想突出显示偶数行的所有单元格。您可以使用VBA循环遍历范围并分析每个单元格行号。如果结果是偶数,就给它一个颜色,否则就保持原样。

现在,当然,这是非常简单的循环在Excel VBA(你也可以这样做使用条件格式化).

在现实生活中,你可以用Excel中的VBA循环做更多的事情,这可以帮助你自动化任务。

以下是一些更实际的例子,其中VBA循环可能是有用的:

  • 遍历一个细胞范围并分析每个小区(用特定文本突出显示细胞)。
  • 循环遍历所有工作表并对每一个做一些事情(例如保护/不保护它)。
  • 循环通过所有开放手册(并保存每个工作簿或关闭除了活动工作簿中的所有工作簿)。
  • 循环遍历单元格中的所有字符(并从字符串中提取数字部分)。
  • 遍历数组中的所有值。
  • 循环所有图表/对象(并设置边框或更改背景颜色)。

现在在Excel VBA中最佳使用循环,您需要了解存在的不同类型和每个存在的正确语法。

在Excel VBA中使用循环 - 最终指南

在本教程中,我将展示不同类型的Excel VBA循环,并为每个循环覆盖一些示例

注意:这将是一个庞大的教程,在那里我将在一些细节中尝试覆盖每个VBA循环。我建议您为此页面添加书签以供将来参考。

如果您有兴趣了解VBA简单的方法,请查看我的在线Excel VBA培训

对于下一个循环

For Next循环允许你遍历指定次数的代码块。

例如,如果我要求您手动将整数添加到10,则会添加前两个数字,然后将第三个数字添加到结果,然后将第四个数字添加到结果,如下所示..

不是吗?

相同的逻辑用于VBA中的下一个循环。

您可以指定您希望循环运行的次数,并且还指定每次运行循环时要执行的代码。

下面是For Next循环的语法:

对于计数器=开始到结束[步骤值] [代码块来执行]下一个[计数器]

在For Next循环中,可以使用用于运行循环的Counter(或任何变量)。此计数器允许您运行此循环所需的次数。

例如,如果我想要添加前10个正整数,那么我的Counter值将从1到10。

让我们来看看一些例子来更好地了解下一个循环工作。

示例1 - 添加前10个正整数

下面是使用用于下一个循环的第一个10个正整数的代码。

然后,它将显示一个消息框,显示这些数字的总和。

Sub AddNumbers() Dim Total As Integer Dim Count As Integer Total = 0 For Count = 1 To 10 Total = Total + Count Next Count MsgBox Total End Sub

在这段代码中,Total的值在进入For Next循环之前被设置为0。

一旦进入循环,它会在每个循环后保持总值。因此,在第一个循环之后,当计数器为1时,“总”值为1,第二个循环后,它变为3(1 + 2),等等。

最后,当循环结束时,“总”变量具有前10个正整数的总和。

然后,MSGBox只是在消息框中显示结果。

示例2 - 添加前5个即使是正整数

为了总结前五个偶数整数(即,2,4,6,8和10),您需要一个类似的代码,其条件仅考虑偶数并忽略奇数。

这是一个代码,它会这样做:

Sub AddEvenNumbers() Dim Total As Integer Dim Count As Integer Total = 0 For Count = 2 To 10步骤2 Total = Total + Count Next Count MsgBox Total结束子

注意,我们从2开始计数,并使用'第2步”。

当你使用'第2步',它告诉代码在每次循环运行时将“Count”值增加2。

所以Count的值从2开始,然后随着循环的发生变成4、6、8和10。

注意:另一种方法是从1到10运行循环,并在循环中检查数字是偶数还是奇数。然而,在本例中,使用Step是一种更有效的方法,因为它不需要循环运行10次,而只需要运行5次。

Step值也可以为负。在这种情况下,Counter从一个较高的值开始,并不断按指定的Step值递减。

示例3 - 在所选单元格中输入序列号

您还可以使用for next循环来完成对象的集合(例如单元格或工作表或工作簿),

下面是一个快速的例子进入序列号在所有选定的细胞中。

子EntererSernumber()Dim RNG为范围暗淡计数器作为整数暗rowcount作为整数set rng = selection roncount = rng.rows.count for counter = 1到rowcount activeCell.offset(计数器 -  1,0).value =计数器下一个计数器结束亚

上面的代码首先计算所选行的数量,然后将此值分配给变量ROWCOUNT。然后我们从'1到RowCount'运行循环。

另请注意,由于选择可以是任何数量的行,我们已将变量RNG设置为选择(使用行“设置RNG =选择”)。现在我们可以使用“RNG”变量来参考我们代码中的选择。

示例4 - 保护活动工作簿中的所有工作表

您可以使用“下一个”循环来通过活动工作簿中的所有工作表,并保护(或unprotect)每个工作表。

下面的代码将做到这一点:

sub protectworksheets()将iant为i = 1到ActionWorkBook.Wount.Count工作表(I).Protect接下来我结束子

上面的代码使用ActiveWorkbook.Worksheets.Count来计算工作表的数量。这告诉VBA需要运行多少次循环。

在每个实例中,它指的是第i个工作簿(使用工作表(i))并保护它。

您也可以使用相同的代码来取消工作表的保护。只要换个线工作表(我)。保护工作表(i).unprotect

嵌套'为下一个'循环

您可以使用嵌套的'用于下一个'循环,以在Excel中完成更复杂的自动化。一个嵌套的'for next'循环将意味着在'next'循环中有一个'下一个'循环。

让我用一个例子来演示如何使用它。

假设我在系统中打开了5个工作簿,我想保护所有这些工作簿中的所有工作表。

下面的代码将做到这一点:

Sub Protectworksheets()将Integer Dim i作为Integer为Integer i = 1到Workbooks.Count for J = 1到工作簿(i).worksheets.count工作簿(i).worksheets(j).protect下一个j接下来,我结束子

以上是嵌套的对于下一个循环正如我们在另一个循环中使用了一个For Next循环。

' EXIT For '语句在For Next Loops

'Exit for'语句允许您完全退出“下一个”循环。

您可以在希望For Next循环在满足特定条件时结束的情况下使用它。

让我们举个例子,您可以在A列中拥有一组数字,并且您希望突出显示红色字体中的所有负数。在这种情况下,我们需要为其值分析每个单元格,然后相应地更改字体颜色。

但是为了使代码更有效率,我们可以首先检查列表中是否有负数。如果没有负数,我们可以使用Exit For语句直接从代码中出来。

下面是这样做的代码:

子hghlightnegative()暗rng为范围设置rng =范围(“a1”,范围(“a1”)。结束(xldown))计数器= rng.count for i = 1,如果worksheetfunction.min(rng)> = 0然后退出if rng(i).value <0然后rng(i).font.color = Vbred接下来我结束子

当您在Next'循环中嵌套'中使用'退出'语句时,它将超出执行它的循环,然后继续执行下一循环后的代码中的下一行。

例如,在下面的代码中,' Exit For '语句将使您退出内部循环,但外部循环将继续工作。

Sub SampleCode() For i = 1 To 10 For j = 1 To 10 Exit For Next j Next i End Sub

循环做

“执行”循环允许您检查一个条件并在满足该条件时运行循环(或为真)。

在Do While循环中有两种语法类型。

执行[虽然条件] [代码块执行]循环

执行[代码块执行]循环[While条件]

这两种情况的区别在于,在第一种情况下,在执行任何代码块之前首先检查While条件,而在第二种情况下,首先执行代码块,然后检查While条件。

这意味着,如果While条件为False,则在第二种情况下,代码仍将至少运行一次(因为“While”条件在代码执行一次后被检查)。

现在让我们看看VBA中的循环时使用的一些例子。

示例1 - 使用VBA添加前10个正整数

假设您希望在VBA中使用do添加前十个正整数。

为此,您可以使用do While循环,直到下一个数字小于或等于10。一旦数值大于1o,循环就会停止。

下面是将运行这个Do While循环的VBA代码,并在一个消息框中显示结果。

子AddFirst10PositiveIntegers()将DIMI I作为整数i = 1执行,而i <= 10结果=结果+ i = i + 1循环msgbox结果结束子

上面的循环继续工作,直到' i '的值变成11。当它变成11时,循环结束(当While条件变成False时)。

在循环中,我们使用了一个结果变量,保持最终值一旦循环完成后,一个消息框会显示“结果”变量的值。

示例2 - 输入当前月的日期

假设您要将当前月的所有日期输入工作表列。

您可以使用以下循环代码时执行此操作:

子EnterCurrentMonthdates()DIMD cmdate as Dimd i作为整数i = 0 cmdate = dateserial(年(日期),月(日期),1)在月份(cmdate)=月(日期)范围(“a1”)。偏移量(i,0)= cmdate i = i + 1 cmdate = cmdate + 1环端子子

上面的代码将在工作表的第一列中输入所有日期(从A1开始)。循环一直持续到变量' CMDate '的Month值与当前月份的Month值匹配为止。

退出循环语句

您可以使用Exit Do语句来循环。一旦代码执行“退出执行”行,它会出现在循环中的执行时,并在循环后立即将控件传递到下一行。

例如,如果要仅输入前10个日期,则可以在输入前10个日期后立即退出循环。

下面的代码可以做到这一点:

子EnterCurrentMonthdates()DIMD cmdate as Dimd i作为整数i = 0 cmdate = dateserial(年(日期),月(日期),1)在月份(cmdate)=月(日期)范围(“a1”)。偏移量(i, 0) = CMDate i = i + 1 If i >= 10 Then Exit Do CMDate = CMDate + 1 Loop End Sub

在上面的代码中,IF语句用于检查I的值是否大于10。一旦“I”变为10,就会执行退出DO语句,循环结束。

做,直到循环

'直到'循环非常像'循环的情况下。

在“执行时”,循环运行直到满足给定的条件,而在“DO之前”,它循环,直到满足指定的条件。

在Do Until循环中有两种类型的语法。

do [直到条件] [代码块执行]循环

执行[要执行的代码块]循环[直到条件]

这两种情况的区别在于,在第一种情况下,在执行任何代码块之前先检查Until条件,而在第二种情况下,先执行代码块,然后检查Until条件。

这意味着,如果Until条件为TRUE,则在第二种情况下,代码仍将至少运行一次(因为“Until”条件在代码执行一次后被检查)。

现在让我们看一些在VBA中使用Do Until循环的例子。

注意:DO的所有示例,直到与DO的相同。这些已被修改以向您展示直到循环工作的方法。

示例1 - 使用VBA添加前10个正整数

假设您要使用Do添加前十个正整数,直到VBA中的循环。

为此,您需要运行循环,直到下一个数字小于或等于10。一旦数字大于1o,您的循环将停止。

这是将运行此循环的VBA代码,并在消息框中显示结果。

子addfirst10positiveIntegers()将DIMI I作为整数i = 1直到i> 10结果=结果+ i = i = i + 1循环msgbox结果结束子

上述环路继续工作,直到“I”的值变为11.一旦变成11,循环结束(作为“直到”条件变为真)。

示例2 - 输入当前月的日期

假设您要将当前月的所有日期输入工作表列。

你可以使用下面的do Until循环代码来做到这一点:

(1) Do Until Month(CMDate) <> Month(Date) Range("A1"). (1) Do Until Month(CMDate) <> Month(Date) Range("A1"). (1)Offset(i, 0) = CMDate i = i + 1

上面的代码将在工作表的第一列中输入所有日期(从A1开始)。循环继续,直到变量cmdate月份不等于当前月份。

退出循环语句

您可以使用“退出”语句从循环中出来。

一旦代码执行“退出执行”行,它会出现在循环中直到循环,并在循环后立即将控件传递到下一行。

例如,如果要仅输入前10个日期,则可以在输入前10个日期后立即退出循环。

下面的代码可以做到这一点:

(1) Do Until Month(CMDate) <> Month(Date) Range("A1"). (1) Do Until Month(CMDate) <> Month(Date) Range("A1"). (1)Offset(i, 0) = CMDate i = i + 1 If i >= 10 Then Exit CMDate = CMDate + 1 Loop End Sub

在上面的代码中,一旦' i '的值变成10,就会执行Exit Do语句,循环结束。

为每一个

在VBA中,您可以使用“对于每个”循环来循环一组集合。

下面是一些Excel VBA集合的例子:

  • 所有开放式工作簿的集合。
  • 工作簿中所有工作表的集合。
  • 选定单元格范围内所有单元格的集合。
  • 工作簿中所有图表或形状的集合。

使用'为每个'循环,您可以通过集合中的每个对象进行,并对其执行一些操作。

例如,您可以通过工作簿中的所有工作表并保护它们,或者您可以通过选择中的所有单元格进行更改并更改格式。

使用'每个'循环(也称为'为每个下一个'循环),您不需要知道集合中有多少对象。

“对于每个'循环将自动完成每个对象并执行指定的操作。例如,如果要保护工作簿中的所有工作表,则代码是否具有包含3个工作表或30个工作表的工作簿。

以下是Excel VBA中的每个下一个循环的语法。

对于集合中的每个元素[要执行的代码块]Next [element]

现在让我们看看一些在Excel中使用每个循环的示例。

例1 -浏览工作簿中的所有工作表(并保护它)

假设您有一个工作簿,您希望保护所有工作表。

下面的每个下一个循环可以轻松完成:

Sub ProtectSheets() Dim ws As Worksheet For Each ws In ActiveWorkbook。工作表ws。保护Next ws End Sub

在上面的代码中,我们已经将' ws '变量定义为一个Worksheet对象。这告诉VBA“ws”应该被解释为代码中的工作表对象。

现在我们使用“对于每个”语句的语句,在活动工作簿中的所有工作表中完成每个“WS”(这是一个工作表对象)(由ActionWorkbook.worksheets给出)。

注意,不像其他循环,我们试图保护工作簿中的所有工作表,这里我们不需要担心工作簿中有多少工作表。

我们不需要计算这些来运行循环。For Each循环确保逐个分析所有对象。

示例2 - 通过所有开放式工作簿(并保存全部)

如果您同时使用多个工作簿,可以帮助它能够一次保存所有这些工作簿。

在VBA代码下面可以为我们执行此操作:

Sub SaveAllWorkbooks() Dim wb As Workbook For Each wb In Workbooks wb。保存下wb结束接头

请注意,在此代码中,您没有得到一个提示,要求您在特定位置保存工作簿(如果第一次保存它)。

它将其保存在默认文件夹中(它是我案例中的“文档”文件夹)。当这些文件已保存并进行更改时,此代码最适用于您,您希望快速保存所有工作簿。

遍历选区中的所有单元格(高亮显示负值)

使用“对于每个”循环,您可以通过特定范围或所选范围内的所有单元格循环。

当您想分析每个单元格并根据其执行操作时,这可能会有所帮助。

例如,下面是将通过选择中的所有单元格的代码,并将带有负值的单元格的小区颜色更改为红色。

Sub HighlightNegativeCells() Dim Cll As Range For Each Cll In Selection If Cll。值< 0 Then Cll. interior . color = vbRed结束如果下一个Cll结束Sub

(注意我已经将CLL用作单元格的短变量名称。不可建议不要使用诸如纸张或范围的对象名称作为变量名称)

在上面的代码中,For Each-Next循环遍历所选单元格的集合。IF语句用于标识单元格值是否为负数。在这种情况下,单元格的内部颜色是红色的,否则它会转到下一个单元格。

In case you don’t have a selection, and instead want VBA to select all the filled cells in a column, starting from a specific cell (just like we use Control + Shift + Down arrow key to select all filled cells), you can use the below code:

Sub HighlightNegativeCells() Dim Cll As Range Dim Rng As Range Set Rng = Range("A1", Range("A1"). end (xlDown)) For Each Cll In Rng If Cll。值< 0 Then Cll. interior . color = vbRed结束如果下一个Cll结束Sub

在上面的例子中,在那里有多少填充细胞并不重要。它将从单元A1开始,分析列中的所有连续填充的单元格。

您也不需要选择单元格A1。您可以选择任何遥置的单元格,并且当代码运行时,它仍将考虑列A中的所有单元格(从A1开始)并彩色负单元。

“退出”语句

您可以在每个下一个循环中使用'退出'语句以从循环中出来。这通常是在满足特定条件的情况下完成的。

例如,在示例3中,当我们经过一组单元时,可以更有效地检查是否存在负值。如果没有负值,我们可以简单地退出循环并保存一些VBA处理时间。

下面是做这个的VBA代码:

Sub HighlightNegativeCells() Dim Cll As Range For Each Cll In Selection If WorksheetFunction.Min(Selection) >= 0 Then Exit For If Cll。值< 0 Then Cll. interior . color = vbRed结束如果下一个Cll结束Sub

在哪里放大VBA代码

想知道VBA代码在Excel工作簿中的位置吗?

Excel有一个称为VBA编辑器的后端VBA。您需要在VB编辑器模块代码窗口中复制和粘贴代码。

以下是执行此操作的步骤:

  1. 转到Developer选项卡。IF Then Else in Excel VBA - Developer Tab in ribbon
  2. 单击Visual Basic选项。这将在后端打开VB编辑器。单击Visual Basic
  3. 在VB编辑器中的“项目资源管理器”窗格中,右键单击要在其中插入代码的工作簿的任何对象。如果您没有看到Project Explorer转到“视图”选项卡,然后单击“项目资源管理器”。
  4. 转到插入并点击模块。这将为您的工作簿插入一个模块对象。VBA循环 - 插入模块
  5. 复制并粘贴模块窗口中的代码。VBA循环 - 插入模块

您也可能喜欢以下Excel教程:

Excel电子书订阅

免费Excel书籍

获得51个Excel提示电子书来飙升您的生产力,并更快地完成工作

12关于“Excel VBA循环的想法:接下来的,虽然,才能,每次(用例子)”。

  1. 我有一个在纸上的第1栏中的球员唯一名称列表。在表2中,我有一个具有相同唯一名称的特定播放器的不同匹配的板球评分数据。在表3中,我有足球比赛的同一玩家的数据。现在我想首先找到从纸张2中的纸张1中的名称,并将该数据从纸张2和粘贴到该微粒播放器的同一行中切割。并找到并将数据从纸张3中切割并切割下一个可用单元格中的同一行中的纸张1中。对于所有玩家来说,这项任务一对一,直到细胞是空的。在某些情况下,我的表2和表3中的多行以用于相同的名称。在这种情况下,在该名称下添加一个新行并剪切所有数据。每次我都会使用新的数据更新表格2和表3,其中包含新的名称,我将在表1中添加到纸张1中,它将通过单击一个按钮更新表1中的所有数据。

    我已经尝试了很多薄,但仍然没有工作,因为我需要。任何人都可以帮助我完成这个任务.....

  2. 如果您可以在代码中编写正确对齐的示例,则会很好。

  3. 示例NºFOF“每个”不起作用,它不会改变下一张纸张,它一遍又一遍地保护表1

  4. 优秀的网站,优秀的解释比来自MS的“帮助”文件更好!

  5. 先生
    我有问题
    如何在ComboBox中显示同一个月,其日期在工作表的A列中写入?
    我希望你的积极和快速的结果
    Thanx提前

  6. 先生
    我有个问题

    如何显示同一月的组合框,其日期在列号之一中写入其中一个工作表?

  7. 你的材料很棒,经常为我节省大量时间。
    我有一个VBA问题,我希望你可以解决:我有一个单元格的范围,其中有日期的形式mm/dd/yyyy。有时有一个日期,有时有两个日期。当有两个日期时,它们用CHAR(10)分隔。
    在该范围内的许多单元格中还有其他不需要的内容。我想要一个VBA例程,将删除不需要的信息,并保留日期和CHAR(10)s。可能吗?

评论被关闭。