2016-09-07 75 views
1

我是VBA的新手,很抱歉如果問題對於更有經驗的用戶來說是顯而易見的。我試着閱讀類似問題的答案,並解決了問題,但仍面臨同樣的問題。VBA - 選擇方法失敗

我的代碼是:

Workbooks("XXX.xls").Activate 

' Setting column width 
Workbooks("XXX.xls").Worksheets("XXX").Cells.Select 
Selection.ColumnWidth = 10 

' Filtering XXX funds 
Workbooks("XXX.xls").Worksheets("XXX").Rows("1:1").Select 
Selection.AutoFilter Field:=3, Criteria1:="=*XXX*" 

' Add new sheet and rename it 
Sheets.Add After:=Worksheets(Worksheets.Count) 
ActiveSheet.Name = "XXX_F" 

'Copying needed information 
Workbooks("XXX.xls").Worksheets("XXX").Range("A1:C1").Select 
Range(Selection, Selection.End(xlDown)).Select 
Selection.Copy 

我得到的錯誤是「運行時間錯誤‘1004’:範圍類的選擇方法失敗」從倒數第三行。我試圖加入這一行(即激活的工作簿我想先工作)來解決它:

Workbooks("XXX.xls").Activate 

此外,我在我的代碼使用顯式引用,如:

Workbooks("XXX.xls").Worksheets("XXX").Range("A1:C1").Select 

我明白,這最好不要在我的代碼中使用選擇方法。但這不是我第一次遇到這個錯誤,我只想了解VBA的邏輯。據我瞭解Excel只是不明白我指的是哪張表,但我不明白爲什麼 - 因爲我激活了我需要的工作簿(我打開了幾本工作簿)並使用了明確的引用。如果你能詳細解釋爲什麼會出現這個錯誤(即Excel在哪個時間點混淆),我將非常感激!

感謝大家提前的幫助!

+1

只是一個提示 - Excel有一些稱爲實例(如果您使用Excel 2007以上)。我想你的情況你已經開了兩個excel的東西。要修復它,關閉所有excel文件,然後用代碼打開文件,用XXX打開文件,只需單擊鼠標按鈕即可。 – Vityata

+2

此錯誤很可能發生,因爲在您激活工作簿時,您還需要激活工作表,然後才能在該工作表上使用.select方法。所以:'工作表(「XXX」)。activate'我知道你已經說過了,但請記住,使用select語句幾乎總是有更好的方法。 – Jason

+1

您不能選擇活動工作表之外的其他任何東西。最好的做法是重構代碼,以便它不會使用*** Active *或全局對象。獲取對象的引用並使用它們。 – Comintern

回答

1

對這個問題的評論已經充分描述了1004錯誤的性質,你似乎對此有足夠的理解。

更多細節請參閱本大討論:

How to avoid using Select in Excel VBA macros

這裏是你的代碼重構,以避免Select方法。

Dim wb as Workbook 
Dim ws as Worksheet 
Dim newWS as Worksheet 
Dim rngCopy as Range 

Set wb = Workbooks("XXX.xls") 
Set ws = wb.Worksheets("XXX") 

With ws 
    ' Setting column width 
    .Cells.ColumnWidth = 10 

    ' Filtering XXX funds 
    .Rows(1).AutoFilter Field:=3, Criteria1:="=*XXX*" 

    Set rngCopy = .Range(.Range("A1:C1"), .Range("A1:C1").End(xlDown)) 
End With 

' Add new sheet and rename it 
With wb 
    Set newWS = .Sheets.Add(After:=.Worksheets(.Worksheets.Count)) 
End With 
newWS.Name = "XXX_F" 

' Paste data in to the new worksheet 
rngCopy Destination:=newWS.Cells(1,1) 
+0

非常感謝您的幫助! –