programing

범위에 배열을 쓰는 중입니다.어레이의 첫 번째 값만 가져옵니다.

showcode 2023. 6. 19. 21:49
반응형

범위에 배열을 쓰는 중입니다.어레이의 첫 번째 값만 가져옵니다.

저는 범위에 배열을 쓰려고 노력하고 있으며 여러 가지 방법을 시도했지만 어떤 일이 있어도 항상 배열의 첫 번째 값만 반복해서 얻습니다.

코드는 다음과 같습니다.

Option Explicit

Sub test()

    ActiveWorkbook.Worksheets("Sheet1").Cells.Clear

    Dim arrayData() As Variant
    arrayData = Array("A", "B", "C", "D", "E")

    Dim rngTarget As Range
    Set rngTarget = ActiveWorkbook.Worksheets("Sheet1").Range("A1")

    'this doesn't work
    rngTarget.Resize(UBound(arrayData, 1), 1).Value = arrayData

    Dim rngTarget2 As Range
    Set rngTarget2 = ActiveWorkbook.Worksheets("Sheet1").Range(Cells(1, 5), Cells(UBound(arrayData, 1), 5))
    'this doesn't work either
    rngTarget2.Value = arrayData

End Sub

제가 기대하는 것은 다음과 같습니다.

(Col A)     (Col E)
A           A
B           B
C           C
D           D
E           E

제가 실제로 본 것은 다음과 같습니다.

(Col A)     (Col E)
A           A
A           A
A           A
A           A
A           A

내가 여기서 뭘 잘못하고 있는 거지?

저는 여기에 있는 것처럼 칩 피어슨의 제안을 따르려고 했습니다.

하지만 운이 없어요...

자, 그럼 이 문제의 두 번째 부분에 추가해 보겠습니다.

8,061개의 요소가 포함된 1D 어레이를 가지고 있으며, 이를 다음 함수로 전달합니다.

Call writeArrayData7(strTabName, arrayBucketData, 7)

Sub writeArrayData7(strSheetName As String, arrayData As Variant, intColToStart As Integer)

    Dim lngNextRow As Long
    lngNextRow = 1 ' hard-coded b/c in this instance we are just using row 1

    ' Select range for data
    Dim rngData As Range
    Set rngData = Sheets(strSheetName).Range(Cells(lngNextRow, intColToStart), Cells(lngNextRow - 1 + UBound(arrayData, 1), intColToStart))

    ' Save data to range
    Dim arrayDataTransposed As Variant
    arrayDataTransposed = Application.Transpose(arrayData)
    rngData = arrayDataTransposed

End Sub

그래서 제가 이것을 실행할 때, 전치환 함수는 다음과 같이 적절하게 변환됩니다.

Array(1 to 8061, 1 to 1)

범위는 G 열에 8,061개의 셀이 있는 단일 열로 나타납니다.

그러나 다음 오류가 발생합니다.

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

다음 행에 오류가 발생합니다.

rngData = arrayDataTransposed

업데이트 ---

샘플 코드(b/c 솔직히 중요하지 않다고 생각했습니다)에서 한 가지 빠뜨린 것은 배열의 내용이 실제로 공식이라는 것입니다.실제 라이브 코드에서 사용하는 라인은 다음과 같습니다.

arrayData(i) = "=IFERROR(VLOOKUP($D" + CStr(i) + "," + strSheetName + "!$D:$F,3,FALSE),"")"

제가 (Excel Hero의 도움을 받아) 발견한 것은 위의 문장에 문자열에 필요한 이중 따옴표 집합이 없다는 것입니다. 그래서 대신 이것으로 변경해야 했습니다.

arrayBucketData(i) = "=IFERROR(VLOOKUP($D" + CStr(i) + "," + strSheetName + "!$D:$F,3,FALSE),"""")"

저는 그것을 심야의 골머리 코딩이라고 부를 수 있습니다.

하지만 제가 배운 것 중 하나는 전체 코드를 실행하기 위해 다시 돌아갔을 때 어레이를 범위에 붙여넣는 데 오랜 시간이 걸렸다는 것입니다.이것은 보통 매우 간단한 작업이고 빠르게 발생할 것이기 때문에 저는 정말 혼란스러웠습니다.

많은 디버깅을 거친 후 문제가 모든 알림/계산/등을 끄고 이러한 공식을 붙여 넣었을 때 발생한 것으로 나타났습니다.strSheetName시트가 아직 도착하지 않았습니다. b/c 메인 파일과 별도로 이 코드를 개발하고 있습니다.코드를 붙여넣을 때 대화 상자가 표시되는 것처럼 보이지만, 모든 것을 차단하면 볼 수 없지만 모든 것이 느려집니다.탭이 없으면 범위를 붙여넣는 데 약 6분이 걸리고 탭이 있는 경우에는 몇 초(아마도 그보다 적음)가 걸립니다.어쨌든 코드를 좀 더 세분화하기 위해 필요한 시트를 확인하고 없으면 탭을 자리 표시자로 추가하여 전체 프로세스가 크롤로 느려지지 않도록 하는 기능을 추가했습니다.

모두의 도움에 감사드립니다!이것이 앞으로 다른 누군가에게 도움이 되기를 바랍니다.

수행할 작업:

arrayData = Array("A", "B", "C", "D", "E")

[a1].Resize(UBound(arrayData) + 1) = Application.Transpose(arrayData)

중요한 비트는 Transpose() 기능입니다.

그러나 워크시트에 2D 어레이를 쓸 계획이라면 처음부터 사용하는 것이 좋습니다.첫 번째 순위의 행과 두 번째 순위의 열로 정의하는 한, 전환이 필요하지 않습니다.

다음 항목:

Sub test()

    ActiveWorkbook.Worksheets("Sheet1").Cells.Clear

    Dim arrayData(1 To 5, 1 To 1) As Variant
    arrayData(1, 1) = "A"
    arrayData(2, 1) = "B"
    arrayData(3, 1) = "C"
    arrayData(4, 1) = "D"
    arrayData(5, 1) = "E"

    Dim rngTarget As Range
    Set rngTarget = ActiveWorkbook.Worksheets("Sheet1").Range("A1:A5")
    rngTarget = arrayData

End Sub

다음을 생성합니다.

enter image description here

만약 제가 수락된 답변을 확장할 수 있다면, 저는 다음과 같이 제안합니다.

[a1].Resize(UBound(arrayData) - LBound(arrayData) + 1) = Application.Transpose(arrayData)

그것이 안전한 방법일 것입니다.어레이 변수를 다음과 같이 선언해도 작동합니다.

Dim arrayData(0 to 2) 

또는

Dim arrayData(1 to 3) 

승인된 답변은 두 번째 경우에만 작동합니다.

제안된 방법은 어레이 크기를 알 수 없고 arrayData를 다음과 같이 선언하는 경우에 유용할 수 있습니다.

Dim arrayData()

언급URL : https://stackoverflow.com/questions/33161371/writing-an-array-to-a-range-only-getting-first-value-of-array

반응형