Есть ли строка VBA для выбора скопированных ячеек, которые имели пустую формулу? - PullRequest
0 голосов
/ 20 декабря 2018

У меня есть файл Excel, где все контролируется с помощью макроса.В какой-то момент я перемещаю файлы с одного листа на другой, где эти данные хранятся в виде невыполненной работы.

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

Поэтому я перемещаю их с листа A на лист B. Данные на листе A перемещаются и вставляются как значения на листе B. У перемещаемых данных есть два столбца:Столбец A содержит идентификатор элемента, а столбец B содержит дату, когда элемент перестает существовать (Дата прекращения).

В листе A Дата прекращения действия заполняется с помощью простой формулы (= + IF (O5 <> "").; O5; N5)) где, если нет нового ввода Cease Date, извлекать из журнала невыполненных работ.

Теперь, если нет ни нового ввода Cease Date, ни каких-либо задержек, ячейка пуста.

Когда макрос копирует и вставляет (в виде значений) данные из листа A в лист B, столбец B заполняется пустыми ячейками (как и предполагалось), но есть что-то невидимое из-за отсутствия лучшего слова.Почти как при форматировании или когда вы можете столкнуться со скрытыми символами, не видимыми кроме ANSI.

ЕСЛИ я выбираю любую из пустых ячеек и нажимаю клавишу удаления, затем запускаю «Перейти к специальному ...»и пробелы, ячейка выбирается функцией.

Я использую эту строку для удаления пробелов:

Columns("B").SpecialCells(xlBlanks).EntireRow.Delete

Это сегмент моего кода, который копирует / вставляет и обрабатываетДата окончания раздела:

Sheets("Dashboard").Select
    Range("B3:Q400").Select
    Selection.Copy
    Sheets("CeaseDate").Select
    Range("F1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Columns("G:T").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlToLeft
    Range("F1:G1").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Range("A" & Rows.Count).End(xlUp).Offset(1).Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Application.CutCopyMode = False
    Columns("F:G").Select
    Selection.Delete Shift:=xlToLeft

    Columns("B").SpecialCells(xlBlanks).EntireRow.Delete 'Remove rows that does not contain a Cease Date <--- This does not work since it wont treat the blank cells as blank

'Range converting to date format

    Columns("B:B").Select
    Selection.NumberFormat = "m/d/yyyy"

    Columns("A:B").Select
    ActiveSheet.Range("A:B").RemoveDuplicates Columns:=Array(1, 2), _
        Header:=xlYes
    Selection.End(xlUp).Select

Ответы [ 3 ]

0 голосов
/ 20 декабря 2018

Если у вас есть ячейка, которая содержит формулу, но значение этой формулы эквивалентно ="", тогда оно будет отображаться как пустое, а функция COUNTBLANK в Excel (или функция WorksheetFunction.CountBlank в VBA)будет называться пустым, но SpecialCells(xlBlanks) будет , а не - потому что свойство Range.Formula не пустое.

Вот функция для извлечения ячеек с пустым значением в диапазоне:

Private Function GetNullValues(ByVal Target As Range) As Range
    Dim TestingArea As Range, TestingCell As Range
    For Each TestingArea In Target.Areas 'Loop through Areas in Target
        For Each TestingCell In TestingArea.Cells 'Loop through Cells in Area
            If TestingCell.Value = "" Then 'If Cell looks Blank
                If GetNullValues Is Nothing Then 'If first blank found
                    Set GetNullValues = TestingCell 'Start list
                Else 'If not first blank
                    Set GetNullValues = Union(GetNullValues, TestingCell) 'Add to list
                End If
            End If
    Next TestingCell, TestingArea 'This is the same as doing 2 Next lines
End Function

Используйте это так: Set BlankCells = GetNullValues(Sheet1.Columns(2))

0 голосов
/ 20 декабря 2018

Таким образом, я нашел решение этой проблемы, я не могу объяснить , почему проблема возникает, но, по-видимому, это произошло в Excel по крайней мере с версии 2003.

Проблема : Когда я копирую ячейки и использую специальное значение вставки, пустые ячейки не пройдут проверку =ISBLANK() и вернут значение FALSE.Тем не менее, нет ничего, чтобы скопировать из ячейки или что-либо, чтобы отметить.Если я выберу явно пустую ячейку и нажму «Удалить» или «Backspace», =ISBLANK() теперь вернет значение TRUE.

Решение :

  1. Я выбираюобласть с явно пустыми ячейками
  2. Откройте функцию поиска / замены и оставьте Найти что: пустым (без пробелов или чего-либо), а затем в Заменить на: введите строку или слово, которое, как вы ЗНАЕТЕ, больше нигде не появляется в электронной таблице.
  3. Нажмите Заменить все
  4. Все явно пустые ячейки будут заменены словом
  5. Теперь возьмите слово и найдите / замените его ничем
  6. Замененные ячейки теперь будут по-настоящему пустыми и пройдут тест =ISBLANK()

Я изначально нашел это (довольно неясное) решение здесь

0 голосов
/ 20 декабря 2018

То, что вы можете попробовать, также удаляет форматирование.Я сталкивался с этим несколько раз, и он работал для меня с этим кодом.с этой строкой удаляются все форматы в пустых ячейках.

 Columns("B").SpecialCells(xlBlanks).EntireRow.ClearFormats

Вы также можете попробовать добавить функцию .clearformats к каждой удаляемой части.так что если у вас есть

sheet1.column("B").clearcontent

, вы можете добавить

     sheet1.column("B").clearcontent
     sheet1.column("B").clearformats
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...