【问题标题】:How do I avoid this repetitive code?如何避免这种重复的代码?
【发布时间】:2016-06-22 17:52:59
【问题描述】:

我有一堆用于工作表的子例程,它们的开始和结束方式都完全相同。它们基本上都遍历表中的每一行并对每一行执行一些独特的操作。我不希望它们每次都运行,而是希望能够单独调用它们。

实际代码如下所示:

Sub randomSub()
    Dim finalRow As Long
    Dim i As Long

    finalRow = Sheet.Cells(Rows.count, Column).End(xlUp).row

    With Sheet2
        For i = 3 To finalRow
            ' Do some random operations here
        Next i
    End With
End Sub

将代码设置为循环遍历每一行并不难,但在 4 或 5 个不同的潜艇上重复它之后,我想有更好的方法。

所以我想我的问题是这样的:有没有一种最佳做法可以避免为我制作的每个新子程序一遍又一遍地编写这样的循环设置?

编辑:这是我正在执行的操作类型的一些示例,通常会替换 ' Do random operations here

Sub moveToFront()
    Dim stringHolder() As String

    stringHolder = Split(Sheet2.Cells(i, 11), "; ")
    If stringHolder(1) = "" Then
        .Cells(i, 11) = stringHolder(0)
    Else
        .Cells(i, 11) = stringHolder(1) & "; " & stringHolder(0)
    End If
End Sub

还有一个

Sub fillInTotals()
    If .Cells(i, 3) <> "" Then
        .Cells(i, 1) = "='EUS Graph'!$C$" & _
            Application.WorksheetFunction.Match(.Cells(i, 3), Sheet4.Range("$A:$A"), 0)
    Else
        .Cells(i, 1) = "='EUS Graph'!$C$"
    End If
End Sub

【问题讨论】:

  • 专业提示:创建一个帐户并在Code Review 的完整上下文中发布您的实际工作代码,让标题说明您的代码正在解决什么问题 i>,向审阅者解释代码在做什么以及为什么,您将获得有关代码各个方面的反馈和建议,包括提取方法和参数化过程代码的方法。

标签: vba excel


【解决方案1】:

考虑使用通用的用户定义函数并将其放置在所有宏都可以访问它的位置,ThisWorkbook 部分或标准模块:

Public Function randomSub(SheetName As String, ColumnLetter As String, _
                          OperationType As String)
    Dim wsh As Worksheet
    Dim i As Long, finalRow As Long
    Dim stringHolder() As String

    Set wsh = ThisWorkbook.Worksheets(SheetName)

    With wsh
        finalRow = wsh.Cells(wsh.Rows.Count, ColumnLetter).End(xlUp).Row
        For i = 3 To finalRow                              
             Select Case OperationType

                 Case "MoveToFront"
                    stringHolder = Split(Sheet2.Cells(i, 11), "; ")
                    If stringHolder(1) = "" Then
                        .Cells(i, 11) = stringHolder(0)
                    Else
                        .Cells(i, 11) = stringHolder(1) & "; " & stringHolder(0)
                    End If

                 Case  "fillInTotals"
                    If .Cells(i, 3) <> "" Then
                            .Cells(i, 1) = "='EUS Graph'!$C$" & _
                                     Application.WorksheetFunction.Match(.Cells(i, 3), _
                                     Sheet4.Range("$A:$A"), 0)
                    Else
                            .Cells(i, 1) = "='EUS Graph'!$C$"
                    End If

             End Select
        Next i
    End With
End Function

然后,根据需要调用函数,传递所需参数:

Call randomSub(ActiveSheet.Name, "A", "MoveToFront")

【讨论】:

  • 我将如何更改random operations?在其他工作表或工作簿上泛化使用我没有问题。事实上,我必须为我想要做的每个random operation 重新编写这段代码
  • 从结构上讲,随机操作是否执行相同的操作,例如将公式/值传递给可以传递参数的每个单元格?代码是否因分组/类别而异,您可以在一般功能中添加条件。请发布更多详细信息。
  • 我在编辑中包含了一些我正在尝试做的示例
  • 查看传递 OperationType 参数的编辑,该参数将使用Select...Case 逻辑来调节for 循环操作。你可能想在 Cases 中嵌套 for/loops。
  • 好吧,这就是我最初的计划。我只是想知道循环通过 Select...Case 逻辑是否是最有效的方法。