>source

아래에는 범위에서 배열을 형성하고 ActiveX Listbox에 게시하는 매크로가 있습니다.

코드는 작동하지만 스프레드 시트에 지속적으로 게시하는 속도가 느립니다. 전체 배열을 목록 상자에 더 효율적으로 게시하는 방법이 있습니까?

아래 코드를 참조하십시오.

'' '

Sub Test()
'Lets format and populate the Listbox102
Dim p as integer, i as integer, j as integer, FinalCombinedArray as variant
FinalCombinedArray=ThisWorkbook.Sheets("Worksheet").Range("A1:D300")
'Keep track of where the scrollbar is currently
p = ThisWorkbook.Sheets("Worksheet").ListBox102.TopIndex
ThisWorkbook.Sheets("Worksheet").ListBox102.Clear
'Inset array element by element
For i = 1 To UBound(FinalCombinedArray, 2)
    For j = 1 To UBound(FinalCombinedArray, 1)
        If i = 1 Then
            ThisWorkbook.Sheets("Worksheet").ListBox102.AddItem
        End If
        'Format array numbers
        If ((j + 1) Mod 14) = 0 Then
            ThisWorkbook.Sheets("Worksheet").ListBox102.List(j - 1, i - 1) = Format(FinalCombinedArray(j, i), "#,##0.0000")
        Else
            ThisWorkbook.Sheets("Worksheet").ListBox102.List(j - 1, i - 1) = Format(FinalCombinedArray(j, i), "#,##0.00")
        End If
    Next j
Next i
ThisWorkbook.Sheets("Worksheet").ListBox102.AddItem
'If possible, bring scrollbar back to where it was
If ThisWorkbook.Sheets("Worksheet").ListBox102.ListCount - 1 > p Then
    ThisWorkbook.Sheets("Worksheet").ListBox102.TopIndex = p
End If
End Sub


  • 답변 # 1

    범위 참조 사용

    이미 사용중인 경우 ActiveX ListBox 데이터가 범위에 있습니다. ListFillRange 속성을 사용하지 않는 이유는 무엇입니까?

    이 방법을 사용하면 ListBox 모든 값을 포함하고 일반 형식도 유지합니다.

    <시간 /> List 속성 사용

    두 번째 눈에 귀하의 예는 여러 열의 데이터를 사용하는 것입니다. 이 경우 단일 열을 원하면 ListBox , 그런 다음 ListBox.List 속성을 사용하고 단일 차원 배열에서 값을로드 할 수 있습니다.

    ThisWorkbook.Sheets("Worksheet").Range("A1:D300").value 2 차원 배열을 반환하므로 단일 차원 배열로 변환해야합니다. 다음은이를 수행하는 두 가지 도우미 함수입니다.

    ' Helper function to get the number
    ' of elements from an array from a specific dimension
    Public Function ArrayLength(source As Variant, Optional dimension As Long = 1) As Long
        ArrayLength = UBound(source, dimension) - LBound(source, dimension) + 1
    End Function
    ' Convert two dim array to a single dim array
    Public Function ToSingleArray(twoDimArray As Variant) As Variant
        ' Get an empty array with needed number of elements
        ' (row * column)
        Dim temp As Variant
        ReDim temp(0 To (ArrayLength(twoDimArray, 1) * ArrayLength(twoDimArray, 2)))
        
        ' Loop first columns then rows.
        Dim column As Long
        For column = LBound(twoDimArray, 2) To UBound(twoDimArray, 2)
            Dim row As Long
            For row = LBound(twoDimArray, 1) To UBound(twoDimArray, 1)
                Dim current As Long
                
                ' Add item to the single dim array.
                temp(current) = twoDimArray(row, column)
                current = current + 1
            Next row
        Next column
        
        ' Return the new single dim array.
        ToSingleArray = temp
    End Function
    
    

    포맷팅은 이것들에서 보존되지 않을 것입니다. 그래서 원한다면 함수의 수정 된 버전을 생성하거나 배열을 매핑하고 포맷 할 수 있습니다.

    항목 목록이 있으면 다음과 같이 간단합니다. .List = yourArray . 아래는 예제의 단순화 된 버전입니다.

    Public Sub test()
        With ThisWorkbook.Sheets("Worksheet").ListBox102
            .Clear
            .List = ToSingleArray(ThisWorkbook.Sheets("Worksheet").Range("A1:D300").Value)
        End With
    End Sub
    
    

  • 답변 # 2

    항목 별 대신 전체 배열을 할당하여 목록 상자를 한 번에 채울 수 있습니다.

    매우 기본적인 예 : 선택한 범위를 사용하여 목록 상자 채우기

    Dim rng As Range, arr
        
    Set rng = Selection
    arr = rng.Value
        
    'optionally run over arr and format values if required
    Me.ListBox1.ColumnCount = rng.Columns.Count
    Me.ListBox1.List = arr
    
    

  • 이전 xcode - Swift 프로젝트에서 뷰 컨트롤러의 델리게이트 속성에 액세스 할 수없는 이유
  • 다음 java - x ^ n + x ^ n-1 + x ^ n-2를 더하는 재귀 메서드를 어떻게 작성합니까?