如何继续循环vba
Posted
技术标签:
【中文标题】如何继续循环vba【英文标题】:How to continue loops vba 【发布时间】:2018-12-03 12:51:16 【问题描述】:抱歉,如果这已经发布了 - 我找不到特定于 Excel 的内容(同样对于我糟糕的代码,我对 VBA 的经验很差)。
我正在尝试将多个文件整理到一个工作簿中,在不同的工作表下。其中大部分都在工作 - 但在 If Else 语句中,如果满足条件,则循环中断,而不是继续处理文件夹中的其余文件。 Else 部分确实循环。我认为Do While filename <> ""
会覆盖 if/then 语句。
仅仅添加“And Loop”(我猜这不是有效的代码)对我不起作用,所以我不知道应该添加什么,或者我是否应该以另一种方式解决这个问题。
感谢您的帮助!
Sub AllFiles()
Dim folderPath As String
Dim filename As String
Dim wb As Workbook
Dim master As Workbook
Set master = ThisWorkbook
folderPath = "C:\Users\Charmaine\Documents\Excel Files"
master.Activate
If Right(folderPath, 1) <> "\" Then folderPath = folderPath + "\"
filename = Dir(folderPath & "*.xlsm")
Do While filename <> ""
Application.ScreenUpdating = False
Set wb = Workbooks.Open(folderPath & filename)
Set wb = ActiveWorkbook
ActiveSheet.Range("F1:G242").Select
Selection.Copy
master.Activate
ActiveSheet.Paste
ActiveCell.Offset(0, 2).Select
wb.Activate
ActiveWorkbook.Saved = True
Application.CutCopyMode = False
ActiveWindow.Close
filename = Dir
If ActiveSheet.Range("R1") = "C3" Then Sheets.Add.[after].Name = valuenewsheet Else
Loop
Application.ScreenUpdating = True
End Sub
【问题讨论】:
... valuenewsheet Else
最后应该没有那个Else
。
是的,如果您删除Else
,那么无论如何都会触发循环。 If
Then
语句只是在满足条件时添加一个新工作表。
我试过这个,但在制作新工作表后出现“运行时错误'424':需要对象”错误。
当你的循环结束 If
语句正在评估它时,valuenewsheet
的值是多少?它在 Sub
中未声明,因此它要么是全局的,要么您没有在模块顶部使用 Option Explicit
。如果您不使用Option Explicit
,那是您的第一步——它可以防止您错误输入变量名。如果你这样做了,VBA 会“有帮助地”为你声明一个新的空变量......
另外,1 行 If... Then... Else
语句有点难以阅读。这是一种风格的东西,VBA 允许它们都在一条线上,但它相当不常见,需要更多的精力去思考,并且需要更多的横向滚动阅读(正如您在发布的代码中所指出的那样)。
【参考方案1】:
Do
'code
Loop While filename <>
有趣的是,当未满足 While 语句时,我遇到了 do while 循环退出的问题。将 While 语句转移到 Loop 语句之后对我有用。
【讨论】:
我也试过了,但添加新工作表后它也不起作用,出现同样的错误。这部分有什么问题吗? "Sheets.Add.[after].Name = valuenewsheet" 这种方法的唯一问题是它假定至少有一个filename
存在,如果不存在就会在Set wb = Workbooks.Open(folderPath & filename)
上炸毁。
我看不到您在哪里填充变量“valuenewsheet”,我假设这是导致错误的原因。
@TimStack that's what he said... :)
我永远不会因为别人的解决方案而获得功劳!【参考方案2】:
谢谢大家。 我最终将最后一行更改为
ActiveWorkbook.Sheets.Add After:=Worksheets(Worksheets.Count)
我认为“valuenewsheet”意味着它会计算下一个可用的工作表名称,但似乎是多余的。
【讨论】:
以上是关于如何继续循环vba的主要内容,如果未能解决你的问题,请参考以下文章
excel 运行VBA效率变低了 原来excel运行VBA程序,很快就执行完毕,现在运行相同的程序,效率变得很慢