2014-12-04 64 views
0

我只需要IF行,如果他試圖打開運行代碼的文件(嘗試打開自己),那麼跳過它。從excel VBA中添加沒有運行文件的行

這是我到目前爲止的代碼。

Sub Auto_Open() 

     Dim SrcBook As Workbook 
     Dim fso As Object, f As Object, ff As Object, f1 As Object 

     Application.ScreenUpdating = False 
     Set fso = CreateObject("Scripting.FileSystemObject") 
     Set f = fso.Getfolder("C:\test\new") 
     Set ff = f.Files 

     For Each f1 In ff 
       Set SrcBook = Workbooks.Open(f1) 
       Range("A2:IV" & Range("A20").End(xlUp).Row).Copy 
       ThisWorkbook.Worksheets(1).Activate 
       Range("A20").End(xlUp).Offset(1, 0).PasteSpecial 
       Application.CutCopyMode = False 
       SrcBook.Close 
     Next 
End Sub 
+0

如果你想感謝某人,因爲他們的答案奏效,你可以在他們的答案和/或投票旁邊勾選checkmatrk。查看幫助中心[Someone answers](http://stackoverflow.com/help/someone-answers) – rene 2014-12-04 08:10:01

回答

1

以你的代碼是,你可以在下面的if語句添加到對於每個迴路:

For Each f1 In ff 
     If StrComp(f1.Name, ActiveWorkbook.Name, vbTextCompare) <> 0 And _ 
      InStr(1, f1.Name, "~") = 0 Then 
      Set SrcBook = Workbooks.Open(f1) 
      Range("A2:IV" & Range("A20").End(xlUp).Row).Copy 
      ThisWorkbook.Worksheets(1).Activate 
      Range("A20").End(xlUp).Offset(1, 0).PasteSpecial 
      Application.CutCopyMode = False 
      SrcBook.Close 
     End If 
    Next 

第一個條件防止打開當前文件本身,第二個條件也跳過Excel在打開文件時創建的臨時文件。

返工代碼

正如順便說一句,我會重構和擴大代碼如下:

Sub Auto_Open() 
On Error GoTo Err_ 
    Dim fso As Object 
    Dim Folder As Object 
    Dim Files As Object 
    Dim File As Object 

    Application.ScreenUpdating = False 
    Set fso = CreateObject("Scripting.FileSystemObject") 
    Set Folder = fso.Getfolder("C:\Temp\Excel") 
    Set Files = Folder.Files 

    For Each File In Files 
     If StrComp(File.Name, ActiveWorkbook.Name, vbTextCompare) <> 0 And _ 
      InStr(1, File.Name, "~") = 0 Then 

      With Workbooks.Open(File.Path) 
       Range("A2:IV" & Range("A20").End(xlUp).Row).Copy 
       ThisWorkbook.Worksheets(1).Activate 
       Range("A20").End(xlUp).Offset(1, 0).PasteSpecial 
       Application.CutCopyMode = False 
       .Close 
      End With 
     End If 
    Next 

Exit_: 
    Application.ScreenUpdating = True 
    Set Files = Nothing 
    Set Folder = Nothing 
    Set fso = Nothing 
    Exit Sub 

Err_: 
    Resume Exit_ 
End Sub 

一個幾句話:

  • 錯誤處理確保即使在出現錯誤的情況下ScreenUpdating再次切回。否則,如果發生錯誤,您可能會讓應用程序無法刷新給用戶。
  • 每個變量的分隔線 - 易於掌握
  • 更明確的變量名稱。首先,代碼應該是容易閱讀,不容易打字。
  • With -block爲局部變量使其作用域顯式。保存本地變量SrcBook。
    在這裏可能會爭辯說,該變量的名稱有助於理解問題,應該更好地保留。
  • 顯式設置對象變量爲Nothing。可能是偏執狂,但作爲SOP,在某些情況下,它可以幫助避免所有類型的奇怪問題。

,因爲它可能是具有挑戰性的獲得在With - 阻塞代碼的意圖,我會走得更遠,並提取塊到一個新的方法有意向揭示的名字讓事情更清晰。該名稱可以沿着CopyProductListFromFile

+0

不錯的努力,但是......您的'With'區塊混淆不僅僅是它的幫助!你唯一使用它的是'.Close'。此外,儘管這是[未正確記錄](http://msdn.microsoft.com/en-us/library/office/ff193498%28v=office.14%29.aspx),但ScreenUpdating會自動恢復爲true宏執行結束。嘗試一下。至於將這些FSO對象設置爲Nothing,我希望看到一個例子,不這樣做會導致奇怪的行爲。我從來沒有見過,也沒有聽說過。此外,清晰的變量名稱很好,但要小心,'File'也是一個FSO對象類。 – 2014-12-04 09:13:22

+0

@ Jean-FrançoisCorbett當然,你的問題是正確的(我沒有意識到ScreenUpdating行爲 - thx!)。對於我來說'With'塊並不是要有某種簡短的語法,而是要爲對象顯式地提供一個範圍。將所有對象變量設置爲「Nothing」意味着一個安全的操作過程,我現在正在追蹤很多年,只是爲了明確和安全。正如我寫的,這可能只是偏執狂。 :) – paulroho 2014-12-04 09:29:06

+0

範圍* *哪些*對象? – 2014-12-04 11:15:53

1
If Not ThisWorkbook.FullName = f1.Path Then 
      Set SrcBook = Workbooks.Open(f1) 
      Range("A2:IV" & Range("A20").End(xlUp).Row).Copy 
      ThisWorkbook.Worksheets(1).Activate 
      Range("A20").End(xlUp).Offset(1, 0).PasteSpecial 
      Application.CutCopyMode = False 
      SrcBook.Close 
End If