如果文件存在则循环,转到下一次迭代

时间:2016-12-15 07:47:23

标签: vba excel-vba excel

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

2 个答案:

答案 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关键字。

请告诉我这是否是你需要的。

相关问题