Существует "База" на листе 2. Задача очистить эту базу от всех красот. и преобразовать ее в "Умную таблицу" для последующей обработки. (База фильтруется по полю Подразделение, и затем рассылается по подразделениям, каждому свой кусок таблицы, но это уже реализовано) Пример во вложении справляется с задачей очистки таблицы, с одним но: Типы данных ячеек тоже очищаются, и , как следствие, дата преобразуется в число, и конечный пользователь уже видит не то, что хотелось бы. Проблема усугубляется тем, что столбцов в таблице может быть сколько угодно, и любые столбцы могут быть датой. О таблице я знаю только номер столбца, который содержит номер Подразделения, все остальное произвольно.
Подскажите, пожалуйста, как правильно очистить форматы таблицы Excel с сохранением типов данных столбцов?
Скрытый текст
Код
Sub Кнопка1_Щелчок()
Dim iLastRow As Long
Dim iLastCol As Long
Dim BaseRange As Range
Dim wsList2 As Worksheet
Dim obj As ListObject
Dim s As String
'Dim iStyle As Style
Application.ScreenUpdating = False
Set wsList2 = ThisWorkbook.Sheets("Лист2")
' Преобразуем все "умные таблицы на листе "Базе" в обычный диапазон
On Error Resume Next
For Each obj In wsList2.ListObjects
obj.Unlist '
Next obj
On Error GoTo 0
' Определяем размер таблицы
iLastCol = wsList2.Cells(1, Columns.Count).End(xlToLeft).Column
iLastRow = wsList2.Cells(Rows.Count, 1).End(xlUp).Row
Set BaseRange = wsList2.Range(wsList2.Cells(1, 1), wsList2.Cells(iLastRow, iLastCol))
' очищаем старые форматы
BaseRange.ClearFormats 'очистить все форматы
' Преобразуем диапазон в "Умную таблицу"
On Error Resume Next
wsList2.ListObjects.Add(xlSrcRange, BaseRange, , xlYes).Name = "База"
wsList2.ListObjects("База").TableStyle = "TableStyleLight9"
On Error GoTo 0
Application.ScreenUpdating = True
End Sub
перед вызовом BaseRange.ClearFormats пробежаться в цикле по столбцам, запомнить числовой формат каждого во временный массив, очистить форматы (как есть), снова пробежаться в таком же цикле - и восстановить числовые форматы из массива. после этого массив можно уничтожить.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Это первое что пришло в голову, так и сделаю если не найду другого решения, но может есть какое то другое решение попроще, какой-то другой способ очистки не затрагивающий числовые форматы? На самом деле этот вариант может и не сработать: если пользователь вставит "Умную таблицу", то заголовок может оказаться текстовым, а тело таблицы числовым. В моем файле пример такого столбца - "Номер счета"
Прочитал. Файл до этого не смотрел. С "умными" таблицами сам раньше не работал. Пришлось вникать буквально на днях. Пока пришёл к выводу, что проблем гораздо больше, чем плюсов. Но, конечно, если пользователи могут отформатировать диапазон как "умную" - то придётся учитывать и этот случай. Как вариант - смотреть формат не в первой ячейке каждого столбца, а во второй.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
ikki пишет: С "умными" таблицами сам раньше не работал... Пока пришёл к выводу, что проблем гораздо больше, чем плюсов.
Я тоже пришел к такому же выводу, у меня весь код изобилует затычками, где я перехожу на обычный Range, просто чтобы хоть как то работало, а потом после того как в инете найду решение, переписываю кусок кода на "правильный". Но надеюсь, что когда освою умные таблицы до конца, то все таки будет проще писать правильный код.
А, нет. Ещё одна идея возникла. Именно на уровне идеи. Можно попробовать поработать со стилями. Создать стиль с нужным числовым форматом и "стандартными" прочими свойствами (цвет-шрифт-заливка-рамки). Включить в нём все галочки.
А потом просто применить к соответствующему диапазону соответствующий стиль. Но, опять же, пробегаться по столбцам и проверять - какой там числовой формат уже есть, всё равно придётся.
фрилансер Excel, VBA - контакты в профиле "Совершенствоваться не обязательно. Выживание — дело добровольное." Э.Деминг
Хорошая идея Но у меня была еще одна, правда моих знаний не достаточно чтобы ее довести до ума. это использование стандартного стиля: ThisWorkbook.Styles("Normal" Как то так:
Скрытый текст
Код
Set iStyle = ThisWorkbook.Styles("Normal")
With BaseRange
.Borders(xlDiagonalDown).LineStyle = xlNone
.Borders(xlDiagonalUp).LineStyle = xlNone
.Interior.Pattern = xlNone
.Interior.ColorIndex = iStyle.Interior.ColorIndex
With Font
.Name = iStyle.Font.Name
.ColorIndex = iStyle.Font.ColorIndex
.Size = iStyle.Font.Size
.FontStyle = "normal"
.FontStyle = "normal"
.Strikethrough = iStyle.Font.Strikethrough
.Bold = iStyle.Font.Bold
.Name = iStyle.Font.Name
.Underline = iStyle.Font.Underline
End With
End With
но установкой шрифта по умолчанию есть некоторые проблемы
Здрасьте. Я дико извиняюсь. Я не волшебник, я только учусь... А есть ли возможность выйти из некогда сделанной "умной таблицы" в обыкновенную. Желательно без последствий. Спасибо
Умные люди — это те, которые работают с людьми умнее их самих. (С)Р.Кийосаки
Спасибо JayBhagavan! Все так просто. Да дело-то вобщем-то не в файле, а в том как из "умной" таблицы происходит обратный процесс преобразования в диапазон. Теперь я тоже это знаю. Спасибо
Умные люди — это те, которые работают с людьми умнее их самих. (С)Р.Кийосаки
Только вот непонятно, Ronin71, какое отношение Ваш вопрос к теме-то имеет? Да, обсуждается работа с умной таблицей. Но больше с созданием, чем с удалением. Учитесь различать вопросы и не задавать вопросы в первой попавшейся теме, где встретили упоминание чего-то, что Вас тоже интересует. Спасибо.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Прошу прощения The_Prist, но ради одного мааааленького вопросика создавать новую тему?... А так, мимо ходом спросил у профи, получил исчерпывающий ответ, и отошел... Если мой вопросик портит всю картину, то удалите его из темы. Еще раз прошу меня простить. Всем хорошего настроения
Умные люди — это те, которые работают с людьми умнее их самих. (С)Р.Кийосаки