【问题标题】:Condensing repetitive code within an "If Statement"在“If 语句”中压缩重复代码
【发布时间】:2022-01-28 06:01:20
【问题描述】:

我有以下代码,但在“if”语句的每个条件之后,代码几乎相同,除了第一行。我想知道是否有办法减少代码,使代码只运行一次。

For Each cel In AddOrRemoveRng
On Error Resume Next

If cel = "Add" And Not IsEmpty(cel.Offset(0, 1)) And Not cel.Offset(0, 3) = "0" Then
    AssetList.Cells(Asset_Row, Column_A).Value = "Add"
    AssetList.Cells(Asset_Row, Column_B).Value = cel.Offset(0, 3) 
    AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 4) 
    AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 5) 

    Asset_Row = Asset_Row + 1

ElseIf cel = "Remove" And Not cel.Offset(0, 3) = "0" Then
    TelecomAssetList.Cells(Asset_Row, Column_A).Value = "Retire"
    AssetList.Cells(Asset_Row, Column_B).Value = cel.Offset(0, 3) 
    AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 4) 
    AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 5)
    
    Asset_Row = Asset_Row + 1

ElseIf cel = "Update" Then
    TelecomAssetList.Cells(Asset_Row, Column_A).Value = "Update"
    AssetList.Cells(Asset_Row, Column_B).Value = cel.Offset(0, 3) 
    AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 4) 
    AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 5)
    
    Asset_Row = Asset_Row + 1


End If


Next cel

【问题讨论】:

  • 这会将两个不同的值写入Cells(Asset_Row, Column_C)

标签: excel vba


【解决方案1】:

缩短重复代码

  • 注意add 使用AssetList,而其他两种使用TelecomAssetList
  • 我已将AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 5).Value 替换为AssetList.Cells(Asset_Row, Column_D).Value = cel.Offset(0, 5).Value_D 而不是_C):向同一个单元格写入两次是没有意义的。
  • 您不能如此“松散”地使用On Error Resume Next 并期望代码能够正常工作。该声明通常在一两行上应用,并带有适当的“结束跟进”,
    例如On Error Goto 0
  • 通过使用 DoWrite 布尔值,您可以控制是否执行 4 个重复行。
  • 通过使用LCase 并以小写形式编写大小写,您允许小写/大写拼写错误,例如AddadDadd 被认为是相等的。
  • 通过使用CStr,除了其主要目的之外,可能的错误值不会引发错误。
Dim DoWrite As Boolean

For Each cel In AddOrRemoveRng.Cells

    Select Case LCase(CStr(cel.Value))
    Case "add"
        If Not IsEmpty(cel.Offset(0, 1)) Then
            If CStr(cel.Offset(0, 3).Value) <> "0" Then
                AssetList.Cells(Asset_Row, Column_A).Value = "Add"
                DoWrite = True
            End If
        End If
    Case "remove"
        If CStr(cel.Offset(0, 3).Value) <> "0" Then
            TelecomAssetList.Cells(Asset_Row, Column_A).Value = "Retire"
            DoWrite = True
        End If
    Case "update"
        TelecomAssetList.Cells(Asset_Row, Column_A).Value = "Update"
        DoWrite = True
    End Select
    
    If DoWrite Then
        DoWrite = False
        AssetList.Cells(Asset_Row, Column_B).Value = cel.Offset(0, 3).Value
        AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 4).Value
        AssetList.Cells(Asset_Row, Column_D).Value = cel.Offset(0, 5).Value
        Asset_Row = Asset_Row + 1
    End If

Next cel

【讨论】:

    【解决方案2】:

    我相信这应该会有所帮助:

    For Each cel In AddOrRemoveRng
    On Error Resume Next
    
    If cel = "Add" And Not IsEmpty(cel.Offset(0, 1)) And Not cel.Offset(0, 3) = "0" Then
        AssetList.Cells(Asset_Row, Column_A).Value = "Add"
    
    
    ElseIf cel = "Remove" And Not cel.Offset(0, 3) = "0" Then
        TelecomAssetList.Cells(Asset_Row, Column_A).Value = "Retire"
        
    
    ElseIf cel = "Update" Then
        TelecomAssetList.Cells(Asset_Row, Column_A).Value = "Update"
    
    
    End If
    
        AssetList.Cells(Asset_Row, Column_B).Value = cel.Offset(0, 3) 
        AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 4) 
        AssetList.Cells(Asset_Row, Column_C).Value = cel.Offset(0, 5)
    
        Asset_Row = Asset_Row + 1
    
    Next cel
    

    【讨论】:

    • 这不考虑cel不是指定值的情况
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2019-05-06
    • 1970-01-01
    • 2017-11-30
    • 2018-12-30
    相关资源
    最近更新 更多