vba - 如何将一系列 For 循环 block 缩短为一个

标签 vba excel

我在这里有一系列包含 For 循环的代码块,我想缩小此代码的大小,以便它可以以相同的方式工作,但大约与这些代码块中的一个代码块一样长,而不是让它成为 12 个 block 长度。正如您所看到的,每个 block 都是一组 6,我在这里遇到的挑战是缩短代码,同时将我的变量保持在 6 组中。在这个程序中,值在两列中生成并按顺序排列。
例如:

当 m 为 1 到 6 时,值 p 对于所有六个值都需要为 1

当 m 为 7 到 12 时,所有六个值的值 p 都需要为 2

当 m 为 13 到 18 时,所有六个值的值 p 都需要为 3

ETC....

For m = 1 To 6 'Riser
        For p = 1 To 1 'Car
            If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
                ws.Range("C1").Offset(m).Value = p
                Exit For
            End If
        Next p
    Next m

For m = 7 To 12 'Riser
    For p = 2 To 2 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 13 To 18 'Riser
    For p = 3 To 3 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 19 To 24 'Riser
    For p = 4 To 4 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 25 To 30 'Riser
    For p = 5 To 5 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 31 To 36 'Riser
    For p = 6 To 6 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 37 To 42 'Riser
    For p = 7 To 7 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 43 To 48 'Riser
    For p = 8 To 8 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 49 To 54 'Riser
    For p = 9 To 9 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 55 To 60 'Riser
    For p = 10 To 10 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 61 To 66 'Riser
    For p = 11 To 11 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

For m = 67 To 72 'Riser
    For p = 12 To 12 'Car
        If Not IsEmpty(ws.Range("Riser" & m)) And Not IsEmpty(ws.Range("Car_" & p)) Then
            ws.Range("C1").Offset(m).Value = p
            Exit For
        End If
    Next p
Next m

有没有办法增加这些值 m 和 p 以使它们增加到 78,同时为每个 block 保持这些六组?

最佳答案

可能有更聪明的方法可以做到这一点,但我会使用模函数。当您将两个数字相除时,模会返回余数,因此如果您将 m 相除乘以 6,如果 m,则余数仅为 0是 6 的倍数。在这种情况下,您只需增加我添加的变量 everySix

Dim everySix As Long
everySix = 1

Dim wasFound As Boolean

For m = 1 To 78
    If Not IsEmpty(ws.Range("Car_" & everySix)) Then

        If Not IsEmpty(ws.Range("Riser" & m)) And Not wasFound Then
            ws.Range("C1").Offset(m).Value2 = everySix
            wasFound = True
        End If

        If m Mod 6 = 0 Then
            everySix = everySix + 1
            wasFound = False
        End If

    End If
Next m

关于vba - 如何将一系列 For 循环 block 缩短为一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51822653/

相关文章:

mysql - 当我打开具有 2000 万条记录的查询时,ms Access 停止工作

vba - 具有两个单元格值条件的 Excel 工作表名称

excel - 如何使用 VBA 判断宏是否正在从电子邮件或桌面运行?

Excel 2010 - 条件格式、同一行中相邻单元格的颜色

excel - 我有 2 个工作表,需要根据该行单元格 9 中的值为整行着色

vb.net - 出现错误时,转到下一个所需的操作,而不是下一行

vba用一个替换两个引号/生成txt文件

html - 通过 Span 标签进行网页抓取

vba - Excel中的自动数据排序/分析

sql-server - 如何保护 Excel VBA 项目中的 ADO 连接?