Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.01.2015, 01:29   #1
jimmyyong
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 22
По умолчанию Удалить скрытые столбцы и строки из Range

Необходима функция, удаляющая скрытые строки и столбцы из диапазона( без удаления строк и столбцов с листа Книги)
В процессе работы макроса происходит удаление не только из диапазона RAN2, но и с листа Excel

Возникло 2 вопроса:
1) Как создать копию диапазона (Range) не привязанного к листу книги?
2) Передаю диапазон (RAN1) в функцию с использованием byVal а не byRef. Т.е. RAN1, в моем понимании, не должен быть связан с worksheet

Код:
Function Dellhiddens(ByVal RAN1 As Range) As Range
Dim i%, j%
Dim RAN2 As Range
Set RAN2 = RAN1

For i = RAN1.Rows.Count To 1 Step -1
If RAN1.Rows(i).Hidden = True Then RAN2.Rows(i).Delete
Next i

For j = RAN1.Columns.Count To 1 Step -1
If RAN1.Columns(j).Hidden = True Then RAN2.Columns(j).Delete
Next j

Set Dellhiddens = RAN2
  
End Function

Последний раз редактировалось jimmyyong; 17.01.2015 в 01:42.
jimmyyong вне форума Ответить с цитированием
Старый 17.01.2015, 09:57   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Функцию, принимаемую в качестве параметра диапазон и возвращающую Этот диапазон, исключая скрытые строки и столбцы, можно записать так:
Код:
Function Dellhiddens(ByVal RAN1 As Range) As Range
    Set Dellhiddens = Intersect(RAN1, Cells.SpecialCells(xlCellTypeVisible))
End Function
Функция возвратит диапазон, привязанный к активному листу. Для того, чтобы использовать полученный диапазон на любом другом листе, используйте обращение через адрес. Например, так:
Код:
Sub qq()
    Dim rng As Range: Application.ScreenUpdating = False
    Sheets(1).Activate: Set rng = Dellhiddens([B5:G20])
    Sheets(2).Activate: Range(rng.Address).Select
End Sub
Если Вы не хотите активировать требуемый лист перед выполнением функции, то добавьте в функцию 2-ой параметр - имя (номер) листа и при обращении к ячейкам используйте в коде функции ссылку на лист.
Также, следует обратить внимание, что в случае, если весь передаваемый в функцию диапазон скрыт, то функция вернет значение "Nothing". Поэтому, в примере макроса, использующего эту функцию, корректнее применять
Код:
If Not rng Is Nothing Then Range(rng.Address).Select
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 17.01.2015 в 12:00. Причина: Добавлено
SAS888 вне форума Ответить с цитированием
Старый 17.01.2015, 14:55   #3
jimmyyong
Пользователь
 
Регистрация: 17.11.2010
Сообщений: 22
По умолчанию

Спасибо огромное за ответ! Все вопросы решены!
jimmyyong вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
НЕ МОГУ УДАЛИТЬ СТОЛБЦЫ И СТРОКИ Аслан Абдрахманов Microsoft Office Excel 2 11.02.2014 08:56
Удалить нулевые строки/столбцы в матрице Student_termos Общие вопросы C/C++ 1 14.01.2013 14:20
Удалить из массива A(N,M) строки и столбцы nuklon712 Помощь студентам 3 19.12.2012 14:09
Удалить строки и продублировать столбцы j-run Общие вопросы C/C++ 1 19.11.2012 15:14
Как удалить строки и столбцы в массиве ЛесенОК Свободное общение 1 31.01.2009 18:35