VBA Array / Dictionary IF, формула и SUMIF - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь переключиться на массивы VBA с помощью одной из моих книг Excel, так как в ней есть несколько листов, которые ссылаются на лист с 50K + строками и столбцами от A до AK. Есть куча IF, SUMIF и VLookUps. Excel занимает около 10 минут, чтобы полностью рассчитать все формулы и заполнить нужные мне данные, затем еще несколько минут, чтобы сохранить то, что мне нужно, только с использованием значений и без формул.

Я новичок в VBA и только удалось преобразовать vlookups, и это сократило время обработки указанных формул до почти мгновенного. Сейчас я пытаюсь преобразовать формулы IF / SUMifs ... но по какой-то причине я просто не могу понять, как подойти к этому / найти решение онлайн.

Используя приведенный ниже код, я ' Добавляя два столбца, которые мне нужны для формулы IF, я уверен примерно на 90%, поскольку использую один и тот же (для чтения разных столбцов) для кода vlookup, который работает отлично. Так что это должно работать и для отображения словаря и массива.

'Array variable
Dim arr() As Variant
'Dictionary object
Dim dic As Object: Set dic = CreateObject("Scripting.Dictionary")


'Read data into array
With Sheets("test")
    x = .Cells(.Rows.Count, 2).End(xlUp).Row
    'Range(C2:Cx where x is last row in column C)
    arr = .Cells(2, 3).Resize(x - 1).Value
End With


'Map arr into dictionary
For x = LBound(arr, 1) To UBound(arr, 1)
    'dic(match column) = return column
    dic(arr(x, 1)) = arr(x, 3)
Next x
'Clear array contents
Erase arr


With Sheets("test")
    x = .Cells(.Rows.Count, 4).End(xlUp).Row
    'Read values from column D into array
    'Range(D2:Dx, where x is last row in column D)
    arr = .Cells(2, 4).Resize(x - 1).Value

Теперь я пытаюсь преобразовать следующую формулу =IF(ROW(A2)=1,"Vendor",IF(D2="",C2," **"&C2)) в VBA. Я предполагаю, что идеальным способом было бы использовать al oop и сохранить значения в arr, а затем вывести их в желаемый столбец, но я не могу придумать подход для этого. Я пробовал For в сочетании с IF, но безуспешно. Это то, что я попробовал безуспешно:

For x = LBound(arr, 1) To UBound(arr, 1)
If dic(arr(x, 1)) <> "" Then
arr(x, 1) = "**" & arr(x,1)

Также у меня есть набор SUMIF, которые в основном представляют собой одну и ту же формулу с различными критериями
: =SUMIFS(L:L,AE:AE,AE2,E:E,E2,AF:AF,AF2). Но для этого, за исключением отображения всего листа в массив / словарь, я понятия не имею, что делать.

Я новичок во всех VBA и на данный момент я полностью застрял. Любая помощь будет полезна :).

1 Ответ

1 голос
/ 26 февраля 2020

Вам не нужен словарь здесь. Лучше использовать 2-D Array и другой Array для вывода. Затем просто l oop и присвойте значения следующим образом:

'Read data into array
With Sheets("test")
    x = .Cells(.Rows.Count, 2).End(xlUp).Row
    'Range(C2:Cx where x is last row in column C)
    arr = .Cells(2, 3).Resize(x - 1, 2).Value   ' CHANGE: All needed columns

    ReDim OutArr(1 To UBound(arr))
    For x = 1 To UBound(arr)
        OutArr(x) = IIf(arr(x, 2) = "", " **", "") & arr(x, 1)
    Next x
    .Cells(2, 5).Resize(UBound(OutArr)).Value = OutArr  ' Change column if needed

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