Страницы: 1
RSS
Проверка на наличие данных в скрытых строках (ячейках) кодом VBA с выводом обнаруженных данных
 

Проверка на наличие данных в скрытых ячейках кодом VBA с выводом обнаруженных данных. Здравствуйте коллеги. Прошу помочь решить следующий вопрос:

Есть таблица с данными, в которой, к сожалению, встречаются скрытые строки. Смог сообразить макрос - через метод SpecialCells. Работает так - если в таблице есть скрытые строки, то просто выводится сообщение. Однако, если в скрытых строках ничего нет - меня они в общем не интересует, хуже когда там какие то данные все таки спрятаны, и это может ошибочно повлиять на итоговый результат вычислений, из-за этого нужно раскрывать и проверять, это очень не удобно. Знаний не хватает настроить макрос, чтобы он при наличии скрытых строк проверял бы их на присутствие каких -либо данных. В Экселе есть функция  ISBLANK, не знаю может ли она выполняться в VBA или это чисто экселевская функция,  если да, то как её настроить на проверку именно по скрытым строкам? Вот тело моего макроса

Код
Sub macros()
Dim A As Integer
Dim B As Integer
Dim Diapazon As Range


A = Range("N1:N27").SpecialCells(xlVisible).Count
B = Range("N1:N27").Count

If A <> B Then
    MsgBox "Обнаружены скрытые строки"
    Else
    MsgBox "Cкрытых строк нет"
End If
    'Тут дальше только логика процесса, потому как правильно сделать код не могу.
        'If ISBLANK Diapazon.Rows.Hidden - если в скрытых строках ничего нет (пусто), то выводим сообщение такое
        'MsgBox "В скрытых строках данных нет"
        'Else Иначе (то есть, если хоть какие то данные есть) выводим такое сообщение
        'Msgbox "В скрытых строках обнаружены данные.
        'Строка 3:----'Федоров'--'30''40'-------"
        'End If
End Sub

Коллеги, если с вашей помощью удастся научить макрос хотя бы сигнализировать о том, что в скрытых строках есть данных и на этом будет огромнейшее СПАСИБО. Но признаюсь честно, что очень хотелось чтобы в Msgbox'е с предупреждением отражались бы обнаруженные данные. По типу Строка 3: ----'Федоров'--'30''40'-------". В скрытых строках с обнаруженными данными интересует диапазон ячеек со столбца "B" по "Q" и если проверяемая скрытая ячейка не содержит ничего тогда в сообщении маркируется " -", обнаруженные данные заключаются в одинарные кавычки (в примере 'Федоров"). Заранее спасибо всем, кого заинтересует данная тема. Файл со своим макрос приложил.
Изменено: Excelman - 13.07.2017 14:32:44
 
Цитата
Excelman написал:
хотелось чтобы в Msgbox'е с предупреждением отражались бы обнаруженные данные
Вам это нужно как самоцель? Или что-то с этой информацией дальше делать собираетесь? Может лучше отображать все строки? Или сразу удалять значения в скрытых строках?
Согласие есть продукт при полном непротивлении сторон
 
Sanja, Удалять не нужно, поскольку возможно там будут нужные данные, но по ошибке их скрыли. Поэтому я бы хотел их сначала оценить. И если выясниться, что это "мусор", то удалю вручную.  
 
Код
Sub HiddenCellsInfo()
Dim I&, J&, iVal$, iInfo$, AllInfo$
On Error Resume Next
With ActiveSheet
    For I = 1 To .UsedRange.Rows.Count
        If .Rows(I).Hidden = True Then
            iInfo = Empty
            For J = 2 To 17
                If .Cells(I, J) = Empty Then
                    iVal = "-"
                Else
                    iVal = "'" & .Cells(I, J).Value & "'"
                End If
                iInfo = iInfo & iVal
            Next
            If AllInfo <> Empty Then
                AllInfo = AllInfo & vbCrLf & "Строка " & I & ":" & " " & iInfo
            Else
                AllInfo = "Строка " & I & ":" & " " & iInfo
            End If
        End If
    Next
End With
MsgBox AllInfo
End Sub
Изменено: Sanja - 13.07.2017 14:53:48
Согласие есть продукт при полном непротивлении сторон
 
вариант
Код
Private Sub CommandButton1_Click()
For i = 1 To ActiveSheet.UsedRange.Rows.Count
    If Rows(i).Hidden = True Then
        check = MsgBox("Скрытая строка № " & i & Chr(10) & Cells(i, 6).Value & Chr(10) _
        & Cells(i, 7).Value & Chr(10) & Cells(i, 8.Value & Chr(10) & Chr(10) & Cells(i, 9).Value _
        & Chr(10) & Cells(i, 10).Value & Chr(10) & "УДАЛИТЬ?", vbYesNo)
        If check = vbYes Then Rows(i).Delete: i = i - 1
    End If
Next
End Sub
 
Sanja, Спасибо Вам. Вариант опробовал. Результат хороший, но только почему то в Msgbox выводится результат обработки по всем скрыты строкам. Можно ли все-таки сделать так чтобы отражался результат обработки  строк в которых хоть что-то обнаружился, но не отражался бы результат обработки скрых строк в которых ничего нет. В данном случае  должна была отразиться строка 3, строка 20 и строка 25
Изменено: Excelman - 13.07.2017 15:06:45
 
Скрыл для примера еще пару строк с данными
Скрытый текст
Согласие есть продукт при полном непротивлении сторон
 
yozhik,Интересно и Ваш вариант попробывать, но что то не получается. Компилятор ругается на синтаксическиую ошибку вот в этом месте
Код
check = MsgBox("Скрытая строка № " & i & Chr(10) & Cells(i, 6).Value & Chr(10) _
        & Cells(i, 7).Value & Chr(10) & Cells(i, 8.Value & Chr(10) & Chr(10) & Cells(i, 9).Value _
        & Chr(10) & Cells(i, 10).Value & Chr(10) & "УДАЛИТЬ?", vbYesNo)

исправить самомстоятельно увы не смогу.

 
Цитата
Excelman написал:
Компилятор ругается
Там в одном месте 8 нужно заменить на закрывающую скобку
Согласие есть продукт при полном непротивлении сторон
 
Sanja,Все так как надо, за сиключением одного. не пойму почему вылазиет 15 строка. Там вроде нет данных. Одни прочерки, но все равно в результате она присутсвует. В чем там может быть подвох?
 
В 15-й строке есть формула
Согласие есть продукт при полном непротивлении сторон
 
Раз есть прочерк - ячейка не пустая )
 
Юрий М, Sanja, да вижу, формула есть. Но тогда по логике в msgbox ячейка  H15 не должна быть помечена как "-", а д.б. отрожено либо результат вычислений формулы "0", либо что-то еще чтобы можно было понять что там есть данные.
 
Скрытый текст
Изменено: Sanja - 13.07.2017 15:24:57
Согласие есть продукт при полном непротивлении сторон
 
Excelman, при вставке кода получился смайл в очках) исправил вручную и затёр скобку. Во второй строке перед ".Value" везде должна быть закрывающая скобка ")"
 
yozhik, попробуйте прогнать галку в "Показывать графические смайлы в этом сообщении".
 
Sanja, теперь все именно так как я себе это и представлял! СПАСИБО ВАМ ОГРОМНОЕ ЗА ПОМОЩЬ.!!! :)

yozhik, Ваш код тоже запустил. Всё как Вы (а ранее Sanja,) и сказали - поставил скобку и код заработал. В целом хороший вариант и если бы не код от Sanja, то на Вашем бы варианте и остановился.. Большой плюс, что прямо в диалоговом окне можно согласиться и удалить неугодные данные, ну, а, скажем, не очень приятный момент, это то, что если скрытых строк будет не 3 или 5 а 10-20 - занятие прямо скажем будет не из приятных. Хотя думаю, если бы результат обработки скрытых строк был бы выведен как у Sanja, т.е. сразу в одном диалоговом окне и в нем было бы поле для ввода номера стоки (или строк), которые нужно удалить то вариант был бы тоже впечатляющим. Спасибо Вам большое yozhik!   Ваш макрос обязательно мне пригодится как основа для своих наработок.

Еше раз всем спасибо за отзывчивость.!
Изменено: Excelman - 13.07.2017 16:54:08
 
Sanja, обнаружил неудобный момент в работе Вашего кода. Смоделировал ситуацию. Раскрыл все строки в таблице и запустил макрос. По идее код сработал как надо, точнее никаких скрытых данных не показал, так как после открытия ничего не скрыто :) , но конструкция кода продолжает "выталкивать" пустой Msgbox. Логичнее предположить, что при всех открытых строках пустой MsgBox не должен "выпрыгивать". Не могли бы Вы исправить код с такой логикой, Sanja,?
 
Попробуйте добавить проверку на длину AllInfo.
Страницы: 1
Читают тему
Наверх