2016-09-07 104 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

非常感谢您的帮助! –