programing

배리언트 배열에 범위를 할당하는 데 문제가 발생하는 이유

lastcode 2023. 4. 22. 09:32
반응형

배리언트 배열에 범위를 할당하는 데 문제가 발생하는 이유

아주 간단한 코드 행에 문제가 좀 있습니다.사실들을 자세히 설명해보고 이 행동을 모방할 수 있는 사람이 있는지 알아보겠습니다.만약 누군가가 복제할 수 있다면, 나는 왜 그것이 일어나고 있는지에 대한 설명을 듣고 싶다.

우선 동작하는 코드부터 간단하게 설명하겠습니다.

Dim arr() As Variant
arr = Range("A1:A10")

예상대로이다.arr에는 값()이.A1:A10

다음 코드 행이 작동하지 않는 이유는 무엇입니까?

Dim arr() As Variant
arr = WorkSheets("Sheet1").Range("A1:A10")

워크시트 값 없이 어레이에 동일한 범위가 할당되어도 런타임 오류 '13' 유형이 일치하지 않습니다.

그렇지만

Dim arr As Variant
arr = Worksheets("Sheet1").Range("A1:A10")

그리고.

Dim arr() As Variant
arr = Application.Transpose(Application.Transpose(Worksheets("Sheet1").Range("A1:A10")))

동작하고 있다

대답하기 전에 몇 가지 사실을 더 말씀드리겠습니다.

Dim arr() As Variant
arr = Worksheets(1).Range("A1:A10")

동작하지 않다

and and를 합니다.SheetsWorksheets모두 같은 에러를 나타내고 있습니다.

는 이 했습니다.Range("A1:A10").Worksheet.Name, 「 「 」라고 쓰여져 있습니다.Sheet1출력에 표시됩니다.

열려 있는 다른 워크북이 없으므로 다른 워크북도 참조할 수 없습니다.

이제 이 마지막 코드는 완전히 작동하기 때문에 혼란만 가중시킵니다!

Dim arr() As Variant
Dim SampleRange As Range

Set SampleRange = Worksheets("Sheet1").Range("A1:A10")
arr = SampleRange

SAME RANGE그리고 이 두 가지는 모두 잘 .WorkSheets ★★★★★★★★★★★★★★★★★」Sheets시트를 정의하는 방법에 관계없이 기능합니다(인덱스 또는 워크시트의 이름을 사용할 수 있으며 모두 정상적으로 작동합니다).

도움이 된다면 Windows XP 머신에서 Excel 2007을 사용하여 테스트해 보겠습니다.아직 다른 기계에서 테스트한 적은 없지만, 2003년과 2010년에 Windows 7과 Windows 8에서 테스트 할 예정입니다.아직 테스트 할 기회가 없었습니다.

업데이트: 이것이 어레이와 동일한 문제인지 100% 확신할 수 없지만 대략적으로 보면 다음과 같습니다.

 Range("B1:B3") = Range("A1:A3") 

A1이 다음과 같이 되어도, 상기의 코드는 기능하지 않습니다.A3이 입력되어 날짜, 숫자 값, 문자열, 수식 등 모든 것이 B1에 입력됩니다.B3

그렇지만

Range("B1:B3").Value = Range("A1:A3").Value

그리고.

Range("B1") = Range("A1")

동작합니다!

또, 기능하는 것은 다음과 같습니다.

Range("B1:B3") = Application.Transpose(Application.Transpose(Range("A1:A3")))

아니, 그건 버그가 아니야.

요점은 값이 Range 객체의 기본 속성인데 왜 암묵적으로 사용되지 않는가 하는 것입니다.제가 링크한 질문 보셨나요? (채팅에서)

이전 답변을 올린 전문가들은 이미 매우 상세하게 설명했습니다.설명은 최소한으로 하고 궁금한 점이 있으면 말씀드리겠습니다.

우리의 사물을 먼저 이해하자.이 작은 테이블은 혼동을 일으키지 않기 위해 우리가 취급하고 있는 것을 명확하게 알 수 있도록 만들었습니다.

여기에 이미지 설명 입력

또 '아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아,WatchType아래 그림과 같이 특정 오브젝트에 대해 설명합니다.

여기에 이미지 설명 입력

그래서 당신이 말할 때

arr = Range("A1:A10")

이 Excel인 ..Value그 엑셀을 사용하고 할 수 있을 말할 수 알 수 Worksheets("Sheet1").Range("A1:A10")Range ★★★Variant

으로 「」로 하면,Range 이것은 동작합니다.예를 들어, 이것은 동작합니다.

Dim arr() As Variant
Dim Rng As Range  
Set Rng = Worksheets("Sheet1").Range("A1:A10")
arr = Rng

제 코멘트를 명확히 하겠습니다.
적어도 내 요점을 명확히 하기 위해 내가 그것을 게시하는 것에 코멘트를 다는 것은 적절하지 않다.

Dim arr As Variant '~~> you declare arr as Variant as what Tim said

것은은 무엇 ?? ????
, ,, ,, ,, ,, ,, ,.arr는 임의의 들어 및)을 수 .Variable Type)

Dim arr() as Variant '~~> you declare arr() as array which may contain Varying `Data Type`

것은은 무엇 ?? ????
, ,, ,, ,, ,, ,, ,.arr() 다른 른른른른른른른른른른른른른른 different different different different different를 저장할 수 .Datatypes.timeout.
, that that that 。Objects ★★★★★★★★★★★★★★★★★」Collection of Objects.

다음 기능이 작동하는 이유:

1. Dim arr() As Variant: arr = Range("A1:A10")
2. Dim arr() As Variant: arr = Sheet1.Range("A1:A10")
3. Dim arr() As Variant: arr = Sheets("Sheet1").Range("A1:A10").Value

이것도 동작합니다.

4. Dim arr() as Variant
   Dim rng as Range

   Set rng = Sheets("Sheet1").Range("A1:A10")
   arr = rng

는 여러분이 가 있습니다.Collections of Objects렬합니니다다
이치
Range이지만, ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★는 아닙니다.Collection of Objects.
는 1번 접근하지 입니다.Sheets Collection Object.
경우에도 입니다.
2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번, 2번Sheet1은 ,입니다.Sheet(「」가 아닌)Collection of Sheet Objects.
은 자기이고, 3번은 , 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번, 3번,.Value arr array.어레이를 설정합니다.
No.4 works because 4번이 되는 이유는rng is already a 는 이미Range object by 에 의해 이의를 제기하다.Set which again is not a 다시 말하지만Collection of Objects.

그래서 다음과 같이 됩니다.

Dim arr() As Variant

arr = Sheets("Sheet1").Range("A1:A10")

Excel은 Excel 이 것 당 는 으 식 문 않 동 as지 doesn하 this excel excel because작 will때 read인'습니에다것기하 trying toObject부에서Sheets Collection of Objects따라서 오류가 발생합니다.에러가 발생합니다.
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★

'뭔가의 배열'은 '뭔가'와 같지 않다고 생각합니다.왜냐하면 '뭔가 다른 것의 배열' 될 수 있기 때문입니다.어레이로 정의할 경우 숫자, 텍스트, 범위, 차트 객체의 배열 등에 관계없이 어레이에 할당하는 것이 어레이여야 합니다.

예상치 못한 일이 발생할 경우 대부분의 경우 데이터 유형의 변환 기능이 내장되어 있기 때문에 작업이 쉬워집니다.이 변환은 개체의 속성이 아닌 직접 개체여야 합니다.

예를 들어 행과 콜은 Long 유형이지만 바이트/더블 유형을 지정할 수 있습니다.

Cells(1,1.5)을 매기다Cells(1,2)

1.5를 Long으로 변환할 필요는 없습니다.Excel은 모든 것을 백그라운드에서 처리합니다.

배열을 정의하고 배열을 할당하면 Excel은 장면 뒤에서 매칭을 입력하고 가능한 경우 값을 설정합니다.

[즉시(Immediate)]창에서 다음 항목을 확인합니다.

?typename(Range("A1:A10").Value)주다Variant()<--이것이 동작하는 이유입니다.Dim arr() As Variant문제없이

?typename(Range("A1:A10"))주다Range. 단, 할당 시arr어디에Dim arr() As VariantExcel은 해당 범위의 값을 사용하여 범위를 배열로 변환합니다.

단, Excel이 오브젝트에 직접 액세스 할 수 없는 경우 해당 오브젝트에 대한 메모리를 만들지 않는 한 변환에 실패할 수 있습니다.예를 들어 다음과 같습니다.

Dim arr() As Variant, oRng As Range
Set oRng = Range("A1:A10")
arr = oRng
Set oRng = Worksheets("Sheet1").Range("A1:A10")
arr = oRng

위의 코드는 모두 정상이지만 변환 및 할당할 수 없습니다.arr = ThisWorkbook.Worksheets("Sheet1").Range("A1:A10")어레이를 던지지 않는 한 한 한 번에 처리됩니다).ThisWorkbook.Worksheets("Sheet1").Range("A1:A10").ValueVariant() 타입입니다.

언급URL : https://stackoverflow.com/questions/21386768/why-am-i-having-issues-assigning-a-range-to-an-array-of-variants

반응형