Формула MS Excel работает, кроме случаев, когда я добавляю iferror (), тогда она выдает ошибку времени выполнения 1004

451
Steve G.

У меня есть формула в ячейке:

=IF(INDEX(insurance_column_date,LOOKUP(2,1/(insurance_column_to=B59),ROW(insurance_column_to))-4)>0,INDEX(insurance_column_date,LOOKUP(2,1/(insurance_column_to=B59),ROW(insurance_column_to))-4),"No data") 

И это прекрасно работает в большинстве случаев, но когда не удается найти искомое значение, возникает ошибка деления на 0 1/(insurance_column_to=B59). В этом случае я получаю # N / A. Справедливо. Поэтому я добавляю функцию iferror в ячейку:

=IFERROR(IF(INDEX(insurance_column_date,LOOKUP(2,1/(insurance_column_to=B59),ROW(insurance_column_to))-4)>0,INDEX(insurance_column_date,LOOKUP(2,1/(insurance_column_to=B59),ROW(insurance_column_to))-4),"No data"),"No data") 

И все идеально. Я получаю «Нет данных» в соответствующих клетках.

Однако, когда я запускаю (совершенно не связанный) макрос - который должен скрывать определенные строки - я теперь получаю ошибку времени выполнения 1004: «Ошибка приложения или объекта», когда он попадает в эту строку: pWorksheetName = ActiveWorkbook.Names(pCounter).RefersToRange.Parent.Name

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

Кто-нибудь знает в чем причина этого или как это исправить?

0
Попробуйте `IF (ISERROR (1 / (insurance_column_to = B59))," Нет данных ", IF (INDEX (insurance_column_date, LOOKUP (2,1 / (insurance_column_to = B59)), ROW (insurance_column_to)) - 4)> 0, INDEX ( insurance_column_date, LOOKUP (2,1 / (insurance_column_to = B59), ROW (insurance_column_to)) - 4), «Нет данных»)) ` thilina R 7 лет назад 0
Похоже, вы забыли закрыть скобку для функции `IFERROR ()`. Добавьте еще один `)` до конца, чтобы сделать это. Это исправит это? Ƭᴇcʜιᴇ007 7 лет назад 0
Спасибо, парни. Я ввел строку = IF (ISERROR (1 / (insurance_column_to = B59)), «Нет данных», IF (INDEX (insurance_column_date, LOOKUP (2,1 / (insurance_c‌ olumn_to = B59)), ROW (in‌ surance_column_to)) -‌`4`)> 0, INDEX (страховка‌ _column_date, LOOKUP (‌ 2,1 / (insurance_colum‌ n_to = B59), ROW (insura‌ nce_column_to)) - 4), «‌ Нет данных») и получил сообщение «Введенная вами формула содержит ошибку.», но я не могу ее обнаружить. Excel выделяет 4, которые я выделил в разметке кода выше, но не знак минус (похоже, он соответствует INDEX (массив, ** row_num **, [column_num]). Steve G. 7 лет назад 0
Быстрый взгляд вызывает этот вопрос: вы спрашиваете 1 / TRUE или 1 / FALSE или 1 / число или 1/0? Один, деленный на ноль, является ошибкой: 1 / (insurance_column_to = B59); insurance_column = B59 приводит к истинным или ложным ejbytes 7 лет назад 0
= insurance_column_to = B59 дает мне # ЗНАЧЕНИЕ !. Хмм. insurance_column_to - это диапазон ячеек (это столбец ячеек на вкладке «Страхование» с заголовком «Кому», как в учреждении, которому мы платим страховые взносы). Может ли это быть проблема? У меня сложилось впечатление, что функция LOOKUP может проверять диапазон ячеек, но происходит ли это потому, что = [диапазон ячеек] = [конкретное значение] разрешается как ошибка, поэтому я ошибаюсь? Формула IF (), которую я дал в своем первоначальном посте, работает отлично, за исключением случаев, когда ни одна ячейка в insurance_column_to не содержит значения в B59, и в этом случае я получаю # N / A. Steve G. 7 лет назад 0
@SteveG. Я не посмотрел на ваш вопрос. Если вы спрашиваете меня, обратитесь к человеку с @ и его имя будет заполнено. Таким образом, предполагаемый человек получит сообщение. ejbytes 7 лет назад 0
@SteveG. Почему бы вам не загрузить скриншот того, что вы делаете, чтобы мы могли видеть, с чем вы работаете. Вы используете имена? Ясно выписать, insurance_column_to = Это. Если вы используете «someName = что-то», вы запрашиваете равенство, оно будет истинным или ложным. Кроме того, вы также используете "/", которая является операцией деления. ejbytes 7 лет назад 0
@SteveG. Также, с чем-то таким длинным, используйте технику погружения и покорения. Начните с первого вопроса и проверьте целостность. Потом второе и проверь. И так далее. Держите их отдельно на разных клетках. Затем соберите на последнем шаге и убедитесь, что он все еще работает. ejbytes 7 лет назад 0
@ejbytes и все, я разбил его на куски и фактически пошел другим путем с помощью функции isnumber (): `= IF (ISNUMBER (MATCH (B59, insurance_column_to)) = TRUE, INDEX (insurance_column_date, LOOKUP (2,1 / (insurance_column_to = B59), ROW (insurance_column_to)) - 4), «Нет данных») `По сути, вместо оценки всей функции в целом, я оценил, было ли совпадение в столбце страхования, так что если нет, часть деления на ноль в любом случае никогда не будет оценена. Я все еще должен проверить это с функцией, дающей мне 1004, но она показывает обещание! Steve G. 7 лет назад 0
Если B59 находится в insurance_column_to, MATCH () возвращает позицию в виде числа. Если нет, возвращается # N / A. И если IF () оценивает, возвращает ли ISNUMBER (MATCH ()) значение ИСТИНА (имеет номер / относительную позицию) или нет. Если TRUE, я перехожу к функции INDEX () (в аргументе if-true). Если нет, в аргументе if-false я помещаю свое сообщение об ошибке «Нет данных». Надеюсь, что это работает с этой функцией run-time-error-1004, но это на другом компьютере (я сейчас не дома и просто собрал некоторые тестовые данные). Если это не сработает, я обязательно выложу скриншоты, предложенные @ejbytes. Любые комментарии? Steve G. 7 лет назад 0
Пока все ваши логические основы покрыты, вы будете в порядке. Держите свои кусочки головоломки где-нибудь в безопасности, чтобы вернуться к ним. После сборки просто приклейте кусок, iferror (myassembly, "") и готово. ejbytes 7 лет назад 0

0 ответов на вопрос

Похожие вопросы