简化VBA代码

我有一个macros在同一个工作簿中读取和写入两张数据。

是否有可能清理和简化代码/陈述,以提高可读性和协助debugging工作?

即使使用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个字符!

debugging它将是不可能的,因为这是一条指令执行太多的事情 ,而且你只能在一行代码上放置一个断点…所以你不能打破和检查你正在使用的任何中间值。

分解:

 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 )你正在使用的所有variables(使用Option Explicit来确保代码不会编译,如果你用variables名打字),使用有意义的名字来表示所有的标识符当为什么从代码中不明显的时候可以使用注释)。

通过将其分解成多个更小的步骤,您不仅可以更轻松地进行读取/维护,还可以更轻松地进行debugging,因为运行时错误会在特定行的特定指令中引发,而您将能够更容易地找出故障的input。

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

声明并将variables设置为可以用作WorksheetFunction对象的替代的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 

这看起来更具可读性。 您对命名范围的使用也可能会得到改进,但在不知道每个属于哪个父级工作表的情况下很难提出build议。

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