Вернуть пустую ячейку из формулы в Excel

219

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

=IF(some_condition,EMPTY(),some_value)

Я пытался сделать такие вещи, как

=IF(some_condition,"",some_value)

и

=IF(some_condition,,some_value)

и предполагая, что B1 является пустой ячейкой

=IF(some_condition,B1,some_value)

но я полагаю, что ни одна из них не является истинно пустыми ячейками, поскольку они являются результатом формулы. Есть ли способ заполнить ячейку тогда и только тогда, когда будет выполнено какое-то условие, и в противном случае оставить ячейку действительно пустой?

РЕДАКТИРОВАТЬ: как рекомендовано, я попытался вернуть NA (), но для моих целей это тоже не сработало. Есть ли способ сделать это с VB?

РЕДАКТИРОВАТЬ: Я строю рабочий лист, который извлекает данные из других рабочих листов, отформатированный в соответствии с очень специфическими требованиями приложения, которое импортирует данные в базу данных. У меня нет доступа для изменения реализации этого приложения, и оно завершается ошибкой, если значение «» вместо фактически пустого.

Брайан Уорд
источник
8
Можете ли вы объяснить, почему клетка должна быть пустой? В зависимости от того, что «пустота» дает вам, может быть обходной путь.
JT Grimes
3
Ячейка содержит формулу, не так ли? Как он может быть пустым или пустым?
Синан Юнюр
8
У меня похожая проблема, я рисую график и не хочу показывать значение 0 для пустых элементов на графике. Если записи являются пустыми ячейками, они исключают их из графика, но любой из методов, перечисленных в разделе «Ответы» ниже, приводит к отображению 0 на графике. :(
Cobusve
5
Чтобы нули не отображались на графиках, используйте функцию NA () вместо пустой строки / нуля. Это поместит # N / A в ячейку, которая игнорируется процедурой построения графиков.
Роб
5
Предложение Роба использовать # N / A имеет другой результат, чем пустая ячейка. # N / A приведет к тому, что подпрограмма построения графика будет интерполироваться по ячейке, тогда как действительно пустая ячейка будет рассматриваться как пробел в строке. Если вы хотите GAP в строке, а не ИНТЕРПОЛЯЦИЯ через промежуток, вам нужно, чтобы ячейка была ПУСТОЙ, а не # N / A согласно вопросу. Ниже приведены решения, которые решают эту проблему в соответствии с запросом.
Мистер Пурпур

Ответы:

50

VBAТогда тебе придется использовать . Вы будете перебирать ячейки в вашем диапазоне, проверять условия и удалять содержимое, если они совпадают.

Что-то вроде:

For Each cell in SomeRange
  If (cell.value = SomeTest) Then cell.ClearContents
Next
JT Grimes
источник
6
Я бы добавил к этому: если у вас всегда есть определенный диапазон ячеек, для которого вы хотите очистить пустые ячейки, вы можете дать этому диапазону имя, а затем изменить формулу Боофуса, изменив SomeRange на Range («MyRange»). Чтобы задать имя для своих ячеек, выберите ячейки, нажмите «Определить имя» на вкладке «Формулы» на ленте и введите «MyRange» в поле «Имя». (И, конечно, вы можете заменить MyRange на что угодно.)
devuxer
31
Это сильно, что в Excel нет нулевой константы.
ted.strauss
5
Если вы поместите макрос в функцию worksheet_calculate (), он автоматически очистит ячейки. Для конкретной детали вы можете увидеть мой ответ ниже.
Мистер Пурпур,
3
@ ted.strauss естьVbNullString
brettdj
5
@brettdj Это VBA, а не Excel. Мы лоббировали долго и упорно какой - то функции , как NULL () или BLANK (), но безрезультатно.
Джон Пельтье
75

Excel не имеет никакого способа сделать это.

Результатом формулы в ячейке в Excel должно быть число, текст, логическое (логическое) или ошибка. Не существует типа значения ячейки формулы «пусто» или «пусто».

Одна практика, которой я следовал, заключается в использовании NA () и ISNA (), но это может или не может действительно решить вашу проблему, поскольку существует большая разница в том, как NA () обрабатывается другими функциями (SUM (NA ( )) равно # N / A, а SUM (A1) равно 0, если A1 пусто).

Джо Эриксон
источник
19
Метод NA () работает на 100% для графиков, которые показывают пустые ячейки в виде пробелов, это, скорее всего, не сработает для вашего случая, когда вы экспортируете в приложение, где ячейка должна быть пустой, поскольку она содержит формулу ...
Cobusve
4
Идеального решения не существует. NA () - один хороший вариант. Еще одна пустая строка (в зависимости) '' или ""
Джейсон
Это работает с целью динамического возврата пустых ячеек в данных, которые будут построены, так что вы можете эффективно использовать опцию игнорирования пустых ячеек в качестве пробелов на графиках. В моем случае я пытался построить 12 значений для представления ежемесячной прогрессии, но только до предыдущего месяца, с формулой, подобной этой: = IF (MONTH (TODAY ())> C2; $ C $ 11 + C7; NA ( ))
EKI
Это сработало для меня. У меня есть диаграмма с данными, которые я добавляю к каждому дню - сводный график для схватки, и я хотел, чтобы линия продолжалась только до текущего дня. Это помогло мне сделать это - используя NA () в операторе IF. Спасибо!
TheJerm
12
NA () не приведет к разрыву. Все понимают это неправильно. Excel не будет отображать маркер, если значение равно NA () или # N / A, но будет рисовать линию, интерполированную между соседними значениями, отличными от # N / A.
Джон Пельтье
38

Да, это возможно.

Можно получить аннулирующую формулу, оценивающую до истинного поля, если условие выполнено. Он проходит проверку по ISBLANKформуле.

введите описание изображения здесь

Все, что вам нужно, это, скажем GetTrueBlank, установить именованный диапазон, и вы сможете использовать следующий шаблон, как и в вашем вопросе:

=IF(A1 = "Hello world", GetTrueBlank, A1)

Шаг 1. Поместите этот код в модуль VBA.

Function Delete_UDF(rng)
    ThisWorkbook.Application.Volatile
    rng.Value = ""
End Function

Шаг 2. В Sheet1в A1ячейке добавить именованный диапазон GetTrueBlankпо следующей формуле:

=EVALUATE("Delete_UDF("&CELL("address",Sheet1!A1)&")")

введите описание изображения здесь

Вот и все. Дальнейших шагов нет. Просто используйте самоуничтожающую формулу. Положите в ячейку, скажем B2, следующую формулу:

=IF(A2=0,GetTrueBlank,A2)

Приведенная выше формула в B2будет иметь значение trueblank, если вы введете 0 в A2.

Вы можете скачать демонстрационный файл здесь .

В приведенном выше примере вычисление формулы для trueblank приводит к пустой ячейке. Проверка результата с ISBLANKформулой дает положительные результаты в TRUE. Это формула, похожая на харакири. Формула исчезает из ячейки при выполнении условия. Цель достигнута, хотя вы, возможно, захотите, чтобы формула не исчезла.

Вы можете изменить формулу так, чтобы она возвращала результат в соседнюю ячейку, чтобы формула не убивала себя сама. Посмотрите, как получить результат UDF в соседней ячейке .

Я сталкивался с примерами получения истинного фланга как результата формулы, показанного The FrankensTeam здесь: https://sites.google.com/site/e90e50/excel-formula-to-change-the-value-of-another- клетка

Пшемыслав Ремин
источник
5
Это чертовски приятный обходной путь, хотя довольно безумно, что нет способа сделать это без физического опустошения клетки. Единственным недостатком здесь будет то, что вам придется помнить, что при пересчете перетаскивать формулу вниз, хотя, я думаю, вы могли бы установить для этого событие из книги.
Some_Guy
Прежде чем пытаться использовать сладкий обходной путь, обратите внимание, что это может иметь неприятные последствия .
GSerg
@GSerg Вы просто говорите, что вы можете сделать цикл с VBA, который будет бесконечно, и таким образом программа будет зависать? VBA может быть бритвой в руках обезьяны. И есть слух, что лев тоже отстрелялся, Это должно напугать больше :-)
Przemyslaw
@PrzemyslawRemin Нет, я говорю, что могут произойти разные случайные вещи, включая сбой Excel .
GSerg
20

Может быть, это обман, но это работает!

Мне также нужна была таблица, которая является источником для графика, и я не хотел, чтобы пустые или нулевые ячейки создавали точку на графике. Это правда, что вам нужно установить свойство графика, выбрать данные, скрытые и пустые ячейки, чтобы «показывать пустые ячейки как пробелы» (нажмите переключатель). Это первый шаг.

Затем в ячейках, которые могут закончиться с результатом, который вы не хотите выводить на график, поместите формулу в оператор IF с NA()такими результатами, как=IF($A8>TODAY(),NA(), *formula to be plotted*)

Это дает необходимый граф без точек, когда происходит недопустимое значение ячейки. Конечно, это оставляет все ячейки с этим недопустимым значением для чтения #N/A, и это грязно.

Чтобы очистить это, выберите ячейку, которая может содержать недопустимое значение, затем выберите условное форматирование - новое правило. Выберите «форматировать только ячейки, которые содержат» и в описании правила выберите «ошибки» из выпадающего списка. Затем под форматом выберите шрифт - цвет - белый (или любой другой цвет фона). Нажмите различные кнопки, чтобы выйти, и вы должны увидеть, что ячейки с недопустимыми данными выглядят пустыми (они на самом деле содержат, #N/Aно белый текст на белом фоне выглядит пустым). Тогда связанный график также не отображает точки недопустимых значений.

Нежный Рыцарь
источник
6
НЕТ !!! "показывать пустые ячейки как пробелы" Требует, чтобы ячейки были ПУСТЫМИ. Если они содержат # N / A, а не NOTHING, тогда графическая процедура будет интерполироваться по # N / A ячейкам, а не оставлять их как пропуски в строке. Если вы хотите, чтобы ячейки # N / A были интерполированы, это нормально, но в этом случае «показывать пустые ячейки как пробелы» НЕ ПРИМЕНЯЕТСЯ
Mr Purple
4
@GreenAsJade Это не настоящий ответ, потому что он не соответствует потребностям ОП. Там действительно должен быть отдельный вопрос для проблемы с графикой.
ZX9
10

Вот как я сделал это для набора данных, который я использовал. Это кажется запутанным и глупым, но это была единственная альтернатива изучению того, как использовать решение VB, упомянутое выше.

  1. Я сделал «копию» всех данных и вставил данные как «значения».
  2. Затем я выделил вставленные данные и произвел «замену» ( Ctrl- H) пустых ячеек на какую-то букву, которую я выбрал, qпоскольку ее нет нигде в моей таблице данных.
  3. Наконец, я сделал еще одну «замену» и qничего не заменил .

Этот трехэтапный процесс превратил все «пустые» ячейки в «пустые» ячейки. Я попытался объединить шаги 2 и 3, просто заменив пустую ячейку на пустую, но это не сработало - мне пришлось заменить пустая ячейка с каким-то реальным текстом, затем замените этот текст пустой ячейкой.

Jeramy
источник
Хотя это может сработать в вашем случае, мне нужно решение, которое может быть применено автоматически. В конечном счете, я думаю, что использовал макрос VB, чтобы стереть вещи, которые были определены как пустые. Этот макрос был запущен прямо перед сохранением файла.
Брайан Уорд
4
это было лучше для меня, потому что мне не нужно, чтобы это было автоматически, но мне нужно, чтобы это было быстро. По сути, это означает, что Excel учитывает пустое значение, добавленное через Find and Replace, что мне достаточно!
rickcnagy
10

Если цель состоит в том, чтобы иметь возможность отображать ячейку как пустую, когда она фактически имеет значение ноль, то вместо использования формулы, которая приводит к пустой или пустой ячейке (так как empty()функции нет ),

  • где вы хотите пустую ячейку, верните 0вместо ""а затем

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

    0;0;"";"text"@
    
ET-X
источник
4
Хотя это не делает ячейку пустой (формула не может привести к пустой ячейке), она выглядит пустой, если число равно нулю. Однако это неверно. Это должно быть 0; -0; "" (обратите внимание на знак минус) или даже 0; -0; без кавычек вообще. Третья точка с запятой и текстовая часть @ не обязательны. Значение полей, разделенных точкой с запятой: как отображать положительные числа, отрицательные числа, ноль и текст (последний формат должен содержать символ @). office.microsoft.com/en-gb/excel-help/…
cvoinescu
Вы бог сэр. Вы спасли меня от Visual Basic. Вы
правите
7

Попробуйте оценить ячейку, используя LEN. Если он содержит формулу LEN, вернется 0. Если он содержит текст, он вернет больше, чем 0.

Alex
источник
Хотя это не помогает первоначальному человеку, на самом деле это не плохой ответ во многих случаях. Это хорошо работает в тех случаях, когда вы были вынуждены вернуться "".
Техниум
Отличный ответ, но немного запутанный. Ячейка, которую я хочу проверить, возвращает число или ""пусто. LEN(cell)>0возвращает true, если есть число (включая ноль и включая, если число рассчитывается по формуле), и false, если пустая строка или пусто.
Крис
7

Вау, удивительное количество людей неправильно поняли вопрос. Это легко сделать сотовый взгляд пустой. Проблема в том, что если вам нужно, чтобы ячейка была пустой, формулы Excel не могут возвращать «никакого значения», а могут только возвращать значение. Возвращение нуля, пробела или даже "" является значением.

Таким образом, вы должны вернуть «магическое значение», а затем заменить его без значения, используя поиск и замену или используя сценарий VBA. Хотя вы можете использовать пробел или "", мой совет - использовать очевидное значение, такое как "NODATE", "NONUMBER" или "XXXXX", чтобы вы могли легко видеть, где это происходит - найти довольно сложно "" в электронной таблице.

Лейрд Попкин
источник
1
Да, это то, что я сделал. Я использовал функцию для генерации «#EMPTY», а затем вставил некоторый код в подпрограмму «вычисления листа». Проверьте мой ответ для полного решения.
Мистер Пурпур
7

Используйте COUNTBLANK(B1)>0вместо ISBLANK(B1)вашего IFутверждения.

В отличие от ISBLANK(), COUNTBLANK()считает ""пустым и возвращает 1.

Кевин Вюйомейер
источник
К сожалению, кажется, что Excel отклоняет = COUNTBLANK (IFNA (VLOOKUP (...), "")) как недействительный (!)
NetMage
6

Так много ответов, которые возвращают значение, которое выглядит пустым, но на самом деле не является пустой ячейкой в ​​соответствии с запросом ...

По запросу, если вы действительно хотите формулу, которая возвращает пустую ячейку. Это возможно через VBA. Итак, вот код, чтобы сделать именно это. Начните с написания формулы для возврата ошибки # N / A везде, где вы хотите, чтобы ячейки были пустыми. Тогда мое решение автоматически очищает все ячейки, которые содержат эту ошибку # N / A. Конечно, вы можете изменить код, чтобы автоматически удалять содержимое ячеек на основе чего угодно.

Откройте «Visual Basic Viewer» (Alt + F11) Найдите интересующую книгу в проводнике проекта и дважды щелкните по ней (или щелкните правой кнопкой мыши и выберите код просмотра). Откроется окно «Просмотр кода». Выберите «Рабочая книга» в раскрывающемся меню (Общие) и «SheetCalculate» в раскрывающемся меню (Объявления).

Вставьте следующий код (на основе ответа JT Grimes) в функцию Workbook_SheetCalculate

    For Each cell In Sh.UsedRange.Cells
        If IsError(cell.Value) Then
            If (cell.Value = CVErr(xlErrNA)) Then cell.ClearContents
        End If
    Next

Сохраните ваш файл как книгу с макросами

NB: Этот процесс похож на скальпель. Он удалит все содержимое всех ячеек, которые оцениваются с ошибкой # N / A, поэтому имейте в виду. Они уйдут, и вы не сможете получить их обратно, не вводя формулу, которую они использовали.

NB2: Очевидно, что вам нужно включить макросы, когда вы открываете файл, иначе он не будет работать, и ошибки # N / A останутся не восстановленными

Мистер пурпурный
источник
2
Если вам нужно, чтобы он был полностью автоматическим / handsfree / динамическим, и вы не хотите повторно вводить формулу для генерации ошибки #NA, вы можете переписать код макроса для дублирования рассматриваемого листа, оставив пустые ячейки вместо #NA, а затем сгенерируйте графики из дубликата листа. (Я добавлю код, если этот комментарий когда-либо проголосовал).
Мистер Пурпур
4

Этот ответ не полностью касается OP, но я уже несколько раз сталкивался с подобной проблемой и искал ответ.

Если вы можете при необходимости воссоздать формулу или данные (и из вашего описания это выглядит так, как будто вы можете), тогда, когда вы будете готовы запустить часть, которая требует, чтобы пустые ячейки были фактически пустыми , вы можете выбрать регион и запустите следующий макрос VBA.

Sub clearBlanks()
    Dim r As Range
    For Each r In Selection.Cells
        If Len(r.Text) = 0 Then
            r.Clear
        End If
    Next r
End Sub

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

ElderDelp
источник
4

Я использовал небольшой взлом. Я использовал T (1), который возвратил пустую ячейку. T - это функция в Excel, которая возвращает свой аргумент, если это строка, а в противном случае пустая ячейка. Итак, что вы можете сделать, это:

=IF(condition,T(1),value)
Ахмед Шахид
источник
Создает строку нулевой длины (ISBLANK (CELL) = FALSE).
Винь
Это работает и должно быть принятым ответом. Большое спасибо, Ахмед. Мой вариант использования немного отличается. Я хочу оставить ячейки пустыми, чтобы агрегатные функции, такие как AVERAGE (), MIN (), MAX (), STDEV (), COUNT () и MEDIAN (), игнорировали значения.
Чарли Рейцель
2

Для улучшения внешнего вида я использовал следующую работу:

Когда вы делаете какие-либо вычисления, "" выдаст вам ошибку, поэтому вы хотите рассматривать ее как число, поэтому я использовал вложенный оператор if для возврата 0 вместо "", а затем, если результат равен 0, это уравнение вернет ""

=IF((IF(A5="",0,A5)+IF(B5="",0,B5)) = 0, "",(IF(A5="",0,A5)+IF(B5="",0,B5)))

Таким образом, лист Excel будет выглядеть чистым ...

Большой Z
источник
1
Это не решение проблемы. Лист выглядит чистым, но значение «» не является «пустым» в отношении графиков.
GreenAsJade
1

Если вы используете функции поиска, такие как HLOOKUP и VLOOKUP, для переноса данных на рабочий лист, поместите функцию в скобки, и функция вернет пустую ячейку вместо {0}. Например,

Это вернет нулевое значение, если поисковая ячейка пуста:

    =HLOOKUP("Lookup Value",Array,ROW,FALSE)

Это вернет пустую ячейку, если ячейка поиска пуста:

    =(HLOOKUP("Lookup Value",Array,ROW,FALSE))

Я не знаю, работает ли это с другими функциями ... Я не пробовал. Я использую Excel 2007 для достижения этой цели.

редактировать

Чтобы получить значение IF (A1 = "",,), возвращаемое как истинное, в одной ячейке должно быть два поиска, разделенных символом &. Самый простой способ сделать это - сделать второй поиск ячейкой, которая находится в конце строки и всегда будет пустой.

Мэтью Долман
источник
1

Ну, пока это лучшее, что я мог придумать.

Он использует ISBLANKфункцию, чтобы проверить, действительно ли ячейка пуста в IFвыражении. Если в ячейке есть что-то, A1в этом примере даже символ ПРОБЕЛ, ячейки нет, EMPTYи в результате будет произведен расчет. Это будет препятствовать отображению ошибок вычислений, пока у вас не появятся числа для работы.

Если ячейка является, EMPTYто ячейка вычисления не будет отображать ошибки вычисления. Если ячейка является, NOT EMPTYто результаты вычисления будут отображены. Это выдаст ошибку, если ваши данные плохие, страшные #DIV/0!

=IF(ISBLANK(A1)," ",STDEV(B5:B14))

Измените ссылки на ячейки и формулу, как вам нужно.

Стевис Гикус
источник
1
Проблема в том, что вам нужно распространить эту проверку на все остальные ячейки, используя этот результат.
Гатри
0

Ответ положительный - вы не можете использовать функцию = IF () и оставить ячейку пустой. «Выглядит пустым» не то же самое, что пустой. Обидно, что две кавычки спина к спине не дают пустую ячейку, не стирая формулу.

кругозор
источник
Если вы готовы использовать VBA, вы можете. По некоторым другим ответам.
Мистер Пурпур
-1

Google привел меня сюда с очень похожей проблемой, я наконец-то нашел решение, которое соответствует моим потребностям, оно может помочь кому-то еще ...

Я использовал эту формулу:

=IFERROR(MID(Q2, FIND("{",Q2), FIND("}",Q2) - FIND("{",Q2) + 1), "")
Хэмиш
источник