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

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

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

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

假设您有一个数据集,您希望突出显示均匀行的所有单元格。您可以使用VBA循环通过范围并分析每个单元行号。如果它甚至结果,你会给它一个颜色,否则你会离开它。

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

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

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

  • 遍历一个细胞范围并分析每个小区(用特定文本突出显示细胞)。
  • 循环遍历所有工作表然后对每一个都做点什么(比如保护/取消保护)。
  • 循环通过所有开放手册(并保存每个工作簿或关闭除了活动工作簿中的所有工作簿)。
  • 循环遍历单元格中的所有字符(并从字符串中提取数字部分)。
  • 循环通过所有值阵列。
  • 循环遍历所有图表/对象(并给出边框或改变背景颜色)。

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

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

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

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

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

对于下一个循环

“下一个”循环允许您通过指定次数进行代码块。

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

不是吗?

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

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

以下是Next循环的语法:

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

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

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

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

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

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

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

子AddNumbers()CMP总数为整数DIM计数作为整数总计= 0总计= 1到10总计= TOTAL + COUNT NEXT COUNT MSGBOX总端子

在这段代码中,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结束Sub

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

当你使用时'第2步',它告诉代码每次运行循环时都会将“计数”值递增2。

因此计数值从2开始,然后变为4,6,8和10,因为循环发生。

注意:另一种执行方法可以是从1到10运行循环,并在循环中检查数字是否是偶数或奇数。但是,在这种情况下,使用步骤是一种更有效的方式,因为它不需要循环运行10次,但只有5次。

步骤值也可以是负的。在诸如情况下,计数器以更高的值开始,并通过指定的步骤值保持递减。

示例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)。保护工作表(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循环。

For Next Loops中的' EXIT For '语句

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

在满足某种条件时,您可以使用它在您希望为下一个循环结束的情况下。

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

但要使代码更高效,我们可以先检查列表中是否存在负值。如果没有负值,我们可以使用EXIT for state简单地退出代码。

以下是以下代码:

子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'语句会让您退出内部循环,但外循环将继续工作。

对于i = 1到10的子SampleCode()对于j = 1到10退出下一个J接下来,我结束子

循环做

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

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

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

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

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

这意味着如果虽然条件为fals是误例,则代码仍将在第二个案例中至少运行一次(作为“虽然”在代码执行一次之后的状态)。

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

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

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

为此,您可以在循环中使用DO,直到下一个数字小于或等于10。一旦数字大于1o,您的循环将停止。

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

子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循环中有两种类型的语法。

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

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

这两个之间的差异是在第一时,在执行任何代码块之前先检查条件,并且在第二种情况下,首先执行代码块,然后检查直到条件。

这意味着如果直到条件为true是两种情况,则代码仍将在第二个案例中至少运行一次(作为“直到”在代码执行一次后检查状态)。

现在让我们看一些在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循环代码来实现:

子EnterCurrentmonthdates()Dimd cmdate映将dimd i作为整数i = 0 cmdate = dateserial(年(日期),月(日期),1)Do Do Do(cmdate)<>月(日期)范围(“A1”)。偏移量(i,0)= cmdate i = i + 1 cmdate = cmdate + 1循环结束子

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

退出循环语句

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

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

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

以下代码将执行以下操作:

子EnterCurrentmonthdates()Dimd cmdate映将dimd i作为整数i = 0 cmdate = dateserial(年(日期),月(日期),1)Do Do Do(cmdate)<>月(日期)范围(“A1”)。Offset(i, 0) = CMDate i = i + 1 If i >= 10 Then Exit Do CMDate = CMDate + 1循环结束

在上面的代码中,一旦“I”变为10,就会执行退出执行索音并循环结束。

为每一个

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

以下是Excel VBA中的一些集合示例:

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

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

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

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

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

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

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

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

示例1 - 通过工作簿中的所有工作表(并保护它)

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

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

子ProtectSheets()为ActiveWorkbook中的每个ws昏暗ws作为工作表。工作表ws。保护下一个ws结束Sub

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

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

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

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

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

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

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

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

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

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

例3 -遍历选区中的所有单元格(突出显示负值)

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

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

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

subhighlightnegativecells () Dim Cll As Range For Each Cll In Selection If Cll。Value < 0 Then Cll. interior . color = vbRed End If Next Cll End Sub . Value < 0 Then Cll. interior . color = vbRed End If Next Cll End Sub . Value < 0 Then Cll. interior . color = vbRed End

(注意我已经将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 EglightNegAtiveCells()DIM CLL AS范围DIM RNG为范围设置RNG =范围(“A1”,范围(“A1”)。rng中的每个CLL的结束(xldown))如果cll.value <0那么cll.interior.color如果下一个CLL结束子子,则VBRED结束

在上面的例子中,在那里有多少填充细胞并不重要。它将从单元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. value = 0;Value < 0 Then Cll. interior . color = vbRed End If Next Cll End Sub . Value < 0 Then Cll. interior . color = vbRed End If Next Cll End Sub . Value < 0 Then Cll. interior . color = vbRed End

在哪里放大VBA代码

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

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

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

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

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

Excel电子书订阅

免费Excel书籍

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

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

  1. 如何使用VBA = if(和(p $ 1&p280),1,1,1,“”))使用这些公式

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

    我已经尝试了很多瘦的,但仍然没有达到我需要的效果。任何人都可以帮我完成这个任务.....

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

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

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

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

  7. 先生
    我有个问题

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

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

评论被关闭。