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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.04.2013, 14:03   #1
darthraziel
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 24
По умолчанию Выборка используемых ячеек на листе

Доброго времени суток!

Немножко зашел в тупичок со вроде бы несложным макросом.

Задача стоит следующая: необходимо, чтобы из определенного диапазона выбирались все ячейки, которые содержат какое-либо значение. Однако есть два условия, которые хотелось бы выполнить при этом, и вот тут у меня возникли затруднения.

Необходимо, чтобы этот процесс:
1) не учитывал скрытые листы, строки и столбцы (это важно)
2) способен был работать с листами, которые закрыты для изменений (это не столь важно, но желательно).

Буду благодарен любому совету. Код макроса прилагается.

Код:
Private Function SpecialCells_TypeConstants(ra As Range) As Range

    On Error Resume Next: en& = Err.Number

        Dim cell As Range
        For Each cell In Intersect(ra, ra.Worksheet.UsedRange).Cells
             If Trim(cell.Value) <> "" Then    
                If SpecialCells_TypeConstants Is Nothing Then
                     Set SpecialCells_TypeConstants = cell
                 Else
                     Set SpecialCells_TypeConstants = Union(SpecialCells_TypeConstants, cell)
                 End If
             End If
         Next cell

     If en& = 0 Then Err.Clear
     
End Function

Последний раз редактировалось darthraziel; 15.04.2013 в 14:48.
darthraziel вне форума Ответить с цитированием
Старый 15.04.2013, 14:13   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

darthraziel, не ответ на ваш вопрос, просто замечание по коду.

Эту команду нужно поместить в другое место:
Код:
en& = Err.Number
В вашем случае эта команда ничего не делает.


Эта команда без смысла, т.к. в объекте "Err" и так чисто:
Код:
If en& = 0 Then Err.Clear
Скрипт вне форума Ответить с цитированием
Старый 15.04.2013, 14:30   #3
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Макрос взят отсюда:
http://excelvba.ru/code/SpecialCells

Насчёт en& = Err.Number и If en& = 0 Then Err.Clear — не обращайте внимания,
этот кусок кода я взял из своей программы, где это важно
(если до запуска процедуры была ошибка - её нельзя сбрасывать, если во время процедуры произошла ошибка - её сбрасываем)

Вообще, макрос предназначен прежде всего для работы с защищёнными листами,
и к задаче, озвученной darthraziel, мало пригоден

Цитата:
не учитывал скрытые листы
вообще-то, макрос работает только с одним листом.
Считать в диапазон (объект типа RANGE) ячейки с разных листов не получится.
EducatedFool вне форума Ответить с цитированием
Старый 15.04.2013, 14:46   #4
darthraziel
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 24
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Макрос взят отсюда:
http://excelvba.ru/code/SpecialCells
Абсолютно так, я бы сразу поставил ссылку на источник, но, честно говоря, уже и забыл, откуда какой кусок брал.
Спасибо за ссылку, добавлю себе в избранное.

Касаемо скрытых листов - это я заговорился немножко. У меня этот блок просто используется в основном макросе, где выписываются адреса всех таких ячеек для целой книги. И вот там бы неплохо как-то проигнорировать скрытые листы.

Код:
Public Sub CompareFiles()

Dim ViewRng As Range, FilledRng As Range

n = 8

On Error Resume Next: en& = Err.Number

    For sheet = 2 To ActiveWorkbook.Sheets.Count
    
        Worksheets(sheet).Activate
        Set ViewRng = Range("a1:zz1000")
        Set FilledRng = SpecialCells_TypeConstants(ViewRng) 
        If Not FilledRng Is Nothing Then
        For Each cell In FilledRng.Cells
            
            Worksheets(1).Cells(n, 1).Value = Worksheets(sheet).Name
            Worksheets(1).Cells(n, 2).Value = cell.Address
            n = n + 1
            
        Next cell
        End If
    Next sheet
    
If en& = 0 Then Err.Clear

Worksheets(1).Activate

End Sub
darthraziel вне форума Ответить с цитированием
Старый 15.04.2013, 18:08   #5
darthraziel
Пользователь
 
Регистрация: 21.02.2012
Сообщений: 24
По умолчанию

Похоже, я немного поторопился с созданием топика, прошу прощения.

После небольшого перерыва все проблемы были решены, большое спасибо откликнувшимся.
darthraziel вне форума Ответить с цитированием
Ответ


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

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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск значений на другом листе из разных ячеек и перенос их на первый лист madex Microsoft Office Excel 14 26.10.2012 14:37
Дублирование ячеек, диапазона ячеек на новом листе ukrman Microsoft Office Excel 2 03.02.2012 01:06
Форматирование ячеек шрифта с образца на др листе в выпад списке формы Uralmaster Microsoft Office Excel 0 02.03.2011 22:37
Выборка сумм по месяцу на отдельном листе (Excel 2003) Svetlana_zel Microsoft Office Excel 3 27.05.2010 17:26
Выборка данных в листе А по параметру 1 из листа Б Nekota Microsoft Office Excel 13 17.02.2010 18:26