programing

Excel VBA: 한 단계로 범위에서 문자열 어레이까지

magicmemo 2023. 5. 11. 21:22
반응형

Excel VBA: 한 단계로 범위에서 문자열 어레이까지

다양한 셀을 쉽게 가져와서 변형 배열에 넣을 수 있다는 것을 알지만 문자열 배열로 작업하고 싶습니다(왜냐하면 단일 차원이고 변형 배열보다 메모리가 덜 들기 때문입니다).

범위를 문자열 배열로 자동 변환하는 방법이 있습니까?

현재 저는 범위를 가져와서 변수 배열에 값을 저장한 다음 변수 배열을 문자열 배열로 변환하는 기능을 사용하고 있습니다.잘 작동하지만, 범위에서 문자열 배열로 바로 이동할 수 있는 방법을 찾고 있습니다.어떤 도움이라도 주시면 대단히 감사하겠습니다.

Function RangeToArray(ByVal my_range As Range) As String()

Dim vArray As Variant
Dim sArray() As String
Dim i As Long

vArray = my_range.Value
ReDim sArray(1 To UBound(vArray))

For i = 1 To UBound(vArray)
    sArray(i) = vArray(i, 1)
Next

RangeToArray = sArray()

End Function 

업데이트: 데이터를 1차원 문자열 배열로 변환하기 전에 먼저 변수 배열에 넣는 단계를 건너뛸 수는 없을 것 같습니다.사실이라면 부끄러운 일입니다(많은 노력이 필요하지 않더라도 저는 초최적화하는 것을 좋아하기 때문에 그 단계를 건너뛸 수 있는 방법이 있기를 바랐습니다.해결책이 제시되지 않으면 며칠 안에 질문을 끝내겠습니다.여러분, 도움이 되는 의견을 주셔서 감사합니다!

업데이트 2: 정답은 (다른 모든 사람들도 마찬가지로) 많은 노력을 기울였고 한 번의 샷으로 범위에서 문자열 배열로 이동하는 것이 실제로 불가능하다고 지적한 사이먼에게 있습니다.감사합니다, 여러분.

실제로 텍스트에 없는 분할, 결합 및 구분 기호를 사용하여 범위에서 배열로 직접 이동할 수 있습니다.

1D 범위의 값을 이미 SrcRange로 할당했다고 가정합니다.

Dim Array() As String: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#")

그럼...

Public Function RangeToStringArray(theRange As Excel.Range) As String()

    ' Get values into a variant array
    Dim variantValues As Variant
    variantValues = theRange.Value

    ' Set up a string array for them
    Dim stringValues() As String
    ReDim stringValues(1 To UBound(variantValues, 1), 1 To UBound(variantValues, 2))

    ' Put them in there!
    Dim columnCounter As Long, rowCounter As Long
    For rowCounter = UBound(variantValues, 1) To 1 Step -1
       For columnCounter = UBound(variantValues, 2) To 1 Step -1
           stringValues(rowCounter, columnCounter) = CStr(variantValues(rowCounter, columnCounter))
       Next columnCounter
    Next rowCounter

    ' Return the string array
    RangeToStringArray = stringValues

End Function
Function RangeToStringArray(myRange as range) as String()

    ReDim strArray(myRange.Cells.Count - 1) As String
    Dim idx As Long
    Dim c As Range
    For Each c In myRange
        strArray(idx) = c.Text
        idx = idx + 1
    Next c

    RangeToStringArray = strArray
End Function

클립보드의 내용을 변경해도 괜찮다면 다음을 수행합니다.

  1. 복사 방법을 사용하여 범위를 클립보드에 복사합니다.

    MyTargetRange.Copy
    
  2. 클립보드에서 문자열 변수로 내용을 복사합니다(클립보드로 문자열을 전송하거나 클립보드에서 문자열을 전송하는 기능은 이 사이트 또는 다른 곳에서 검색).

  3. 문자열을 변형 배열로 분할합니다.

    MyStringArray = Split(MyClipboardText, vbCrLf)
    
  4. 선택사항: 방금 클립보드에 복사한 텍스트 끝에는 항상 추가 반환(vbCrLf)이 있으므로 배열에 빈 요소가 하나 더 있습니다.단순히 배열 크기를 조정하여 제거하려면:

    Redim Preserve MyStringArray(Ubound(MyStringArray) - 1)
    

매우 간단하고 빠릅니다!!!

단점은 클립보드가 (재계산 중에) 가장 예상치 못한 경우에 변경될 수 있고 이중 또는 기타 숫자 값 유형이 아닌 문자열 배열만 생성된다는 것입니다.

이는 동일한 데이터(수천 개의 데이터 포인트)를 사용하는 반복 함수(수천 개)를 많이 사용하는 경우 매우 유용합니다.함수가 처음 호출되면 필요한 데이터 범위에 대한 모든 중간 계산을 수행하지만 결과는 정적 변수에 저장합니다.클립보드를 통해 입력 범위의 문자열 복사본도 저장합니다.각 후속 호출에서 입력 범위를 텍스트로 변환하고 클립보드를 통해 저장된 복사본과 비교합니다.동일한 값이면 예비 계산의 할당을 생략할 수 있습니다.

VBA에 사용되는 명명된 범위가 이미 배열입니다.따라서 먼저 범위를 명명된 범위로 만든 다음 이를 참조하여 명명된 범위를 삭제합니다.예:

ThisWorkbook.Names.Add Name:="test_array", RefersTo:=Sheet1.Range("A4:B10")
a = Sheet1.Range("test_array")
ThisWorkbook.Names("test_array").Delete

언급URL : https://stackoverflow.com/questions/6773232/excel-vba-range-to-string-array-in-1-step

반응형