2016-12-15 17 views
0

私はローカルディレクトリのファイルを検索しようとしていましたが、それがif関数の2番目のブロックと同じ名前で存在しない場合は、 i-1が存在する場合にのみRev i(iは反復番号1〜10)という名前で保存します。私はそれが理にかなっているかどうかわからないんだけど、私は自分のコードを添付しました(申し訳ありませんが、それは非常に長いです)ファイルが存在する場合はループ、次の繰り返しに進む

みんなありがとう:)

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

ブロックElseとブロックを区別する唯一のものは、リビジョン番号であり、一致するファイル名があるかどうかに基づいています。一度にすべてをやろうとするのではなく、2つの別々のタスクに分けてください。最初にリビジョンを見つけてください。そしてあなたが見つけたリビジョン番号に基づいて他のことを行います。これにより、大部分のコードを2回繰り返すことがなくなります(ファイル名以外の異なる2行があります)。

また、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 
0

私はあなたが同様の機能を取得しようとしていると思いますその他のjavaではbreakになります。 VBAは、inbuiltキーワードとしてbreakを提供しません。 しかし私のプロジェクトで使用していたスマートな回避策があります。これはどのように動作するのですか?

は、上記のコードでは

for i = 0 to x 
statement 1 
statement 2 
statement 3 
next 

を破る--without次のことができるように文句を言わない、あなたはステートメントの2の後に次の繰り返しに行きたいとします。 しかし、forループを1に1を採用することにより、上記の方法を使用して、この

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 

を試してみてください、あなたは、内側のループを終了することができるようになりますので、効果的にメインループの次の繰り返しに行くので、休憩を複製しますキーワード。

これが必要なのかどうか教えてください。

関連する問題