2016-12-15 49 views
0

我一直在尝试搜索本地目录中的文件,如果它不存在只是为了在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 
+1

你能告诉什么是这个代码的工作已经和你想添加什么功能?所有这些代码是否与解决您的问题有关? – Limak

+1

使用代码缩进,你可以看到你的For和IF结构不正确,这段代码甚至不会编译......这就是问题#1。 – Rdster

回答

1

它看起来像区别If块和Else块唯一的区别就是版本号,这是基于您是否找到匹配的文件名。不要试图一次性完成所有任务,而应将其分解为2个独立的任务 - 首先找到修订版,然后根据您找到的修订版号完成其他任务。这样可以避免重复执行大部分代码(除了文件名以外,确切地说有两行是不同的)。

我也会用Do Until循环代替For循环。这与您正在做的更好的语义相匹配,并使代码对于其意图更易读。它还结合了测试退出循环进入循环本身,这样你就不会需要测试单独退出条件:

'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 
0

我想你想获得类似一个功能到其他java中的break。 VBA不提供任何内置关键字的中断。 但是,我曾经在我的项目中使用过智能解决方法。下面是它的工作原理。

--without打破

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的循环,你将能够退出内部循环,从而有效地将要主循环的下一次迭代,从而复制中断关键词。

让我知道如果这是你所需要的。