Динамические вычисления путем ссылки на заголовок таблицы для Excel - PullRequest
0 голосов
/ 04 февраля 2019

Я довольно плохо знаком с функцией Macro в Excel.

Я работаю с таблицей с динамическим числом столбцов, и хотя некоторые вычисления я могу выполнить вручную в Excel, я 'Я пытаюсь выяснить, как автоматизировать это в VBA.

Количество столбцов между столбцом G (выполнено) и P (класс общего%) может отличаться, но расчеты будут примерно одинаковыми.

Я надеюсь использовать Таблицу [Заголовок], чтобы указать, где вычислять, возможно, какой столбец находится справа от «Достигнуто» и слева от «Всего% Класс»

Всего% Класс:
= SUM всех классов, кроме Unclassed

Всего% в старшем классе:
= SUM Class_1, Class_2, Class_2F и Class_2P вместе

Некоторые из этих классов не всегда появляются в данных, если кто-то из них отсутствует, он вернет ошибку #REF для «Total% Class» и «Total% at Higher Class», поэтому я надеюсь обойти это.

Вот скриншот данных, показывая все классы.

1 Ответ

0 голосов
/ 04 февраля 2019

В этом макросе предполагается, что ваши данные являются структурированной таблицей Excel (если это не так, сделайте резервную копию рабочей книги и рассмотрите возможность выбора данных и нажатия клавиш «Ctrl» + «T», чтобы превратить их в одну)

Настройка разделавнутри кода:

Sub DoCalcs()

    ' Declare objects variables
    Dim excelTable As ListObject

    ' Declare other variables
    Dim sheetName As String
    Dim excelTableName As String

    Dim achievedColHeader As String
    Dim achievedColNum As Integer
    Dim calculationColHeader As String
    Dim calculationColNum As Integer
    Dim firstColHeader As String
    Dim lastColHeader As String

    '>>>>>>>>Customize to fit your needs
    sheetName = "Sheet1"
    excelTableName = "Table1"

    achievedColHeader = "Achieved"
    calculationColHeader = "Total % Class"
    '<<<<<<<<

    ' Initialize the listobject
    Set excelTable = ThisWorkbook.Worksheets(sheetName).ListObjects(excelTableName)

    ' Get the column number of the first column
    achievedColNum = excelTable.HeaderRowRange.Find(achievedColHeader).Column

    ' Get the column number of the calculation column
    calculationColNum = excelTable.HeaderRowRange.Find(calculationColHeader).Column

    ' Get first and last columns headers of sum's range
    firstColHeader = excelTable.HeaderRowRange.Columns(achievedColNum + 1)
    lastColHeader = excelTable.HeaderRowRange.Columns(calculationColNum - 1)

    ' Set the calculation formula in cell
    excelTable.DataBodyRange.Columns(calculationColNum).Formula = "=SUM(Table1[@[" & firstColHeader & "]:[" & lastColHeader & "]])"


End Sub
...