简化VBA代码

简化VBA代码,vba,excel,debugging,optimization,Vba,Excel,Debugging,Optimization,我有一个宏,可以读取和写入同一工作簿中两张工作表的数据 是否可以清理和简化代码/语句以提高可读性并帮助调试工作? 这些语句太长了,即使使用空格下划线方法使用多行语句,也会让人难以阅读 变得笨拙的语句示例: Range("mx_plan").Cells(WorksheetFunction.Match(sortedAircraft.Item(i).tailNumber, Range("aircraft")), WorksheetFunction.Match(currentWeekId, Range(

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

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

这些语句太长了,即使使用
空格下划线
方法使用多行语句,也会让人难以阅读

变得笨拙的语句示例:

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)
我故意避免对单个单元格或区域进行显式引用。

使用语句对任何属性进行本地化

声明并将变量设置为,该变量可以用作的替换。这将使对工作表函数的重复调用更具可读性

通过提供一个
(例如,chr(95))将所有内容置于等号的右侧,向下移动到下一行。这就像一个串联字符,允许单个代码行分布在两行或多行上。我还使用它来排列两个函数,这两个函数将行和列返回到

在我看来,这显然更具可读性。您对命名范围的使用也可能会有所改进,但如果不知道每个命名范围所属的父工作表,则很难提出建议


注意:我在每个匹配函数中添加了一个
,0
,以强制对未排序的数据进行精确匹配。我不知道这是否是您的意图,但如果没有它们,则必须对飞机周id命名范围中的数据进行排序(请参阅)。

您的声明是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
,以确保在键入变量名时代码不会编译),对所有标识符使用有意义的名称(这些名称告诉读者它们的用途,如果仅从代码中看不出原因,则使用注释)


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

确实更好。现在,假设
Range(“Aircrafter”)
包含一个使整个语句爆炸的值。或者,
ActiveSheet
(像这样使用的
Range
函数隐式引用)不是预期的,并且无法访问指定的范围。有趣吗?;-)我也会试试这个。回复:225个字符-对吧?!?正是我的问题。谢谢你给我的建议。我尽量使用有意义的名字等等。在这个项目失控之前,我将着手实现它。@Zephyrmais可以随时发布您的工作代码(尽可能多的上下文),以帮助提高可读性、效率和可维护性,等等。当然可以这样做。我感谢你和@Jeeped花了这么多时间来回答。分解事物的行为揭示了大量的重复陈述或部分陈述,我已经尽可能多地将它们分解成单独的变量。每当我不止一次地看到同一句话,就很容易把它说出来。现在事情更清楚了@垫子马克杯——正如建议的那样,在大扫除之后,我把我的项目贴在了。再次感谢你的建议。通过这些陈述回到基本点,让我记住了我要做的事情以及为什么要做这些事情!
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