В коде одной из книг использую обращение к ячейкам столбцов.
Обнаружил неприятный момент. Если столбцы, к которым происходит обращение (Range("B2").Value и отдельно к Range("B3").Value)- скрываю через VBA, то участок кода, который ссылается на ячейки скрытых столбцов - не выполняется корректно.
Это действительно в эксель так? И как можно выкрутиться?
В коде одной из книг использую обращение к ячейкам столбцов.
Обнаружил неприятный момент. Если столбцы, к которым происходит обращение (Range("B2").Value и отдельно к Range("B3").Value)- скрываю через VBA, то участок кода, который ссылается на ячейки скрытых столбцов - не выполняется корректно.
Это действительно в эксель так? И как можно выкрутиться?w00t
Нет возможности показать, к сожалению. Много кода и других данных, попробую поковырять еще.
Попробую еще проинспектировать весь код. И только в одном случае не работает: 0. Столбцы B:E - в них данные, на которые ссылается код, при отработке на изменение листа; 1. Устанавливаю Columns("B:E").ColumnWidth = 0 или Columns("B:E").EntireColum.Hidden = True 2. Установлен автофильтр и стоит фильтр по какому то значению.
В таком случае меняю данные на листе и код просто не выполняется. Но если автофильтра нет - то все ок.
PS: Columns("B:E").ColumnWidth = 0.1 - так работает все, потому что не скрывается, только что визуально не красиво... Ладно, буду ковырять.
Нет возможности показать, к сожалению. Много кода и других данных, попробую поковырять еще.
Попробую еще проинспектировать весь код. И только в одном случае не работает: 0. Столбцы B:E - в них данные, на которые ссылается код, при отработке на изменение листа; 1. Устанавливаю Columns("B:E").ColumnWidth = 0 или Columns("B:E").EntireColum.Hidden = True 2. Установлен автофильтр и стоит фильтр по какому то значению.
В таком случае меняю данные на листе и код просто не выполняется. Но если автофильтра нет - то все ок.
PS: Columns("B:E").ColumnWidth = 0.1 - так работает все, потому что не скрывается, только что визуально не красиво... Ладно, буду ковырять.w00t
Предположу, что причина в скрытых строках, которые скрывает атофильтр. Автофильтр скрывает строки и макрос неправильно определяет последнюю строку, в результате Ваши данные оказываются за пределами определенного макросом диапазона. Наверное, у Вас в макросе последняя строка определяется с помощью "End(xlUp)", который не работает со скрытыми строками. Например, это может выглядеть так: [vba]
Код
Sub Макрос1() Dim lr As Long lr = Cells(Rows.Count, "B").End(xlUp).Row End Sub
[/vba] Для определения последней строки используйте что-нибудь другое. Например, можно использовать метод "Find" с параметром "LookIn:=xlFormulas" (этот параметр позволяет искать в скрытых строках). Например, такой код: [vba]
Код
Sub Макрос2() Dim lr As Long lr = Columns("B").Find(What:="*", LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , SearchFormat:=False).Row End Sub
[/vba]
Предположу, что причина в скрытых строках, которые скрывает атофильтр. Автофильтр скрывает строки и макрос неправильно определяет последнюю строку, в результате Ваши данные оказываются за пределами определенного макросом диапазона. Наверное, у Вас в макросе последняя строка определяется с помощью "End(xlUp)", который не работает со скрытыми строками. Например, это может выглядеть так: [vba]
Код
Sub Макрос1() Dim lr As Long lr = Cells(Rows.Count, "B").End(xlUp).Row End Sub
[/vba] Для определения последней строки используйте что-нибудь другое. Например, можно использовать метод "Find" с параметром "LookIn:=xlFormulas" (этот параметр позволяет искать в скрытых строках). Например, такой код: [vba]
Код
Sub Макрос2() Dim lr As Long lr = Columns("B").Find(What:="*", LookIn:=xlFormulas, LookAt:= _ xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase:=False _ , SearchFormat:=False).Row End Sub
Вышло правда, монстрообразно по коду (просто столбики скрываются и открываются в зависимости от юзера). Потому сделал пока что в "одну сторону" - убрал границы. Если другой юзер с файликом будет работать - то в обратную сторону придется сделать - восстановить границы))
И после удаления границ выделение остается диапазона.
Но это лучше гораздо, чем раньше было.
[vba]
Код
Sub Macro1() Columns("B:D").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = 0 .Weight = xlThin End With Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
[/vba]
Необычно, забыл про такое решение, спасибо.
Вышло правда, монстрообразно по коду (просто столбики скрываются и открываются в зависимости от юзера). Потому сделал пока что в "одну сторону" - убрал границы. Если другой юзер с файликом будет работать - то в обратную сторону придется сделать - восстановить границы))
И после удаления границ выделение остается диапазона.
Но это лучше гораздо, чем раньше было.
[vba]
Код
Sub Macro1() Columns("B:D").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop).LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ThemeColor = 1 .TintAndShade = 0 .Weight = xlThin End With Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End Sub
Зря красите границы у ВСЕГО столбца. И красит долго, и потом тормозить будет. Красьте только у нужного диапазона. Можно добавить еще строк 40-50 снизу. Или просто лишние строки снизу скрывайте. Примерно вот так [vba]
Код
Sub Macro1() Application.ScreenUpdating = 0 Range("B1:D25").Borders(xlEdgeLeft).ThemeColor = 1 Range("B1:D25").Borders(xlInsideVertical).ThemeColor = 1 Range("A26:A" & Rows.Count).RowHeight = 0'скрытие снизу, не обязательно End Sub
[/vba]
Зря красите границы у ВСЕГО столбца. И красит долго, и потом тормозить будет. Красьте только у нужного диапазона. Можно добавить еще строк 40-50 снизу. Или просто лишние строки снизу скрывайте. Примерно вот так [vba]
Код
Sub Macro1() Application.ScreenUpdating = 0 Range("B1:D25").Borders(xlEdgeLeft).ThemeColor = 1 Range("B1:D25").Borders(xlInsideVertical).ThemeColor = 1 Range("A26:A" & Rows.Count).RowHeight = 0'скрытие снизу, не обязательно End Sub
[/vba] Если не сильно надоел и будет желание ответить еще, то последний вопрос. Вернуть обратно прежние границы как лучше (не откатить, а заново установить, если даже их небыло ранее)? [vba]
Код
.ThemeColor = 3
[/vba] их устанавливает, но немного другого цвета.
[/vba] Если не сильно надоел и будет желание ответить еще, то последний вопрос. Вернуть обратно прежние границы как лучше (не откатить, а заново установить, если даже их небыло ранее)? [vba]
Код
.ThemeColor = 3
[/vba] их устанавливает, но немного другого цвета.w00t