2016-09-07 16 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』:範囲クラスのSelectメソッドは失敗しました」で、下から3行目のを。私は、この行(私が最初に仕事をしたい、すなわち活性化ワークブック)を追加することによって、それを修正しようとした:私はそれを理解

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

:よう

Workbooks("XXX.xls").Activate 

はまた、私は、私のコードで明示的な参照を使用しました私のコードでは.Selectメソッドを使用しない方が良いです。しかし、このエラーが発生するのは初めてではなく、VBAのロジックを理解したいだけです。 Excelが理解しているように、私が参照しているシートは理解できませんが、理由を理解できません。ワークブックをアクティブにして(私はいくつかのワークブックを開いています)、明示的な参照を使用しています。このエラーがなぜ発生するのか(つまり、Excelが混乱する時点)を詳しく説明してください。非常に感謝します。

事前にお手数をおかけしていただきありがとうございます。

+1

ちょうどヒント - Excelにはインスタンスと呼ばれるものがあります(Excel 2007以降を使用している場合)。私はあなたの場合、あなたは2つの事実を秀でていると思っています。それを修正するには、すべての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

ありがとうございました! –

関連する問題