Как создать массив, содержащий все рабочие листы - PullRequest
0 голосов
/ 30 ноября 2018

Я обычно использую 2-мерный массив для получения содержимого рабочих листов.

Dim arrCheckCountDG
CheckCountDG = WBSProj.Range(WBSProj.Cells(2, 1), WBSProj.Cells(Last(1, WBSProj.Range("A:A")), Last(2, WBSProj.Range("1:1"))))

К сожалению, я не эксперт по массивам.Я попытался добавить третье измерение для хранения всех листов.Однако я полностью провалился :( Может кто-нибудь помочь мне с ....

Спасибо.

1 Ответ

0 голосов
/ 30 ноября 2018

Диапазон - это двумерный массив.Простое добавление третьего измерения не решит вашу проблему.Наилучшим и оптимальным подходом было бы использование Dictionary с именем листа в качестве key и массивом данных в качестве value.


Для изучения, если вы хотите хранить листы и связанные данные только в массиве, используйте неровный массив .Jagged массив - это массив, один или несколько элементов которого являются самим массивом.Посмотрите код ниже, это один из многих подходов, которые вы можете использовать.

Прочитайте комментарии к коду для уточнения.


Sub test()
    Dim arrData

    '/ Load an array with all the sheets and the data in it.
    arrData = LoadArray()

    '/ Pringt the data
    PrintArray arrData
End Sub

Function LoadArray() As Variant

    Dim wks     As Worksheet
    Dim lCtr    As Long
    Dim lItr    As Long

    Dim arrData '~~> [,]
    Dim arrSheets() '~~> ["SheetName", Data[]]

    lCtr = ThisWorkbook.Worksheets.Count

    '/ Resize array for each sheet. Tranposing jagged array is not starightforward
    '/ so keep the rows fixed. 1--> Sheet name. 2--> data array.
    ReDim Preserve arrSheets(1 To lCtr, 1 To 2)

    '/ Loop through all sheets
    For Each wks In ThisWorkbook.Worksheets
        '/ Read all the data on the sheet
        arrData = wks.UsedRange

        lItr = lItr + 1
        '/Add data in sheets array
        arrSheets(lItr, 1) = wks.Name '~~> Sheet Name
        arrSheets(lItr, 2) = arrData  '~~> Data array
    Next

    LoadArray = arrSheets

End Function

Sub PrintArray(arrSheets)

    Dim arrData
    Dim lSheetCtr       As Long
    Dim lColCtr         As Long
    Dim lRowCtr         As Long

    '/ Print data from sheets array '~~> ["SheetName", Data[]]
    For lSheetCtr = LBound(arrSheets) To UBound(arrSheets)
        '/ print sheet names
        Debug.Print "~~> Sheet Name :: " & arrSheets(lSheetCtr, 1)

        '/Extract inner array
        arrData = arrSheets(lSheetCtr, 2)

        '/ Check, if there is any data to print?
        If Not IsEmpty(arrData) Then
            Debug.Print "Data:: "

            '/ Iterate data array and print values.
            For lRowCtr = LBound(arrData) To UBound(arrData)
                For lColCtr = LBound(arrData, 2) To UBound(arrData, 2)
                    Debug.Print "Row :" & lRowCtr & " Col :" & lColCtr & " Value :" & arrData(lRowCtr, lColCtr)
                Next
            Next
        Else
            Debug.Print "NO Data"
        End If
    Next

End Sub
...