#vba #excel
#vba #excel
Вопрос:
Привет, ребята,
У меня возникли небольшие проблемы с моим макросом Excel. Есть часть кода, в которой он сравнивает ячейки с листа 1 на лист2. Проблема заключается в том, что даже когда ячейка на листе 1 совпадает с ячейкой на листе 2, она все равно отображается как «НЕ СООТВЕТСТВУЕТ».
Я полагаю, что в одной из ячеек, либо ValueA, либо ValueB, есть скрытые символы. Их содержимое поступило из разных источников. Я попытался выполнить формулу CLEAN (), но это не помогло. Есть идеи? ПОЖАЛУЙСТА, СМОТРИТЕ СВЯЗАННЫЙ ФАЙЛ ВЫШЕ. Я скопировал и вставил 2 значения КАК ЕСТЬ, чтобы вы могли проверить, что может быть скрыто.
Я имею дело с большими строками данных, поэтому я не хочу использовать DO В VBA. Есть ли формула или код, чтобы оставить только видимые символы и ПРОБЕЛ в ячейке?
================================================================
Вот еще один пример, он взят из самого основного файла, поэтому он близок к оригиналу. Как вы можете видеть, в столбце B листа 1 есть формула, которая проверяет, существует ли каждый идентификатор записи уже в листе 2. Все они говорят «НЕ НАЙДЕНО» (не существует в sheet2), но многие из них на самом деле уже существуют в sheet2, включая идентификатор записи «1743840». Если вы вручную нажмете CTRL F, чтобы найти этот идентификатор записи в листе 2, вы увидите, что он есть, и система ПОИСКА работает, но формула — нет.
Комментарии:
1. Пожалуйста, проверьте, я отредактировал сообщение и добавил новый файл образца, близкий к оригиналу.
Ответ №1:
Хммм. В вашем примере нет макроса, в нем есть формула.
Одним из способов устранения проблемы с текстом / числом было бы использование функции EXACT worksheet (которая работает как с числами, так и с текстовыми строками).
например:
=IF(EXACT(B3,C3),"Same","Not Same")
Если вы хотите сделать его нечувствительным к регистру, используйте UPPER, чтобы изменить текстовые строки на все в верхнем регистре.
Хммм, основываясь на вашем новом примере, простой UDF сделает свое дело. Он имитирует метод «Найти», который вы использовали вручную. Я сделал его чувствительным к регистру, но вы можете легко это изменить. Приведенное ниже значение возвращает true или false, в зависимости от того, есть ли совпадение. R — это диапазон для поиска, поэтому он может быть OldFile! $ A $ 2: $ A $ 160
Function IsFound(S As String, R As Range) As Boolean
With R
If Not .Find(what:=S, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=True) Is Nothing Then
IsFound = True
Else
IsFound = False
End If
End With
End Function
Ответ №2:
Попробуйте заменить значение поиска на IFERROR(VALUE($A2),$A2)
Итак, ваша формула становится
=IF(IFERROR(MATCH(IFERROR(VALUE($A2),$A2),OldFile!A:A,0),"NOT FOUND")<>"NOT FOUND","FOUND","NOT FOUND")
Комментарии:
1. Кажется, это работает, потрясающе! : D Можете ли вы сказать мне, что пошло не так и почему мне нужно добавить
IFERROR(VALUE($A2),$A2)
? Я имею в виду, что это делает?2. Я не знаю, будет ли это проблемой, но если значение в OldFile является текстовым представлением числа, это, похоже, не работает
Ответ №3:
В вашем прикрепленном листе значение в B3 хранится в виде текста, а значение в ячейке C3 является числовым, поэтому технически они не совпадают. Вы можете обойти это, изменив свою формулу в D3 на что-то вроде:
=IF(B3 0=C3 0,"Same","Not Same")
0 заставляет текст интерпретироваться как числовой. Вы можете применить ту же логику к своему листу большего размера, добавив 0 к числовым значениям, которые были сохранены в виде текста.
Чтобы быстро преобразовать текст в числа, вот один из способов использования VBA (ничего не зная о структуре ваших данных):
Sheet1.Range("B1").Copy
Sheet1.Range("B2:B2000").PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd, SkipBlanks:=False, Transpose:=False
Предполагается, что B1 является пустой ячейкой, а числа, которые хранятся в виде текста, находятся в B2: B2000. Вам нужно будет настроить диапазон в соответствии с вашей ситуацией или опубликовать более подробную информацию о структуре ваших данных.
Комментарии:
1. Привет, как насчет того, если я заставлю их быть текстами вместо чисел? Эти значения иногда содержат все числа, а иногда буквенно-цифровые, например F1245645
2. @user3682866 Смотрите мое редактирование. Я добавил в какой-то VBA, который изменит диапазон чисел, сохраненных в виде текста, на истинные цифры в 2 строках кода (не нужно зацикливаться). Если вам нужна дополнительная помощь, пожалуйста, опубликуйте более подробную информацию о вашем макете данных, но, надеюсь, это поможет вам начать.
3. Спасибо, я вижу, что мы приближаемся к решению этой проблемы, но я ищу обратное вашему решению. Предполагается, что я сравниваю ячейки текстового типа, а не числа. Ваши решения преобразуют содержимое ячейки в ЧИСЛА перед их сравнением. Я сравниваю тексты, подобные
if 12356485 is equal to F12356485
тому, который должен сказатьNOT MATCH
4. @user3682866 Ах, тогда вам следует обновить свое вложение и вопрос репрезентативными данными. В том, что вы опубликовали, у вас есть числа, сохраненные в виде текста, и та же последовательность чисел, сохраненная как числовая, но технически они не совпадают. Я дал вам решение, которое решит эту проблему (и не повлияет на ячейки, содержащие сочетание чисел и строк). Если вы пытаетесь найти экземпляры, в которых 12356485 равно F12356485, это совершенно другая проблема, и для ее решения потребуется либо вспомогательный столбец для выделения чисел из строк, либо более полный VBA. Выберите свой яд…
5. Нет, я пытаюсь найти экземпляры, в которых
12356485
НЕ равноF12356485
, поэтому формула должна выдаватьсяNOT MATCH
. Мне просто нужно сравнить ValueA и ValueB в образце файла Excel, но, хотя ячейки файла примера содержат ТОЛЬКО числа, мне нужно сравнить их как тексты. Сравниваемые значения — это идентификаторы записей, такие как «F1523Q546», «T5T466546» и «65435546»
Ответ №4:
Применительно к вашему случаю, предполагая, что вы сравниваете значения в ячейке A1 листа 1 и значение ячейки A1 листа 2. Хорошей отправной точкой будет попробовать функцию листа Excel, например: =(A1=Sheet2!A1)
введено в ячейку A2 листа 1 и посмотреть результат. На основе результатов перейдите либо к функциям рабочего листа, либо к VBA (при необходимости). В случае, если форматы ячеек отличаются (например, один форматируется как текст, другой как число), преобразуйте оба в текст и примените функцию trim () (на всякий случай). Rgds,
Комментарии:
1. Здравствуйте, я прошу прощения за то, что не указал это в своем сообщении, но да, исходный файл на самом деле представляет собой сравнение листов 1 и 2, такое же, как ваша формула, но проблема, на мой взгляд, заключается в значениях ячеек и в том, как я их сравниваю, поскольку даже пример файла, который я связал здесь, они не совпадают, это не моглов моей формуле сравнения нет ошибки?