excel - 엑셀 - 입니다..Cells에 의해 정의 될 때 필요한 범위?




엑셀 vba range (2)

내 의견은 여기에서 약간 다릅니다.

그렇습니다 . 사용자가 코드를 실행할 수있는 위치를 항상 제어 할 수는 없습니다.

이 몇 가지 테스트 사례를 고려하십시오

대본

통합 문서에는 2 개의 워크 시트가 있습니다. Sheet1 및 Sheet2

테스트 1 (모듈에서 실행)

두 코드 모두 동일한 결과를 제공합니다

테스트 2 (시트 1의 시트 코드 영역에서 실행)

두 코드 모두 동일한 결과를 제공합니다

테스트 3 (시트 2의 시트 코드 영역에서 실행)

'~~> This code fails
set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))

Application Defined or Object defined 오류가 발생합니다

따라서 코드를 어디에서나 실행할 수 있도록 객체를 올바르게 규정하는 것이 좋습니다.

이것이 '최고의 실천'이 아니라는 것이 널리 알려져 있습니다.

dim rng as range
with thisworkbook    '<~~ possibly set an external workbook 
    with .worksheets("sheet1")
        set rng = .range(cells(2, 1), cells(rows.count, 1).end(xlup))
    end with
end with

Range 개체 의 범위를 정의하는 두 가지 Range.Cells 속성은 기본적으로 ActiveSheet 속성이 됩니다. 이것이 Sheet1이 아닌 경우 ( With ... End With 문 에서 .Parent 로 정의 됨) 할당이 실패합니다.

Run-tim error '1004': Application-defined or object-defined error

솔루션 : .Cells not Cells 사용 .Cells . 경우 폐쇄.

그러나...

입니다 . Range.Cells 속성이 With ... End With 문에 정의 된 .Parent 워크 시트 속성을 상속 할 .Parent Range 개체 정의에 필요 합니다 .

어떻게 이럴 수 있습니까?

dim rng as range
with thisworkbook    '<~~ possibly set an external workbook 
    with .worksheets("sheet1")
        ' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
        set rng = .range(.cells(2, 1), .cells(rows.count, 1).end(xlup))  '<~~ .range
    end with
end with
debug.print rng.address(0, 0, external:=true)

... 이와 달라

dim rng as range
with thisworkbook    '<~~ possibly set an external workbook 
    with .worksheets("sheet1")
        ' define rng as Sheet1!A2 to the last populated cell in Sheet1!A:A
        set rng = range(.cells(2, 1), .cells(rows.count, 1).end(xlup))  '<~~ range not .range
    end with
end with
debug.print rng.address(0, 0, external:=true)

범위의 범위를 정의하는 매개 변수가 모호 할 때 .range 사용합니다. 예를 들어 .range([A1]) A1 셀은 모든 워크 시트에있을 수 있으며 기본값없이 ActiveSheet 속성 을 사용합니다 . . 그러나 범위 개체를 정의하는 범위가 부모 워크 시트를 올바르게 참조 할 때 범위 개체의 부모를 참조해야하는 이유는 무엇입니까?


대답은 코드가 워크 시트 개체에있는 경우에만 나타납니다. 워크 시트 개체가 확장 가능하고 Range 기능이있는 유일한 개체이기 때문이라고 생각합니다. 워크 시트에서 Range 를 호출하면 해당 개체의 Range 함수에 범위가 있습니다. 코드가 ThisWorkbook 또는 사용자 모듈 또는 클래스에있는 경우 사용 가능한 가장 가까운 Range 가진 Range 함수는 전역 Range 개체입니다 (물론 사용자 정의 Range 함수가 없다고 가정). 이는 전달 된 매개 변수를 기반으로 해결하고 올바른 워크 시트로 호출을 전달해야하는 Application 연결되어 있습니다.







range