2017-07-25 18 views
0

我最近問了一個問題,並在本網站上收到了很好的答案,但我現在遇到了另一個問題。下面的代碼可以很好地用於通過一個文件夾中的每個工作簿運行,複印紙的內容,並粘貼這些內容到主簿究竟如何,我想:粘貼後關閉整個工作表選擇

Sub ConslidateWorkbooks() 
'Code to pull sheets from multiple Excel files in one file directory 
'into master "Consolidation" sheet. 

Dim FolderPath As String 
Dim Filename As String 
Dim Sheet As Worksheet 
Dim wbName As String 

With ActiveSheet 
    Range("A1").Activate 
End With 

Application.ScreenUpdating = False 
FolderPath = ActiveWorkbook.Path & "\" 
Filename = Dir(FolderPath & "*.xls*") 
wbName = ActiveWorkbook.Name 

Do While Filename <> "" 
    If Filename <> wbName Then 
     Workbooks.Open Filename:=FolderPath & Filename, ReadOnly:=True 
     For Each Sheet In ActiveWorkbook.Sheets 
      copyOrRefreshSheet ThisWorkbook, Sheet 
     Next Sheet 
     Workbooks(Filename).Saved = True 
     Workbooks(Filename).Close 
     ActiveSheet.Range("A1").Activate 
    End If 
    Filename = Dir() 
Loop 

Application.ScreenUpdating = True 

End Sub 



Sub copyOrRefreshSheet(destWb As Workbook, sourceWs As Worksheet) 
    Dim ws As Worksheet 
    On Error Resume Next 
    Set ws = destWb.Worksheets(sourceWs.Name) 
    On Error GoTo 0 
    If ws Is Nothing Then 
     sourceWs.Copy After:=destWb.Worksheets(destWb.Worksheets.Count) 
    Else 
     ws.Unprotect Password:="abc123" 
     ws.Cells.ClearContents 
     sourceWs.UsedRange.Copy 
     ws.Range(sourceWs.UsedRange.Address).PasteSpecial (xlPasteAll) 
     Application.CutCopyMode = False 
     End If 
End Sub 

我現在遇到的問題:粘貼後完成後,主工作簿中的每個工作表都將選中所有單元格,就像整個工作表中的I Ctrl+A一樣。我想擺脫這一點。這是我嘗試在Do While ..循環內的ActiveSheet.Range("A1").Activate行中完成的一項小任務,但它不適用於我。

編輯:

我發現,在這種情況下,有效的解決方案。我不知道爲什麼這是必要的,因爲在這個線程的意見和答案看起來像他們應該工作,但他們沒有。我把這種sub我在主要子轉screenupdatingTrue前:

Sub selectA1() 
    Worksheets(1).Activate 
    Dim Sheet As Worksheet 

    For Each Sheet In ActiveWorkbook.Sheets 
     Sheet.Activate 
     ActiveWindow.ScrollRow = 1 
     ActiveWindow.ScrollColumn = 1 
     Sheet.Range("A1").Select 
    Next Sheet 

    Worksheets(1).Activate 
End Sub 

我意識到這是更復雜的比它應該是,但它適合我的目的。

+0

在所有的代碼中,相關的部分是什麼?你可以在'End Sub'之前說'Cells(1,1).Select',否? – BruceWayne

+0

不幸的是,沒有。這將在編輯的最後一張紙上選擇正確的單元格,但不是其他所有單元格。 –

+1

我相信你應該避免使用ActiveSheet,ActiveWorkbook,除非你真的需要使用它們。相反,定義特定的變量,比如用這行代碼:「Dim wk As Workbook,sh As Worksheet,r As Range」,然後用諸如「set sh = ActiveSheet」等行來設置它們......我發現這個以避免大量混淆,尤其是在調試代碼時,因爲「ActiveWorkbook」可能是包含代碼的代碼,也可能是正在操作的代碼,可以在調試會話期間更改代碼。希望這是有道理的。無論如何,希望有所幫助。 –

回答

0

在您的副本中,在循環中添加另一個代碼,該代碼將選擇一個應關閉總使用範圍選擇的單元格,並選擇編碼範圍。

Sub copyOrRefreshSheet(destWb As Workbook, sourceWs As Worksheet) 
Dim ws As Worksheet 
On Error Resume Next 
Set ws = destWb.Worksheets(sourceWs.Name) 
On Error GoTo 0 
If ws Is Nothing Then 
    sourceWs.Copy After:=destWb.Worksheets(destWb.Worksheets.Count) 
Else 
    ws.Unprotect Password:="abc123" 
    ws.Cells.ClearContents 
    sourceWs.UsedRange.Copy 
    ws.Range(sourceWs.UsedRange.Address).PasteSpecial (xlPasteAll) 
    ws.range("A1").select 
    Application.CutCopyMode = False 
    End If 
End Sub 

我加了ws.range("A1").select,應該按照上面描述的那樣做。

+0

是的,我試過了,仍然在收到經典的「選擇範圍類失敗的方法」。我相信宏正試圖在源工作表中選擇'A1',而不是主工作簿。 –

相關問題