简化VBA代码

时间:2016-02-22 04:05:28

标签: excel vba excel-vba debugging optimization

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

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

即使在使用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)

我故意试图避免明确提及单个细胞或范围。

2 个答案:

答案 0 :(得分:3)

你的陈述是225个字符!

调试它是不可能的,因为它的一条指令执行太多的事情,你只能在一行代码上放置一个断点......所以你可以&#39 ; t中断并检查您正在使用的任何中间值。

分解:

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以确保代码在您创建时不会编译具有变量名称的拼写错误),对所有标识符使用有意义的名称(告诉读者他们&#39>的名称 - 当为什么<时使用注释/ em>从单独的代码中看不出来。

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

答案 1 :(得分:2)

使用With ... End With语句本地化任何Range.Parent属性。

声明并设置一个变量到Excel Application object,可用作WorksheetFunction object的替代。这应该使对工作表函数的重复调用更具可读性。

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

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 function)。