Показатели не возвращают правильное значение - PullRequest
1 голос
/ 30 января 2020

У меня есть следующие данные, которые хранятся в виде текста, с форматом ячейки по умолчанию.

=ISTEXT(G4)
=TRUE
'in both spreadsheets.

Пример данных

Обе рабочие книги похожи. Другая дата в A1 и разные записи строк здесь и там.

+---+-----------+-------------+-----+-----+------+-------------+--------------+----------+
|   |     A     |       B     |  C  |  D  |  E   |      F      |      G       |    H     |
+---+-----------+-------------+-----+-----+------+-------------+--------------+----------+
| 1 | MTOD List Exported as at Monday, 07 October 2019         |              |          |
| 2 |           |             |     |     |      |             |              |          |
| 3 | MTOD      | Title       | Dwg | Man | CDED | Issue Date  | Impl. Date   | Status   |
| 4 | 0101.0700 | Legend      |     |     |      | Apr 1, 1994 | Apr 1, 1994  | Active   |
| 5 | 0202.0310 | Roadway - A | 0   |     |      | Dec 1, 2005 | Dec 21, 2005 | History  |
| 6 | 0202.0310 | Roadway - A | 1   |     |      | Jan 1, 2007 | Mar 15, 2007 | History  |
| 7 | 0202.0310 | Roadway - A | 2   |     |      | May 1, 2009 | Jun 11, 2009 | Obsolete |
| 8 | 0202.0320 | Roadway - D | 0   |     |      | Jan 1, 2007 | Mar 15, 2007 | History  |
+---+-----------+-------------+-----+-----+------+-------------+--------------+----------+

Когда я выполняю проверку уникальных записей из обновленной рабочей книги, я ввожу в Excel следующую формулу:

=COUNTIFS('[MTOD 115450 List.xml]Sheet1'!$A:$A,A4,'[MTOD 115450 List.xml]Sheet1'!$G:$G,"<>"&G4,'[MTOD 115450 List.xml]Sheet1'!$H:$H,H4)

Строка 4 в обновленной книге в точности совпадает с образцом данных. Это означает, что запись не изменилась. То, что я ищу, это тот же номер MTOD (Col A), другой Imp. Дата (Колонка G), Тот же статус (Колонка H)

Поскольку строка 4 является точным соответствием, я ожидаю, что показатели возвращают 0, но вместо этого она возвращает 1. Оставил меня в замешательстве. Я разбил счетчики на каждое из его ifs, чтобы посмотреть, смогу ли я что-нибудь поймать. и я получил следующие результаты:

Individual Results

  • Значение MTOD 1 такое же, как и ожидалось, поскольку это единственный листинг во всем столбце.
  • Значение состояния 339 соответствует ожидаемому, поскольку в списке много активных документов
  • Значение IMP для 1048576 окончено.

Значение для IMP количество строк в электронной таблице когда я применяю фильтр к этому столбцу, строка 4 фактически является единственной строкой с этой датой. Я мог бы понять счет 1048576 -1. Когда я изменяю <> на =, тогда я получаю ожидаемый ответ 1.

На листе, где я делаю подсчет, я использовал COUNTA (G: G) и получил ответ 1015.

Почему COUNTIFS задает значение для ДАТЫ IMP?

Что мне нужно, чтобы полная формула COUNTIFS оценивалась в 0?

Я подозреваю, что это преобразование строки даты в дату Excel как часть процесса, и в итоге она пытается сравнить строку с целым числом. Я купил бы это, если бы это не возвращало правильное значение 1, когда я переключаю дату с <> на =.

Это все было доведено до моего внимания при попытке отладки моего excelformula, который возвращал то же самое приводит к 1 вместо нуля:

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Range("A:A"), varElement.Value, _
                                                    Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "<>" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value, _
                                                    Existing.Worksheets("Sheet1").Columns(StatusCol.Column), "Active")

Мой лог c имеет недостатки?

Обновление

Ссылка на файлы

Обновление 20/02/12

Я обновил свою программу, и теперь она конвертирует даты из строк в серийные даты при открытии рабочих книг. Теперь, когда я делаю показания в формуле Excel, я получаю правильный результат 0. Когда я запускаю его через VBA, я получаю неправильный результат 1. Есть идеи, что происходит с формулой VBA против Excel?

Одна вещь, которую я заметил при проверке значений критериев показателей в окне просмотра, это то, что дата в окне просмотра - 94/04/01, а дата в строке формул, когда я нажимаю на ячейку, отображает 1994 /04/01.

Часы VBA VBA Watch

Дата Excel Excel Date

0 в I5 результат приведенной выше формулы теста COUNTIFS дает ожидаемый результат.

UPDATE II 20/02/12

, поэтому я провел небольшое тестирование только для компонента date. Я вижу проблему, но я не знаю обходной путь в настоящее время. Появляется, когда вы объединяете оператор сравнения с датой, он преобразует его в строку вместо того, чтобы оставлять ее как дату.

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value)

SearchCount приведет к 1, что является правильным, поскольку это уникальная дата в этот столбец.

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "=" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value)

SearchCount = 0

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "<>" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value)

SearchCount = 1048576

Итак, как мне выполнить COUNTIFS с <> DATE? Могу ли я изменить ДАТУ в VBA на ее серийную дату и использовать вместо нее?

1 Ответ

1 голос
/ 12 февраля 2020

Таким образом, проблема в конце состоит в том, что конкатенация оператора к дате меняет дату на строку. В результате порядковая дата, хранящаяся в столбце, неправильно сравнивается со строкой. Решением является получение серийной даты, которая, очевидно, хранится в .value2. Как только формула VBA изменится на:

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "=" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value2)

or

SearchCount = Application.WorksheetFunction.CountIfs(Existing.Worksheets("Sheet1").Columns(ImpCol.Column), "<>" & Source.Worksheets("Sheet1").Cells(varElement.Row, ImpCol.Column).Value2)

, вы получите правильные результаты при условии, что дата в столбце, в котором вы ведете поиск, - это серийные даты Excel, а не текстовые даты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...