我有一个包含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)之间。
我一直在寻求帮助,有人建议创建对象;我已经用谷歌搜索了一下,但是我不完全确定这将对我有什么帮助,所以如果有人可以帮助我更多地指定我的搜索字词,那也很棒!
非常感谢您!
答案 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