Новости:

Теперь на форум можно залогиниться / зарегистрироваться с помощью ВКонтакте. Уже существующие пользователи могут связать свою учетную запись с аккаунтом ВКонтакте одним кликом в профиле пользователя http://forum.msexcel.ru/index.php?action=profile;area=account

Главное меню

Автоматическое скрытие пустых столбцов в таблице, возможно ли?

Автор Олег*, 05.10.2012, 14:13

« назад - далее »

Олег*

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

В связи с этим возник вопрос: можно ли установить какое-нибудь свойство таблицы, чтобы полностью пустые столбцы автоматически скрывались?

Если такого средства нет, то можно ли как-нибудь сделать это с помощью макроса?

А если это тоже невозможно, то как можно так настроить спарклайны, чтобы они полностью игнорировали все пустые ячейки? На самом деле, этот вопрос надо было бы поставить первым, поскольку при наличие такой возможности все остальные заданные в этой теме вопросы сами собой отпадают.

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

Prist

Не подойдет такой вариант:
выделяем Спарклайны-вкладка Работа со спарклайнами-Изменить данные-Скрытые и пустые ячейки-Показывать как...Линию

Если не подойдет - думаю, только скрытие столбцов(макросом или вручную).
А вот примерный текст кода для скрытия столбцов:
Sub Hide_Cols()
Dim rCell As Range, lLastRow As Long, lLastCol As Long, lCol As Long
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
lLastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Application.ScreenUpdating = 0
For lCol = 2 To lLastCol - 1
    Columns(lCol).Hidden = (Range(Cells(2, lCol), Cells(lLastRow, lCol)).Text = "")
Next lCol
Application.ScreenUpdating = 1
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453

_Boroda_

Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

Олег*

Цитата: _Boroda_ от 06.10.2012, 03:02
Или может еще вот так понравится?

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


Цитата: Prist от 05.10.2012, 14:33
Не подойдет такой вариант:
выделяем Спарклайны-вкладка Работа со спарклайнами-Изменить данные-Скрытые и пустые ячейки-Показывать как...Линию
Да я там вроде бы все варианты перепробовал перед тем, как эту тему на форуме поднять. Вроде бы все как-то не очень наглядно получалось.


Цитата: Prist от 05.10.2012, 14:33
Если не подойдет - думаю, только скрытие столбцов(макросом или вручную).
А вот примерный текст кода для скрытия столбцов:
Sub Hide_Cols()
Dim rCell As Range, lLastRow As Long, lLastCol As Long, lCol As Long
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
lLastCol = Cells(1, Columns.Count).End(xlToLeft).Column
Application.ScreenUpdating = 0
For lCol = 2 To lLastCol - 1
   Columns(lCol).Hidden = (Range(Cells(2, lCol), Cells(lLastRow, lCol)).Text = "")
Next lCol
Application.ScreenUpdating = 1
End Sub



А вот это подошло идеально! Спасибо большое!

Но только проблема возникла. Сегодня целый день над ней тружусь, но пока не получается справиться. Дело в том, что когда я ваш код добавил в ту книгу, которую выложил на форуме, все заработала на ура. А вот когда стал пытаться "вмонтировать" этот же самый код в свой "большой проект" :) , то  столкнулся с тем, что сначала он у меня скрывал столбцы совсем не на том листе, на котором хотелось бы :), а теперь (после нескольких часов упорного поиска причины затруднений) стал скрывать столбцы на том листе, на котором надо, но совсем не те, которые надо :)  Одним словом продолжаю ставить брекпойнты и занимаюсь отловом багов :)
Муж это единственный зарегенный юзер, а все остальные это хакеры :)

Prist

Олег, полагаю, что имеет смысл принудительно указать имя листа, на котором скрывать столбцы. Т.к., скорее всего, у Вас есть еще макросы в книге, которые выполняют свои задачи и конфликтуют с данным кодом.
Sub Hide_Cols()
    Dim rCell As Range, lLastRow As Long, lLastCol As Long, lCol As Long
    With Sheets("Имя листа")
        lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        lLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        Application.ScreenUpdating = 0
        For lCol = 2 To lLastCol - 1
            .Columns(lCol).Hidden = (.Range(.Cells(2, lCol), .Cells(lLastRow, lCol)).Text = "")
        Next lCol
    End With
    Application.ScreenUpdating = 1
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
www.excel-vba.ru
Просто СПАСИБО [+оказать+]
Считаешь СПАСИБО мало? Яндекс.Деньги: 41001332272872; WM: R298726502453

Олег*

Цитата: Prist от 07.10.2012, 10:14
Олег, полагаю, что имеет смысл принудительно указать имя листа, на котором скрывать столбцы. Т.к., скорее всего, у Вас есть еще макросы в книге, которые выполняют свои задачи и конфликтуют с данным кодом.
Sub Hide_Cols()
    Dim rCell As Range, lLastRow As Long, lLastCol As Long, lCol As Long
    With Sheets("Имя листа")
        lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        lLastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
        Application.ScreenUpdating = 0
        For lCol = 2 To lLastCol - 1
            .Columns(lCol).Hidden = (.Range(.Cells(2, lCol), .Cells(lLastRow, lCol)).Text = "")
        Next lCol
    End With
    Application.ScreenUpdating = 1
End Sub


Идеально!
Муж это единственный зарегенный юзер, а все остальные это хакеры :)