Как уменьшить количество повторений для форматирования многих таблиц? - PullRequest
2 голосов
/ 17 октября 2019

У меня есть хорошая таблица с кодом VBA, который заполняет ее и форматирует автоматически (я работал над этим довольно давно).

Это очень хорошо, быстро, хорошо работает, но когда я смотрю на код, появляются десятки и десятки строк, касающихся форматирования ячеек ...

Есть ли способоптимизировать это, чтобы сделать его более восприимчивым к человеческому глазу / мозгу?

Я даю вам посмотреть:

Application.DisplayAlerts = False                                           'Deactivate the alerts in case the cell is filled
    With Range("A" & PosStartLine + (TPICode * 3) - 3 & ":A" & PosStartLine + (TPICode * 3) - 1)
        .Select
        .Value = FullTPICode
        .Interior.Color = RGB(220, 230, 241)
        .HorizontalAlignment = xlCenter
        .VerticalAlignment = xlCenter
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
        .Font.Bold = True
        .Merge       'Merging the 3 cells
        .EntireRow.Borders(xlEdgeTop).Weight = xlMedium
        .EntireRow.Borders(xlEdgeBottom).Weight = xlMedium
    End With
    Application.DisplayAlerts = True

    'Writes down the details on the next column (as we're there... why not?)
    With Worksheets(RealData).Range("B" & PosStartLine + (TPICode * 3) - 3)
        .Select
        .Value = "Nb cars done"
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(216, 228, 188)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With ActiveCell.Offset(1, 0)
        .Value = "Nb cars left"
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(217, 217, 217)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With ActiveCell.Offset(2, 0)
        .Value = "Price"
        .HorizontalAlignment = xlLeft
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(252, 213, 180)
        .Borders.LineStyle = xlContinuous
        .EntireColumn.AutoFit
        .Font.Size = 11
    End With

Где-то еще:

    Worksheets(RealDataReg).Activate
    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3 & ":" & _
    Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3)
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(235, 241, 222)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 2 & ":" & _
    Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 2)
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(242, 242, 242)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 1 & ":" & _
    Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 1)
        .HorizontalAlignment = xlRight
        .VerticalAlignment = xlCenter
        .Interior.Color = RGB(253, 233, 217)
        .Borders.LineStyle = xlContinuous
        .Font.Size = 11
    End With

'Putting the calculation in the last cell of the table
    With Worksheets(RealDataReg)
            .Cells(PosStartLine + (TPICode * 3) - 3, PosStartColumn + 61).Formula = "=SUM(" & _
            .Cells(PosStartLine + (TPICode * 3) - 3, PosStartColumn + 1).Address(False, False) & ":" & _
            .Cells(PosStartLine + (TPICode * 3) - 3, Split(Cells(1, PosStartColumn + 60).Address, "$")(1)).Address(False, False) & ")"
    End With
'Formatting the cells with the calculations
    With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3)
            .HorizontalAlignment = xlRight
            .VerticalAlignment = xlCenter
            .Interior.Color = RGB(216, 228, 188)
            .Borders.LineStyle = xlContinuous
            .Font.Size = 11
            .Select
    End With

И так далее,и так далее ...

Кто-нибудь знает умный способ сделать все это форматирование более эффективным? nerer? Как вы, наверное, видели, форматирование каждый раз действительно похоже, но появляются небольшие различия (цвет, границы, диапазоны и т. д.)

Я думал о создании функции, которую я буду вызывать, но мне придется предоставить ей все ту же информацию, так что, думаю, это совершенно бессмысленно ... Например, еслиЯ беру этот блок форматирования:

With Worksheets(RealDataReg).Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3 & ":" & _
Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3)
    .HorizontalAlignment = xlRight
    .VerticalAlignment = xlCenter
    .Interior.Color = RGB(235, 241, 222)
    .Borders.LineStyle = xlContinuous
    .Font.Size = 11
End With

Это могло бы выглядеть примерно так:

Call FormatFunction( Worksheets(RealDataReg), Range(Split(Cells(1, PosStartColumn).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3 & ":" & _
Split(Cells(1, PosStartColumn + 61).Address, "$")(1) & PosStartLine + (TPICode * 3) - 3), xlRight, xlCenter, (235, 241, 222), xlContinuous, 11))

Но, конечно, были бы некоторые параметры, которые не нужны в некоторых случаях, поэтому яПри передаче параметров придется «стремиться к хорошим»проще сделать это с помощью стандартного форматирования VBA, я думаю ...

Я думаю, что есть стандартный умный способ сделать это, но я не смог ничего найти в Google (он просто дает мне результаты накак отформатировать таблицы, но я уже знаю, что: D)

Спасибо заранее!

1 Ответ

1 голос
/ 17 октября 2019

Может быть, кто-то докажет, что я неправ (было бы замечательно, если бы они это сделали), но я не верю, что есть какой-либо "правильный" ответ на ваш вопрос.

Возможно, самый простой и наименее избыточный способ продвижения впередбудет начинаться с определения двух или более форматов, которые часто появляются вместе. Затем определяем пользовательский тип данных для передачи форматов с одной переменной.

В качестве альтернативы, вы можете создать подпрограмму, которая устанавливает те же форматы, и вы передаете форматируемый объект в качестве параметра. Хотя это не то, что я действительно рекомендую, слишком много работы, мало пользы и немного грязно.

Позднее редактирование: вы можете попробовать добавить скрытый шаблонный лист для копирования и вставки форматов, вместо того, чтобы переделывать их каждыйвремя.

Мой личный выбор на самом деле немного сложнее, но я чувствую, что он более элегантный, и его легче поддерживать и модифицировать. Короче говоря: константы и перечислители суммируются в типы данных, используемые для категорий, которые устанавливаются классом.

Например, у меня есть состояния кнопок, которые могут быть: вкл, выкл, бездействие или загрузка. Каждое состояние существенно отличается от другого. Я начну с определения всех возможных базовых атрибутов как констант или перечислителей (таких как цвет, размер шрифта и т. Д.). Затем я определяю тип данных атрибута для их хранения. Этот тип данных применим к каждой кнопке (например, цвет спины, цвет переднего плана и т. Д.). Я сворачиваю эти типы данных на уровень другого типа данных, который представляет определенное состояние (вкл, выкл и т. Д.). Я создаю переменную этого типа для каждого состояния. Типы данных заполняются, когда приложение инициализируется, и я использую класс, чтобы аккуратно собрать все вместе.

Вся эта работа, выполняемая при настройке, не зря. Любое количество форматов может быть изменено в одной строке без повторения, обеспечивая при этом одно изменение в одном месте яблок для каждого объекта. Это позволяет получить более чистый самодокументируемый код, который легко писать и поддерживать, а также вносит единообразие в объекты всего проекта.

Например, при использовании в качестве свойства:

myButton.State = isOn

Или метод:

SetButtonState myButton, isDisabled, "Not Available"

Настройка не совсем тривиальна, но это не сложно, и я думаю, что это стоит усилий.

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

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