Как предотвратить форматирование таблицы Excel от перезаписи существующего форматирования диапазона в VBA? - PullRequest
2 голосов
/ 24 января 2020

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

Dim FLF As Worksheet
Set FLF = Workbook("My Workbook").Sheets("FLF")

Dim x As Long
Dim lng As Long

With FLF
FLF.Activate

.ListObjects("Table1").Resize Range("$A$6:$K$7")

lng = .Cells(.Rows.count, "D").End(xlUp).Row

.Range("E7:G" & lng).NumberFormat = "0.00%"

.ListObjects("Table1").Resize Range("$A$6:$K$" & lng)

For x = 7 To lng
    If .Range("A" & x).Interior.ColorIndex = 46 Then
        TopPercent = .Range("K" & x).Value
        Do
            x = x + 1
            .Range("K" & x) = TopPercent * .Range("F" & x).Value
            .Range("K" & x).Font.FontStyle = "Italic"
        Loop While .Range("A" & x + 1).Interior.ColorIndex = 36
    End If
Next x

1 Ответ

1 голос
/ 25 января 2020

Я пытался воссоздать то, что вы описываете. Я думаю, что я неправильно понимаю, что происходит.

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

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

'I don't know how to Dim this in one line, sorry
Dim ColorIndexArray()
ReDim ColorIndexArray(ThisWorkbook.Sheets("FLF").Cells(ThisWorkbook.Sheets("FLF").Rows.Count, "A").End(xlUp).Row)

For i = 1 To ThisWorkbook.Sheets("FLF").Cells(ThisWorkbook.Sheets("FLF").Rows.Count, "A").End(xlUp).Row
    ColorIndexArray(i) = ThisWorkbook.Sheets("FLF").Range("A" & i).Interior.ColorIndex
Next

'Do your stuff

For i = 1 To ThisWorkbook.Sheets("FLF").Cells(ThisWorkbook.Sheets("FLF").Rows.Count, "A").End(xlUp).Row
    ThisWorkbook.Sheets("FLF").Range("A" & i).Interior.ColorIndex = ColorIndexArray(i)
Next

Редактировать: я попытался загрузить все индексы в массив сразу и потерпел неудачу, поэтому l oop. Кроме того, если у вас есть десятки или сотни тысяч строк, и у вас уже есть массив, вы могли бы вместо этого выполнять его вычисления, чтобы ускорить процесс? Но если это всего лишь пара строк, это не имеет значения.

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