当我执行for循环以计算不同条件时,如何停止重复代码?

时间:2019-01-18 22:25:02

标签: excel vba

我有一个包含20个工作表的工作簿,名称分别为“ WorksheetNumber1”,“ WorksheetNumber2”,“ WorksheetNumber3”,“ WorksheetNumber4”,...,“ WorksheetNumber20”。

这是我的代码的片段:

Sub()
    Dim Workbook1 As Workbok
    Dim count As Long

    count = 0
    For i = 1 To 20
        Select Case IsEmpty(Workbook1.Worksheets("WorksheetNumber" & i).Cells(1,1))
            Case True
                count = count + 1
        End Select
    Next i
    MsgBox(count)

    count = 0
    For i = 1 To 20
        Select Case Application.CountA(Workbook1.Worksheets("WorksheetNumber" & i).Range("$C$3:$E$5"))>0
            Case True
                count = count + 1
        End Select
    Next i
    MsgBox(count)

End Sub

我重复了许多这样的循环,只是条件不同。因此,如您所见,每个循环的代码结构都相同,但是Select Case条件已更改。如何缩短我的长代码?

我试图创建一个使Select Case条件变量可变的函数,但是由于该条件在进入该函数之前先经过评估,因此它似乎并不起作用。

这是我所拥有的:

Function f_1(Criteria As Variant, Workbook1) As Long
    f_1 = 0
    For i = 1 To 20
        Select Case Criteria
            Case True
                f_1 = Application.Sum(f_1, 1)
        End Select
    Next i
End Function

这是尝试调用该函数的子例程:

Sub(Workbook1 As Workbook)
    Dim count As Long

    'example A
    count = f_1(IsEmpty(Workbook1.Worksheets("WorksheetNumber" & i).Cells(1,1)), Workbook1)
    MsgBox(count)

    'example B
    count = f_1(Application.CountA(Workbook1.Worksheets("WorksheetNumber" & i).Range("$C$3:$E$5"))>0, Workbook1)
    MsgBox(count)
End Sub

发生的事情是该语句

IsEmpty(Workbook1.Worksheets("WorksheetNumber" & i).Cells(1,1))

和声明

Application.CountA(Workbook1.Worksheets("WorksheetNumber" & i).Range("$C$3:$E$5"))>0

在被发送到函数中之前正在被评估,因此,根据 i 是什么,一个工作表将被评估20次(如果 i 介于1之间或20(包括20和2)(包括首尾两点)或下标超出范围(如果 i 不在1到20之间(包括1和20)之间。

我一直在寻求帮助,有人建议创建对象;我已经用谷歌搜索了一下,但是我不完全确定这将对我有什么帮助,所以如果有人可以帮助我更多地指定我的搜索字词,那也很棒!

非常感谢您!

1 个答案:

答案 0 :(得分:0)

我看到的重复是循环结构。如果不重要的是哪种条件会增加计数器变量,我会在单线条件下使用这样的代码。您可以添加任意多个条件,并使代码保持相对平坦。 顺便说一句,最好使用“显式选项”。在您的第一行中,工作簿的拼写为“ Workbok”

body {
    margin: 0;
}
#options_container {
    background-color: rgb(129, 129, 129);
    height: 60px;
    width: 100%;
    text-align: center;
    overflow: auto;
    white-space: nowrap;
    z-index: 1;
}
#option {
    height: 40px;
    width: 75px;
    line-height: 40px;
    font-size: 15px;
    color: white;
    text-align: center;
    background: rgb(22, 22, 23);
    position: relative;
    display: inline-block;
    transition: all .25s linear;
    user-select: none;
    overflow: initial;
    z-index: 2;
}
#option:before {
    height: 100%;
    top: 5.5px;
    left: -10px;
    background: red;
    transform: skewY(-45deg);
}
#option:after {
    height: 75px;
    bottom: -42.5px;
    left: 28.3px;
    background: blue;
    transform: rotate(90deg) skew(0, 45deg);
}
#option:before, #option:after {
    width: 10px;
    content: '';
    position: absolute;
    transition: all .25s linear;
    z-index: 1;
}

编辑:
与其说您使用不同的计数变量,不如将所有条件计数器捆绑在一个地方。这可以通过数组或字典来完成。

使用数组:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
</head>
<body>
    <div id="options_container">
        <div id="option">Option 1</div>
        <div id="option">Option 2</div>
        <div id="option">Option 3</div>
        <div id="option">Option 4</div>
        <div id="option">Option 5</div>
    </div>
</body>
</html>

使用字典(我更喜欢这种方法,因为在更多条件下更容易调试):

Option Explicit

Sub test()
Dim workbook1 As Workbook
Set workbook1 = ThisWorkbook
Dim i As Long, count As Long
For i = 1 To Worksheets.count
    If IsEmpty(workbook1.Worksheets("Sheet" & i).Cells(1, 1)) Then count = count + 1
    If Application.CountA(workbook1.Worksheets("Sheet" & i).Range("$C$3:$E$5")) > 0 Then count = count + 1
Next i
End Sub