Как динамически изменять части сложной функции xls в VBA - PullRequest
1 голос
/ 22 октября 2019

Я довольно новичок в VBA и надеюсь, что один из вас может помочь.

У меня довольно сложная функция xls, и мне нужно иметь возможность обновлять части этой функции, то есть размер таблицы, к которой она относится.

Справочная информация - у меня постояннорастущая таблица в скажем sheet2, в которой я использую формулы массива для компиляции некоторой информации, которая мне нужна. Поскольку эти массивы потребляют много вычислительной мощности, я создал макрос, в котором таблица преобразуется обратно в диапазон, затем выполняется куча вычислений, и она переформатируется в виде таблицы. Что я не учел, так это то, что эта перестановка таблицы перестает снабжать мой обзорный лист1 информацией из этой таблицы. Итак, что мне в основном нужно, так это изменить формулу массива в моем обзорном листе, чтобы она снова подстраивалась под размер таблицы.

Формула массива, которую мне нужно изменить, следующая:

INDEX (Операции $ O $ 20: $ O $ 77, MAX (IF (Операции $ D $ 20: $ D $ 77 = Обзор B8, IF (Операции $ C $ 20:! $ C $ 77 <= Обзор $В $ 5, IF (Операции $ K $ 20: $ K $ 77 = Обзор F8, ROW (Операции $ O $ 20:!!! $ O $ 77) -MIN (ROW (Операции $ O $ 20: $ O $ 77)) + 1))), 1)) </em>

, где строка 20 фиксирована, но таблица расширяется вниз (например, 77 будет даже расти до 5000 или около того)

Я довольнозастрял на этом и еще не генерировал много (полезного) кода.

    Sub UpdateOverview()

    Sheet2.ListObjects("Transactions").Unlist
    Dim last_row_T As Long
    last_row_T = Cells(Rows.Count, "C").End(xlUp).Row
    Sheet1.Range("H7").FormulaArray="=INDEX(Transactions!$O$20:$O$77,MAX(IF(Transactions!$D$20:$D$77=Overview!B8,IF(Transactions!$C$20:$C$77<=Overview!$B$5,IF(Transactions!$K$20:$K$77=Overview!F8,ROW(Transactions!$O$20:$O$77)-MIN(ROW(Transactions!$O$20:$O$77))+1))),1))"

    Sheet2.ListObjects.Add(xlSrcRange, Range("C19").CurrentRegion, , xlYes).Name = "Transactions"

    End Sub

Я пробовал разные версии реализации last_row_T в формуле, но это не сработало.

В конечном итогеМне нужно изменить каждую из 77 в формуле индекса в соответствии с растущим размером таблицы - так что это должно быть динамическое решение. Есть ли способ сделать это, или я где-то в nomansland?

1 Ответ

0 голосов
/ 22 октября 2019

Я предлагаю это простое исправление плюс обходной путь для ограничения в 255 символов .FormulaArray:

Dim strFormula As String, newFormula As String
strFormula = "=INDEX(Transactions!$O$20:$O$lastrow,MAX(IF(Transactions!$D$20:$D$lastrow=Overview!B8," & _
            "IF(Transactions!$C$20:$C$lastrow<=Overview!$B$5,IF(Transactions!$K$20:$K$lastrow=Overview!F8," & _
            "ROW(Transactions!$O$20:$O$lastrow)-MIN(ROW(Transactions!$O$20:$O$lastrow))+1))),1))"
newFormula = Replace(strFormula, "lastrow", CStr(last_row_T))

Sheet1.Range("H7").FormulaArray = "FunctionPlaceholder()"
Sheet1.Range("H7").Replace "FunctionPlaceholder()", newFormula

См. Этот вопрос и эту ссылку для получения дополнительной информации. информация об обходном пути.

...