我一直在尝试搜索本地目录中的文件,如果它不存在,只是在if函数的第二个块中命名,并在其上迭代并保存名称Rev i(其中) i是迭代编号1到10),仅当i-1存在时。我不确定这是否有意义,但我附上了我的代码(对不起,这是非常冗长的)
谢谢你们:)
DirFile = Application.ActiveWorkbook.Path & "\" & QuoteNo & " - " & Client & " Rev " & i - 1 & ".docm"
For i = 1 To 10
If Dir(DirFile) <> "" Then
With objDoc
objDoc.Bookmarks("Quote").Select 'To place the Quote Number in the Word Template
.Application.Selection.Find.Text = "Quote "
.Application.Selection = QuoteNo & " - Revision " & i
End With
With objDoc
objDoc.Bookmarks("Footer").Select 'To place the Client Name in the Word Template
.Application.Selection.Find.Text = ""
.Application.Selection = Client & ": Rev. " & i
End With
Worksheets("Dewater - E&Q").UsedRange.Copy
objDoc.Activate
objDoc.Application.Run "EQAlign"
Application.CutCopyMode = False
objDoc.Application.Run "PrintLayout"
objDoc.SaveAs FileName:=Application.ActiveWorkbook.Path & "\" & QuoteNo & " - " & Client & " Rev " & i
Next i
Exit For
Else
With objDoc
objDoc.Bookmarks("Quote").Select 'To place the Quote Number in the Word Template
.Application.Selection.Find.Text = "Quote "
.Application.Selection = QuoteNo
End With
With objDoc
objDoc.Bookmarks("Footer").Select 'To place the Client Name in the Word Template
.Application.Selection.Find.Text = ""
.Application.Selection = Client
End With
Worksheets("Dewater - E&Q").UsedRange.Copy
objDoc.Activate
objDoc.Application.Run "EQAlign"
Application.CutCopyMode = False
objDoc.Application.Run "PrintLayout"
objDoc.SaveAs FileName:=Application.ActiveWorkbook.Path & "\" & QuoteNo & " - " & Client
End If
答案 0 :(得分:1)
看起来区分If
块和Else
块的唯一区别是修订号,这取决于您是否找到匹配的文件名。而不是试图一次完成所有事情,将其分解为两个单独的任务 - 首先找到修订版,然后根据您找到的修订版号执行其他任务。这样可以避免重复大部分代码两次(除了文件名之外,正好有两行不同)。
我还用For
循环替换Do Until
循环。这与您正在做得更好的语义相匹配,并使代码更具可读性。它还将退出循环的测试结合到 循环本身 中,因此您不需要单独测试退出条件:
'Find a unique revision\file name.
Dim revision As Long
With CreateObject("Scripting.FileSystemObject")
DirFile = QuoteNo & " - " & Client & ".docm"
Do Until Not .FileExists(.BuildPath(ActiveWorkbook.Path, DirFile))
revision = revision + 1
DirFile = QuoteNo & " - " & Client & " Rev " & revision & ".docm"
Loop
Next
With objDoc
objDoc.Bookmarks("Quote").Select 'To place the Quote Number in the Word Template
.Application.Selection.Find.Text = "Quote "
'This is based on the revision found above.
If revision = 0 Then
.Application.Selection = QuoteNo
Else
.Application.Selection = QuoteNo & " - Revision " & revision
End If
End With
With objDoc
objDoc.Bookmarks("Footer").Select 'To place the Client Name in the Word Template
.Application.Selection.Find.Text = ""
'This is based on the revision found above.
If revision = 0 Then
.Application.Selection = Client
Else
.Application.Selection = Client & ": Rev. " & revision
End If
End With
Worksheets("Dewater - E&Q").UsedRange.Copy
objDoc.Activate
objDoc.Application.Run "EQAlign"
Application.CutCopyMode = False
objDoc.Application.Run "PrintLayout"
objDoc.SaveAs DirFile
答案 1 :(得分:0)
我认为您正在尝试在其他java中获得与break
类似的功能。
VBA不提供任何内置关键字的中断。
但是,我曾经在我的项目中使用过一种智能解决方法。这是它的工作原理。
- 不休息
for i = 0 to x
statement 1
statement 2
statement 3
next
在上面的代码中假设你想在语句2之后进入下一次迭代,你将无法做到。 但试试这个
for i = 0 to x
for i = 1 to 1
statement 1
statement 2
'---if you need to break here, just do exit for and you will be out of inner loop (from 1 to 1)
exit for
statement 3
next
next
使用上面的方法,通过使用1到1 for循环,您将能够退出内部循环,从而有效地进入主循环的下一次迭代,从而复制break关键字。
请告诉我这是否是你需要的。