简化 VBA 代码



我有一个宏,它可以从同一工作簿中的两个工作表读取和写入数据。

是否可以清理和简化代码/语句以提高可读性并帮助调试工作?

语句变得如此之长,即使使用 space-underscore 方法使用多行,阅读起来也很混乱。

变得笨拙的语句示例:

Range("mx_plan").Cells(WorksheetFunction.Match(sortedAircraft.Item(i).tailNumber, Range("aircraft")), WorksheetFunction.Match(currentWeekId, Range("week_id")) + weekly_hours_col_offset) = (acft_hoursDNE / acft_weeksRemaining)

我有意避免显式引用单个单元格或范围。

您的陈述是 225 个字符!

调试它是不可能的,因为它是一个指令做太多的事情,你只能在一行代码上放置一个断点......因此,您无法破坏和检查正在使用的任何中间值。

分解一下:

tailNumber = sortedAircraft.Item(i).tailNumber
aircraft = someSheet.Range("aircraft").Value
planRow = WorksheetFunction.Match(tailNumber, aircraft)
weekId = someSheet.Range("week_id").Value
planColumn = WorksheetFunction.Match(currentWeekId, weekId)
Set target = someSheet.Range("mx_plan").Cells(planRow, planColumn + weekly_hours_col_offset)
target.Value = acft_hoursDNE / acft_weeksRemaining

请记住声明Dim)您正在使用的所有变量(使用Option Explicit以确保如果使用变量名称输入拼写错误,代码将无法编译),对所有标识符使用有意义的名称(告诉读者它们用途的名称 - 当原因仅从代码中看不出来时,请使用注释)。

通过将其分解为多个较小的步骤,您不仅可以使其更易于阅读/维护,还可以使其更易于调试,因为运行时错误将在特定行的特定指令中引发,并且您将能够更轻松地查明错误的输入。

与 ...End With 语句以本地化任何 Range.Parent 属性。

声明并设置 Excel 应用程序对象的变量,该变量可用作工作表函数对象的替换项。这应该使对工作表函数的重复调用更具可读性。

通过提供_将等号右侧的所有内容都放到下一行(例如 chr(95))。这类似于串联字符,允许单个代码行分布在两行或更多行上。我还使用它来排列两个 MATCH 函数,这两个函数将行和列返回到 Range.Cells 属性。

Dim app As Application
Set app = Application
With Worksheets("Sheet1").Range("mx_plan")
    .Cells(app.Match(sortedAircraft.Item(i).tailNumber, Range("aircraft"), 0), _
           app.Match(currentWeekId, Range("week_id"), 0) + weekly_hours_col_offset) = _
      (acft_hoursDNE / acft_weeksRemaining)
End With
Set app = Nothing

在我看来,这看起来更具可读性。您对命名区域的使用也可以得到改进,但在不知道每个区域所属的父工作表的情况下,很难提出建议。

注意:我为每个 MATCH 函数添加了一个, 0,以强制对未排序的数据进行完全匹配。我不知道这是否是你的意图,但没有它们,飞机中的数据和week_id命名范围必须排序(参见 MATCH 函数)。

最新更新