excel как удалить дубликаты ячеек с учетом регистра? |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Как правило, Удалить дубликаты Функция в Excel может помочь вам быстро и легко удалить повторяющиеся значения, однако эта функция не чувствительна к регистру. Иногда вы хотите удалить дубликаты, чувствительные к регистру, чтобы получить следующий результат, как можно справиться с этой задачей в Excel?
Удалите дубликаты, но оставьте первые с учетом регистра с формулой
Удалите все дубликаты, чувствительные к регистру, с помощью вспомогательной формулы
Удалите дубликаты, чувствительные к регистру, с помощью Kutools for Excel
Удалите дубликаты, но оставьте первые с учетом регистра с формулой
Следующая формула может помочь вам удалить повторяющиеся значения с учетом регистра и сохранить первое. Пожалуйста, сделайте следующее:
1. Введите эту формулу = ЕСЛИ (СУММПРОИЗВ (- EXACT (A2; $ C $ 1: C1)); «»; A2) в пустую ячейку, куда вы хотите поместить результат, например C2, см. снимок экрана:
Внимание: В приведенной выше формуле A2 это первая ячейка списка, за исключением заголовка, который вы хотите использовать, и C1 это ячейка над ячейкой, в которую вы поместили формулу.
2. Затем перетащите дескриптор заполнения вниз к ячейкам, к которым вы хотите применить эту формулу, и повторяющиеся значения, но первые чувствительные к регистру, были заменены пустыми ячейками. Смотрите скриншот
Удалите все дубликаты, чувствительные к регистру, с помощью вспомогательной формулы
Если вы хотите удалить все дубликаты, которые чувствительны к регистру, вы можете применить столбец вспомогательной формулы, сделайте следующее:
1. Введите следующую формулу в соседнюю ячейку ваших данных, например B2, =AND(A2<>»»,SUMPRODUCT(—(EXACT(A2,$A$2:$A$15)))>1), см. снимок экрана:
Внимание: В приведенной выше формуле A2 — первая ячейка диапазона данных, исключая заголовок, и A2: A15 — это используемый диапазон столбцов, в котором вы хотите удалить дубликаты с учетом регистра.
2. Затем перетащите маркер заполнения вниз к ячейкам, которые вы хотите содержать эту формулу, и все дубликаты отобразятся как ИСТИНА, а уникальные значения отображаются как НЕПРАВДА в столбце помощника см. снимок экрана:
3. А затем вы можете отфильтровать все повторяющиеся значения на основе вспомогательного столбца. Выберите вспомогательный столбец, затем щелкните Данные > Фильтр чтобы активировать функцию фильтра, и нажмите кнопку треугольника в правом углу ячейки B1, отметьте только ИСТИНА вариант в списке, см. снимок экрана:
4. Затем нажмите OK, были отфильтрованы только повторяющиеся значения, чувствительные к регистру, выберите отфильтрованные данные, затем щелкните Главная > Удалить > Удалить строки листов, см. снимок экрана:
5. И все строки повторяющихся значений, чувствительных к регистру, были удалены сразу, тогда вы должны отменить Фильтр функция для отображения уникальных значений, см. снимок экрана:
6. Наконец, вы можете удалить содержимое ячейки столбца B по мере необходимости.
Tips: Если вы хотите сохранить исходные данные, вы можете скопировать отфильтрованные данные и вставить их в другое место вместо их удаления.
Удалите дубликаты, чувствительные к регистру, с помощью Kutools for Excel
Если у вас есть Kutools for Excel, С его Выберите повторяющиеся и уникальные ячейки утилиту, вы можете быстро выбрать или выделить повторяющиеся значения, чувствительные к регистру, а затем сразу удалить их.
После установки Kutools for Excel, пожалуйста, сделайте следующее:
1. Выберите диапазон данных, в котором вы хотите удалить дубликаты с учетом регистра.
2. Затем нажмите Кутулс > Выберите > Выберите повторяющиеся и уникальные ячейки, см. снимок экрана:
3. В разделе Выберите повторяющиеся и уникальные ячейки диалоговое окно, выберите Дубликаты (кроме 1-го) or Все дубликаты (включая 1-й) вам нужно, а затем проверьте Деликатный случай вариант, см. снимок экрана:
4. Затем нажмите Ok Кнопка:
(1.) Если вы выберете Дубликаты (кроме 1-го) опция, будут выбраны повторяющиеся значения, за исключением первой записи, а затем нажмите Удалить ключ, чтобы удалить их сразу, см. снимок экрана:
(2.) Если вы выберете Все дубликаты (включая 1-й) вариант, выбираются все дубликаты, чувствительные к регистру, а затем нажмите Удалить ключ, чтобы удалить их сразу, см. снимок экрана:
Скачать и бесплатную пробную версию Kutools for Excel Сейчас !
Демонстрация: удаление дубликатов, чувствительных к регистру, с помощью Kutools for Excel
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.
Вкладка Office: интерфейс с вкладками в Office и упрощение работы
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Необходимость учитывать регистр (регистрочувствительность) — одно из первых заметных принципиальных отличий, с которыми сталкиваются те, кто начинают работать в Power Query. В отличие от Excel, который прописные и строчные буквы в подавляющем большинстве случаев не различает, Power Query в этом вопросе строг. При любых операциях с данными (фильтрации, сортировке, удалении дубликатов, в исходном М-коде запросов и т.д.) Query воспринимает большие и маленькие буквы как совершенно разные.
Конечно, рано или поздно, к этому привыкаешь и начинаешь относиться как к данности и учитывать в работе. Так, например, многие пользователи перед фильтрацией, чтобы она была регистроНечувствительной, сначала делают дубликат столбца, в котором затем преобразуют весь текст к одному регистру и только потом фильтруют. Вполне себе способ.
На самом деле, решить эту проблему можно гораздо изящнее, если использовать встроенную в языке М в Power Query функцию с громоздким названием Comparer.OrdinalIgnoreCase.
Её синтаксис прост:
=Comparer.OrdinalIgnoreCase(Текст1, Текст2)
Она сравнивает два текста, заданные в качестве аргументов, причём делает это без учёта регистра. Если тексты равны друг другу (одинаковы), то функция выдаёт ноль. Если не равны, то выдаёт 1 или -1 в зависимости от того, какой текст «больше» (с точки зрения кодов символов, т.е. расположения букв в алфавите) — первый или второй.
Нас, как легко сообразить, интересует именно первый случай, т.е. ноль в качестве желаемого результата сравнения. Давайте рассмотрим несколько примеров использования этой функции в типичных рабочих задачах Power Query.
Пример 1. Фильтр по значению без учёта регистра
Предположим, что у нас есть вот такая загруженная в редактор Power Query таблица, в которой мы хотим отфильтровать все джемперы Lacoste вне зависимости от их регистра:
Для начала выполним простую фильтрацию по любому из вариантов написания. Получим в строке формул следующую конструкцию:
Обратите внимание на выражение в скобках после слова each — это, по факту, и есть условие, которое проверяется для каждого (each!) значения из столбца Товар, чтобы решить — фильтровать эту строку её или нет.
Заменим это выражение на нашу функцию регистронечувствительного сравнения Comparer.OrdinalIgnoreCase. Если она возвращает 0, то очередное проверяемое значение равно (без учета регистра) искомому джемперу Lacost, то мы хотим показать эту строку в результатах фильтрации:
Получаем в результате наши джемперы Lacoste в любом варианте регистра. Всех делов
Пример 2. Фильтр по частичному совпадению без учёта регистра
Интересный и не совсем очевидный момент заключается в том, что иногда нашу функцию Comparer.OrdinalIgnoreCase можно использовать без аргументов и даже без скобок — в качестве дополнительного необязательного аргумента для других функций в Power Query.
Предположим, что в той же таблице мы хотим отфильтровать все строки, где название товара содержит слово «джинсы«. Как и в прошлый раз, давайте сначала отфильтруем джинсы привычным образом, используя опцию Текстовые фильтры — Содержит (Text filters — Contains):
Получаем в строке формул конструкцию с уже знакомой функцией Table.SelectRows:
Здесь, как легко сообразить, условием на отбор строк будет результат М-функции Text.Contains, проверяющей содержится ли в очередном (each) названии товара слово «джинсы».
Фишка в том, что у функции Text.Contains, на самом деле, не два, а три аргумента — третий (необязательный) отвечает за метод сравнения и тут как раз можно указать нашу функцию (без аргументов и даже без скобок):
Совершенно аналогично, кстати, можно реализовать регистроНЕчувствительность и при фильтрации текста в режиме «начинается с», «заканчивается на» и т.п. — просто дописываем нашу функцию третьим аргументом и всё.
Пример 3. Удаление дубликатов без учёта регистра
Ещё одна классическая задача, где мы можем столкнуться со сложностями из-за регистра — это поиск и удаление дубликатов.
Предположим, что всё в той же таблице мы хотим оставить только уникальный набор покупателей. Сначала делаем это обычным образом — щёлкнув по шапке столбца Покупатель, выбираем команду Удалить дубликаты (Remove Duplicates). Получаем покупателей в разном регистре и в строке формул выражение с функцией Table.Distinct, которая в языке М отвечает за удаление повторов:
Обратите внимание, что вторым аргументом функции Table.Distinct указывается список (в фигурных скобках через запятую) имён столбцов, по которым идёт проверка уникальности.
Неочевидный нюанс в том, что для каждого столбца в этом списке можно задать свою функцию сравнения, которая должна использоваться при обнаружении дубликатов — она указывается через запятую непосредственно после имени столбца, что легко решает нашу задачу:
Если вы удаляете дубликаты не по одному, а сразу по нескольким столбцам (например по связке столбцов Товар — Покупатель, выделив их предварительно с Ctrl), то для каждого столбца функцию нужно прописать отдельно, заключив дополнительно каждую пару «столбец-функция» в фигурные скобки:
Пример 4. Объединение (merge) таблиц без учёта регистра
Ну и, наконец, давайте разберём ещё один типовой случай — объединение таблиц без учёта регистра. Тут всё проще — не нужно дописывать вручную никаких функций, а просто использовать нечёткий текстовый поиск, о котором я уже делал отдельную статью и видео с подробным разбором.
Если, например, нам нужно подтянуть к той же самой таблице статусы покупателей из отдельного справочника (уже загруженного в Power Query заранее), то используем команду Главная — Объединить (Home — Merge). В открывшемся окне внизу выбираем таблицу-справочник, выделяем пару столбцов для связи в обеих таблицах, а затем включаем флаг Использовать нечеткие соответствия для слияния (Use fuzzy matching):
В параметрах нечёткого соответствия задаём Порог подобия = 1 (чтобы поиск был точным и на «Иван» у нас не нашёлся, например, «Иванов» или «Иванович») и включаем флажок Игнорировать регистр (Ignore case), ради которого тут всё и задумано.
Если в вашей версии Excel нет галочки Использовать нечеткие соответствия для слияния, то можно попробовать создать новый шаг (нажать кнопку fx в строке формул) и вписать туда нужную функцию вручную — возможно, что в вашу версию Excel она уже добавлена, хотя галочки в окне слияния ещё нет:
Здесь первый аргумент — таблица (обычно с предыдущего шага), а затем идут две пары «имя столбца — таблица» (куда и откуда подтягиваем данные). Последний аргумент — это запись (record) в квадратных скобках, описывающая все параметры слияния.
Вот и все премудрости. Надеюсь, что теперь регистрочувствительность Power Query не будет составлять для вас большой проблемы — её можно обойти, если нужно, не создавая при этом лишних шагов.
Ссылки по теме
- Нечёткий текстовый поиск в Power Query
- Поиск точных совпадений с учётом регистра
- Поиск ключевых слов в тексте
For a general solution the VBA approach already suggested is probably to prefer. But for something that works only once, you can probably make it work the way you intended with only a little bit of adaptation in how you apply =IF(SUMPRODUCT(--EXACT(A2,$B$1:B1)),"",A2)
. I also tried to use a COUNTIF algorithm, which is much faster than SUMPRODUCT, but that’s not case sensitive.
Since I am also running 32-bit Excel with 8GB memory I was curious to see if I could replicate the memory issue. I generated a list of 100,000 random 5-letter strings in column A. Only 10 letters were used (ABCDEFGHJK), so in 100,000 strings some would occur more than once. I then applied the formula suggested by the OP in column B to filter out only unique values. It did indeed work, but it took quite some time. But I never ran into the memory issue that the OP did.
Proposed solution:
Based on these observations, one possible solution to you particular problem might be to copy column A to a new, temporary workbok and run your SUMPRODUCT formula there while all other workbooks are closed. Once it has finished you could just paste the result back to the original column in the original file. Actually removing the duplicates could be done by simply filtering on that column so that all dublicates (empty cells) are grouped together and then remove those rows. Details of my attempt to replicate can be found below.
SUMPRODUCT: Approximately 1 hour
First I tried the same formula as in the OP, =IF(SUMPRODUCT(--EXACT(A2,$B$1:B1)),"",A2)
, but doing only 10,000 rows at a time (by inserting empty rows at row 10,000, 20,000 etc. and copying down ten thousand rows at a time.) Each set of 10,000 rows took a couple of minutes to complete. When I did the whole shebang as one giant copy operation for all 100,000 cells at once, the operation took around one hour to complete and Excel was unresponsive in the meantime. Memory usage was 1,4 GB and the CPU averaged over 50% capacity (monitored with the Windows Task Manager). I also tried to run the formula when I had already manipulated the data in various ways (thus consuming more memory), which pushed CPU capacity to 100% and caused a couple of crashes. I managed to avoid that by simply closing Excel to clear the memory and running the operation again from a fresh restart with no other workbooks open.
As you can see in the following screenshots the formula worked and the unique entries become rarer further down the list (as expected since they are random). I assigned 1 to cells contaning duplicates so I could count them easily. There were 36,843 such instances.
First rows, no duplicates:
Last rows, mostly duplicates (cells with 1):
COUNTIF: 8.5 minutes
Compared to the SUMPRODUCT algorithm which took around one hour to complete, the following COUNTIF formula completed the same job in only 8,5 minutes, but it would not distinguish between lower and upper case. This approach requires the use of a help column. COUNTIF returns the number of instances that a particular string has been used in the range above the current cell, so every time a string is encountered for the first time, it will return 1. Cell B2 contains =COUNTIF($A$2:$A2,A2)
, and copying this down for all 100,000 rows took around eight and a half minutes. Then, in a separate colum I just used a simple IF formula to filter out the unique values from column A; cell C2 contains =IF(B2=1,A2,1)
, which returns the string in column A if it is unique; otherwise 1 is returned (to allow easy comparison with SUMPRODUCT). Copying this IF formula down for all 100,000 rows is practically instantaneous. The sum of 1s in column C after this operation was, reassuringly, the same as in the case of SUMPRODUCT, 36,843.
INDEX: Failure
I also played around with an array formula using the INDEX and MATCH functions. This formula that does the same job as COUNTIF, but also filters out the empty rows:
=INDEX($A$2:$A$100001,MATCH(0,COUNTIF($E$1:E1,$A$2:$A$100001),0))
. This should be entered in cell B2 as an array formula (Ctrl + Shift + Enter) and then copied down. Copying individual cells one at a time worked fine for a few dozen rows, but anything more than that caused Excel to crash. I even tried running this overnight, but the operation never finished. (The formula could be extended to become case sensitive, but I didn’t bother to try.)
One thing to note, however, with the failed INDEX formula was that the behavior described above occured when the formula was applied in a separate workbook. I also tried to run this formula in column D in the same workbook as the COUNTIF formula. Then I did actually run into the memory issue described in the OP, which, unsurprisingly, suggests that the problem with memory depends on the rest of the data in the workbook.
By definition, Microsoft Excel 2007 considers a duplicate to be a row of data that matches another row in your worksheet exactly. When you evaluate a single column of data, Excel finds single-cell duplicates. When you look for duplicates in data spanning two columns, a two-column pair of cells must match another pair, and so on. If one of the rows in a one-column data set contains «cat» and the other contains «Cat» in the same column, Excel considers the values to be unique. Likewise, if one row contains a date formatted with a two-digit year and another row contains the same date formatted with a four-digit year, Excel considers them unique. As a result, the process of removing duplicates always considers case when evaluating a record for uniqueness.
-
Click on the heading of the column you want to evaluate for duplicates. Click and drag from one heading to the next to select more than one column. Hold down the «Ctrl» key and click to select columns that aren’t next to each other.
-
Press «Ctrl-C» to copy the data. Click in an empty column and press «Ctrl-V» to paste the data you copied. Select the column or columns that contain the pasted data.
-
Click the «Data» tab in the Microsoft Excel 2007 ribbon and locate the Data Tools group. Click on the «Remove Duplicates» item to bring up the Remove Duplicates dialog box.
-
Click on the check box in front of the column name or names you want to evaluate for duplicates. These names draw from the headers typed in the first cell of each column you select for evaluation. Click on the «OK» button at the bottom right of the Remove Duplicates dialog box to process your data.
-
Evaluate the results dialog box that shows how many duplicates Excel found and removed. The dialog box also tells you how many unique values remain. Removing duplicates from more than one column of data may produce results that appear counterintuitive. If you process rows 1 through 10 of columns A and B, row 1 and row 2 are duplicates if and only if A1 matches B1 and A2 matches B2.