如何使用 VBA 中的 LOOPS 简化代码

如何使用 VBA 中的 LOOPS 简化代码

我需要从一张工作表中的一列复制内容并将其粘贴到另一张工作表中(同时为每个变量制作总共 7 份副本)。有多个列,每列的变量数量不同。不幸的是,由于数据量大,我当前的代码不可行。我觉得可以通过循环来编写。

我的逻辑是,如果 Excel 可以检测到列中的文本,那么它应该复制其下方的单元格并将其粘贴到某个范围内(从而创建 7 个副本)。希望这有意义。任何帮助都将不胜感激!

这是我的代码:

Sub SimpleCopy()

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E3").copy Worksheets("Data Base").range("C114:C120")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E4").copy Worksheets("Data Base").range("C121:C127")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E5").copy Worksheets("Data Base").range("C128:C134")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E6").copy Worksheets("Data Base").range("C135:C141")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E7").copy Worksheets("Data Base").range("C142:C148")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E8").copy Worksheets("Data Base").range("C149:C155")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E9").copy Worksheets("Data Base").range("C156:C162")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E10").copy Worksheets("Data Base").range("C163:C169")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E11").copy Worksheets("Data Base").range("C170:C176")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E12").copy Worksheets("Data Base").range("C177:C183")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E13").copy Worksheets("Data Base").range("C184:C190")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E14").copy Worksheets("Data Base").range("C191:C197")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2")) = True Then
Worksheets("Investor Data").range("E15").copy Worksheets("Data Base").range("C198:C204")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("F2")) = True Then
Worksheets("Investor Data").range("F2").copy Worksheets("Data Base").range("B205")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("F2")) = True Then
Worksheets("Investor Data").range("F3").copy Worksheets("Data Base").range("C205:C211")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("F2")) = True Then
Worksheets("Investor Data").range("F4").copy Worksheets("Data Base").range("C212:C218")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("F2")) = True Then
Worksheets("Investor Data").range("F5").copy Worksheets("Data Base").range("C219:C225")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("G2")) = True Then
Worksheets("Investor Data").range("G2").copy Worksheets("Data Base").range("B226")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("G2")) = True Then
Worksheets("Investor Data").range("G3").copy Worksheets("Data Base").range("C226:C232")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("G2")) = True Then
Worksheets("Investor Data").range("G4").copy Worksheets("Data Base").range("C233:C239")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("G2")) = True Then
Worksheets("Investor Data").range("G5").copy Worksheets("Data Base").range("C240:C246")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("G2")) = True Then
Worksheets("Investor Data").range("G6").copy Worksheets("Data Base").range("C247:C253")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H2").copy Worksheets("Data Base").range("B254")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H3").copy Worksheets("Data Base").range("C254:C260")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H4").copy Worksheets("Data Base").range("C261:C267")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H5").copy Worksheets("Data Base").range("C268:C274")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H6").copy Worksheets("Data Base").range("C275:C281")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H7").copy Worksheets("Data Base").range("C282:C288")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H8").copy Worksheets("Data Base").range("C289:C295")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H9").copy Worksheets("Data Base").range("C296:C302")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H10").copy Worksheets("Data Base").range("C303:C309")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H11").copy Worksheets("Data Base").range("C310:C316")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H12").copy Worksheets("Data Base").range("C317:C323")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("H2")) = True Then
Worksheets("Investor Data").range("H13").copy Worksheets("Data Base").range("C324:C330")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("I2")) = True Then
Worksheets("Investor Data").range("I2").copy Worksheets("Data Base").range("B331")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("I2")) = True Then
Worksheets("Investor Data").range("I3").copy Worksheets("Data Base").range("C331:C337")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("I2")) = True Then
Worksheets("Investor Data").range("I4").copy Worksheets("Data Base").range("C338:C344")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("I2")) = True Then
Worksheets("Investor Data").range("I5").copy Worksheets("Data Base").range("C345:C351")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J2").copy Worksheets("Data Base").range("B352")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J3").copy Worksheets("Data Base").range("C352:C358")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J4").copy Worksheets("Data Base").range("C359:C365")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J5").copy Worksheets("Data Base").range("C366:C372")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J6").copy Worksheets("Data Base").range("C373:C379")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J7").copy Worksheets("Data Base").range("C380:C386")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("J2")) = True Then
Worksheets("Investor Data").range("J8").copy Worksheets("Data Base").range("C387:C393")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K2").copy Worksheets("Data Base").range("B394")
End If

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K3").copy Worksheets("Data Base").range("C394:C400")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K4").copy Worksheets("Data Base").range("C401:C407")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K5").copy Worksheets("Data Base").range("C408:C414")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K6").copy Worksheets("Data Base").range("C415:C421")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K7").copy Worksheets("Data Base").range("C422:C428")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K8").copy Worksheets("Data Base").range("C429:C435")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K9").copy Worksheets("Data Base").range("C436:C442")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K10").copy Worksheets("Data Base").range("C443:C449")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("K11").copy Worksheets("Data Base").range("C450:C456")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("L2")) = True Then
Worksheets("Investor Data").range("L2").copy Worksheets("Data Base").range("B457")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("L3").copy Worksheets("Data Base").range("C457:C463")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("L4").copy Worksheets("Data Base").range("C464:C470")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("L5").copy Worksheets("Data Base").range("C471:C477")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("L6").copy Worksheets("Data Base").range("C478:C484")
End If


If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("K2")) = True Then
Worksheets("Investor Data").range("L7").copy Worksheets("Data Base").range("C485:C491")
End If

End Sub

答案1

首先,欢迎。
其次,您可以轻松避免的第一件事就是if一遍又一遍地重复同样的事情。

因此,您不必检查If Application.WorksheetFunction.IsText(Worksheets("Investor Data").range("E2"))13 次,每次只做一件事,而是只检查一次,然后做完所有 13 件事。

然后,当然就是你问的部分,循环。
有很多地方可以让你了解如何以不同的方式进行循环,但只要我们有模式,我们就可以进行循环。

因此对于第一部分,E2您可以有一个像这样的循环;

If Application.WorksheetFunction.IsText(Worksheets("Investor Data").Range("E2")) = True Then
j = 114
For i = 3 To 15
    Worksheets("Investor Data").Range("E" & i).copy Worksheets("Data Base").Range("C" & j & ":C" & j + 6)
    j = j + 7
Next i
End If

这将通过 指示的 E3-E15 for loop,通过使用的变量替换行号。(附注:您不应该也复制 E2 吗?) 可能还有一些更好的方法来实现它,但这是一个简单循环的例子。

由于每列的行数不同,我们不能只是把它放到一个更大的循环中然后就完事了。

您可以做一些较小的循环,但目前我把这件事留给您自己决定。祝您好运。

编辑

一条评论谈论的是函数,这是一种多次执行同一件事但使用更少代码的方法。

Sub callCopy()

Dim startRow As Long
startRow = 114
Call copySub(startRow, "E", 15)
Call copySub(startRow, "F", 5)
Call copySub(startRow, "G", 6)
Call copySub(startRow, "H", 13)
Call copySub(startRow, "I", 5)
Call copySub(startRow, "J", 8)
Call copySub(startRow, "K", 11)
Call copySub(startRow, "L", 7)

End Sub

第一个子程序调用第二个私有子程序。这本来可以是一个函数,但当你想返回某些内容时,就会用到它们。相反,我们使用私有子程序:

Private Sub copySub(startRow As Long, iCol As String, iRows As Long)
Dim i As Long
If Application.WorksheetFunction.IsText(Worksheets("Investor Data").Range(iCol & "2")) = True Then
For i = 2 To iRows
    Worksheets("Investor Data").Range(iCol & i).copy Worksheets("Data Base").Range("C" & startRow & ":C" & startRow + 6)
    startRow = startRow + 7
Next i
End If

End Sub

第二个子程序只是我的第一个示例,但加入了更多变量。调用子程序时,这些变量将被设置在括号中。
我将数据库中 C 列的固定数字替换为变量,这样计算起来会更容易。但如果这更适合您的需求,您可以在调用时将其更改为固定数字。

相关内容