【问题标题】:Shorten VBA code with repeat/loop使用重复/循环缩短 VBA 代码
【发布时间】:2017-06-26 20:27:18
【问题描述】:

如何缩短此代码以重复任务,但占用更少空间?这段代码需要为另外 27 个用户运行。我知道我现在完全是个菜鸟,但这可以减轻我每天一个多小时的工作量......


Workbooks.Open ("https://blabla/Edgars/2017 Q3Q4/Edgars.xlsx")
Workbooks("Edgars.xlsx").Activate

Range("C24:AN27").Select
Selection.Copy
Workbooks("abc.xlsx").Activate
Sheets("Edgars").Activate
Range("C24:AN27").Select
ActiveSheet.Paste
Workbooks("Edgars.xlsx").Activate
Sheets("Edgars").Activate
Range("C33:AN36").Select
Selection.Copy
Workbooks("abc.xlsx").Activate
Sheets("Edgars").Activate
Range("C33:AN36").Select
ActiveSheet.Paste
Workbooks("Edgars.xlsx").Activate
Sheets("Edgars").Activate
Range("C42:AN45").Select
Selection.Copy
Workbooks("abc.xlsx").Activate
Sheets("Edgars").Activate
Range("C42:AN45").Select
ActiveSheet.Paste

Workbooks("Edgars.xlsx").Activate
Sheets("Edgars").Select
ActiveWindow.SelectedSheets.Delete
Workbooks("abc.xlsx").Activate
Sheets("Edgars").Select
Sheets("Edgars").Copy Before:=Workbooks("Edgars.xlsx"). _
    Sheets(1)
Workbooks("Edgars.xlsx").Activate
Range("A1").Select
ActiveWorkbook.SaveAs Filename:="https://blabla/Edgars/2017 Q3Q4/Edgars.xlsx"
ActiveWorkbook.Close
Workbooks("abc.xlsx").Activate
Worksheets("TOOLS").Activate

Application.DisplayAlerts = True
Else
End If

【问题讨论】:

  • 您应该添加更多信息,简要描述代码的用途(和/或添加一些 cmets)。我也不清楚你所说的“缩短”是什么意思。是否有多个文件,需要通过代码运行?如果是,是否有某种命名结构?
  • 究竟花了你一个小时?运行代码还是调整代码中的值?使用任何类型的循环很可能不会导致执行速度发生任何显着变化。
  • 感谢您的 cmets!我的意思是这段代码(相同的东西,不同的文件)需要为另外 20 个不同用户名的用户重复(当然)。我开始深入研究 Siddharth 发布的文章,并正在努力缩短这篇文章。我需要一个小时或更长时间才能为这些人手动复制所有内容:)

标签: vba excel loops repeat


【解决方案1】:

在开始处理循环或缩短代码之前,您需要重新了解如何避免在 VBA 中使用 SelectActivate。当前形式的代码难以阅读或改进,因为您使用了很多隐式关系。

例如:

Workbooks("Edgars.xlsx").Activate
Sheets("Edgars").Activate

其实是:

Application.Workbooks("Edgars.xlsx").Activate
ActiveWorkbook.Sheets("Edgars").Activate

并且可以改为:

Application.Workbooks("Edgars.xlsx").Worksheets("Edgars").Activate

当然,这并不能消除Activate 问题,如果“Edgars.xlsx”不是打开的工作簿,您无疑会遇到问题。这个例子不是为了解决你的问题,它只是为了给你指明正确的方向。

一旦您重构代码以消除使用ActivateSelect 和隐式(非限定)引用,您就可以开始使用字符串变量。像这样的代码是有效的:

Dim UserName as String
UserName = "Edgars"
Application.Workbooks(UserName & ".xlsx").Worksheets(UserName).Activate

这使您的代码具有更大的灵活性,并让您更进一步。

我的建议是从这里开始:How to avoid using Select in Excel VBA macros。阅读这篇文章后,请尝试在您的代码中实现这些步骤。然后阅读更多内容并重试。

学习正确 VBA 需要花费一些时间,但如果你能很好地学习如何编写 VBA,你可以节省更多的时间,而不仅仅是一个小时(假设您将 Excel 用于多个流程)。

祝你好运!

【讨论】:

  • 酷,这已经给了我一些工作要做。很好,谢谢!
  • 不要忘记将您的问题标记为已回答。我很高兴能帮上忙 :)。
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-04
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
相关资源
最近更新 更多