2012-11-28 2 views
1

여러 탭이있는 Excel 파일이 있습니다. 잘 작동하는 일부 코드가있는 워크 시트가 있습니다. 이 코드는 또한 일부 "마스터"탭의 데이터를 참조합니다. 이 시트를 복제해야 거기에서 일반적인 기능을 모듈로 옮겼습니다. 이제 같은 워크 시트의 범위에 액세스 할 때 VBA 1004 오류가 발생합니다.코드가 워크 시트에서 모듈로 이동하면 VBA Excel 오류가 발생합니다.

Dim selectedRange As Range 
Set selectedRange = Worksheets(name).Range("A1", _ 
Range("A" & Rows.count).End(xlUp)) 'Error Line 

이 코드는 모듈로 옮길 때까지 잘 작동합니다. 내가 전에

Worksheets(name).Select 

를 넣어 경우 작동하지만, 나는 그것을 너무 많은 시간을해야 할 것입니다. 다음 쿼리를 기반으로 : VBA error 1004 - select method of range class failed 코드는 .Select없이 정상적으로 작동합니다. 그리고 코드가 워크 시트 내에있는 한 그렇게합니다. 모듈로 이동하는 코드가 문제를 일으키는 이유는 무엇입니까?

답변

1

U 개체 한정자가없는 범위 및 행 속성 을 사용하십시오. 개체 한정자없이 사용할 경우이 속성은 ActiveSheet.Range/ActiveSheet.Rows에 대한 바로 가기입니다.

그래서 코드는 다음을 수행합니다

Worksheets(Name).Range("A1", ActiveSheet.Range("A" & ActiveSheet.Rows.Count).End(xlUp)) 

그러나 더 나은 그래서 워크 시트 (이름) 활성 시트 다를 수 :

:

Worksheets(Name).Range("A1", Worksheets(Name).Range("A" & Worksheets(Name).Rows.Count).End(xlUp)) 

와 엔드 블록에

With Worksheets(name) 
     Set selectedRange = .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) 
End With 

따라서 Range/Rows 속성이 워크 시트 (이름) 워크 시트 ob ject.

0

시트에서 작업 할 때 실제로 해당 시트에 대한 명시 적 선언이 필요하지 않습니다.

그러나 모듈에서 작업하고 다른 시트와 상호 작용할 때 작업 할 시트를 지정해야합니다. 그래서 을 선택 전에 을 선택하십시오. 범위를 선택하십시오. 말하자면, 부모를 선택하기 전에 자녀를 선택하십시오 :) 다음은 논리적인 설명입니다. 정확한 코드 구문이 아닙니다.

그래서 다음 워크 시트 변수를 만들고 필요한 워크 시트 개체를 설정하는 것이 좋습니다.

Dim WS as Worksheet 
Dim selectedRange As Range 

Set WS = Sheets("Shee1") 
Set selectedRange = WS.Range("A1", _ 
Range("A" & Rows.count).End(xlUp)) 'Error Line 

아니면 모든 시트를 참조하려면, 당신이 사용할 수있는 각 시트의 인덱스

일예 ThisWorkBook.Sheets(i) 'i is an integer 그런 다음 프로그램 구조로 간주하는대로 반복하십시오.

워크 시트에서 Select을 사용하여 해당 워크 시트의 범위를 지정하지 않아도됩니다. 위의 코드에 따라 워크 시트를 설정하고 처리해야 할 범위를 설정할 수 있습니다. VBA 실행을 최적화 할 때 일반적으로 select은 금기 사항입니다. 또한 Excel 2007에서는 이전 버전과 같은 방식으로 활성 시트가 ​​유지되지 않습니다.

+2

_every_ 범위 참조를 한정해야하므로 'WS.Rows.count'가됩니다 –

+0

건강한 코멘트를 놓친 것처럼 보입니다. 여기에 돌아 왔을 때 내 답변과 의견이 모두 결합되었습니다.) thanks @ChrisNeilson – bonCodigo

관련 문제