我有一个宏,可以在同一个工作簿中读取和写入两张表中的数据。
是否可以清理和简化代码/语句以提高可读性并帮助调试工作?
即使在使用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)
我故意试图避免明确提及单个细胞或范围。
答案 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)。