Ссылки на массивы через словарь имен массивов для каждого цикла - PullRequest
0 голосов
/ 22 января 2020

Чтобы увеличить скорость, я переписываю этот макрос, чтобы использовать массивы вместо диапазонов.

Кажется, что передача имени словаря каждого массива с помощью Array (key) работает для инициализации каждого l oop, но тогда ссылка на словарь ключа как на массив не дает. Я также попытался повторно инициализировать ключ словаря в виде массива таким же образом, как для каждого l oop.

Есть ли лучший или более эффективный способ сделать это?

Sub test2()

Dim arr, arr_1, arr_2, arr_3, arr_4, arr_5, arr_6, arr_7, totalrng As Variant
Dim rowcount, x, rowx As Long

With Sheets("sheet1")
    rowcount = .Cells(Rows.Count, 1).End(xlUp).Row

Set arr_1 = .Range("D1:D" & rowcount)
Set arr_2 = .Range("F1:F" & rowcount)
Set arr_3 = .Range("H1:H" & rowcount)
Set arr_4 = .Range("J1:J" & rowcount)
Set arr_5 = .Range("L1:L" & rowcount)
Set arr_6 = .Range("N1:N" & rowcount)
Set arr_7 = .Range("P1:P" & rowcount)

Dim dict As Variant
    Set dict = CreateObject("scripting.dictionary")
    dict.Add Key:="arr_1", Item:=Nothing
    dict.Add Key:="arr_2", Item:=Nothing
    dict.Add Key:="arr_3", Item:=Nothing
    dict.Add Key:="arr_4", Item:=Nothing
    dict.Add Key:="arr_5", Item:=Nothing
    dict.Add Key:="arr_6", Item:=Nothing
    dict.Add Key:="arr_7", Item:=Nothing

For Each Key In dict
Debug.Print findrng
    x = 2
    For Each num In Array(Key)
        arr = Array(Key)
        .Cells(x, 22).Value = arr(1, 1)
        .Cells(x, 23).Value = arr(1, 2)
        x = x + 1
    Next num
Next Key

End With

End Sub

1 Ответ

0 голосов
/ 22 января 2020

Прежде чем предложить вам альтернативное решение, вот несколько замечаний относительно вашего существующего кода.

Объявление переменной

Со следующей декларацией ...

Dim rowcount, x, rowx As Long

... rowcount и x оба объявлены как Variant, а не Long, и rowx как Long. Чтобы объявить все переменные как Long, объявите их следующим образом ...

Dim rowcount as Long, x as Long, rowx as Long

Для каждого ключа в dict / Next

Для каждой итерации назначается ключ текстовое значение (ie. "arr_1"), а не массив. Таким образом, Array (Key) возвращает Variant, содержащий нулевой одноэлементный массив. Так, например, в первой итерации первым элементом будет текст «arr_1».

Для каждого num In Array (Key) / Next

With На каждой итерации num присваивается элемент из Array (Key). Однако, поскольку Array (Key) состоит из одного элемента, будет только одна итерация, где num будет просто присвоен текст "arr_1".

arr = Array (Key)

arr присваивается массив из одного элемента, поскольку Array (Key) возвращает массив из одного элемента. И поэтому один элемент будет получен с помощью arr (0).

Альтернативное решение

Option Explicit

Sub test()

    Dim sourceRange As Range
    Dim lastRow As Long
    With Sheets("Sheet1")
        lastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set sourceRange = .Range("D1:P" & lastRow)
    End With

    Dim dict As Object
    Set dict = CreateObject("Scripting.Dictionary")

    Dim colIndex As Long
    With sourceRange
        For colIndex = 1 To .Columns.Count Step 2
            'key is being assigned the column number
            'item is being assigned a two-dimensional (n by 1 column) array
            dict.Add Key:=.Columns(colIndex).Column, item:=.Columns(colIndex).Value
        Next colIndex
    End With

    Dim dictionaryItem As Variant
    Dim currentArray As Variant
    Dim i As Long
    For Each dictionaryItem In dict.items()
        currentArray = dictionaryItem
        For i = LBound(currentArray) To UBound(currentArray)
            Debug.Print currentArray(i, 1)
        Next i
    Next dictionaryItem

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...