Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418

Сравнение строк в Excel

26.06.2013, 16:31. Показов 4203. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Проблема такая. Имею 3 файла: 1) Список сформированый из 1с; 2) Список сформированый в какой-то старой 1-се и редактировался в опен офисе; 3) Файл обработки сделаный в микрософт офисе
Так подробно описываю ибо не могу понять в чём причина, и может это важно.

Вообщем обработка в определённый момент делает так чтоб сотрудник с инициалами получал полное имя. Соотвестсвенно

Файл 1:
|Иванов Иван Иванович|
|Петров Петр Петрович|

Файл 2:
|Иванов И.И.|
|Петров П.П.|

Информация из файла 2 переносится в файл 3 (обработки). Там открывается файл 1 и

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
Set sotr = Workbooks("Список").Worksheets(1)
Set spis = ThisWorkbook.Worksheets(9)
'список начинается со второй ячейки
i = 2
 
Do While spis.Cells(i, 1) <> ""
    'если нашли инициалы
    If spis.Cells(i, 1).Value Like "*.*" Then
        spis.Cells(i, 1).Replace what:=".", replacement:=" "
        'чиним регистр на всякий случай
        spis.Cells(i, 1) = StrConv(spis.Cells(i, 1), vbProperCase)
        'Делаем вместо Иванов И.И. -> Иванов*И*И* для поиска
        spis.Cells(i, 1).Replace what:=" ", replacement:="*"
        'второй список начинается с седьмой ячейки
        k = 7
        'Сравниваем с полным ФИО при совпадении заменяем основное
        Do While sotr.Cells(k, 2) <> ""
            If spis.Cells(i, 1).Value Like sotr.Cells(k, 2).Value Then
                spis.Cells(i, 1).Value = sotr.Cells(k, 2).Value
                Exit Do
            End If
        k = k + 1
        Loop
    End If
i = i + 1
Loop
Что интересно. После выполнения кода оказывается что он ведёт себя по разному при равных условиях. К примеру Иванов И.И. действительно становится Иванов Иван Иванович. А Петров П.П. отсаётся Петров*П*П*. Соотвестсвенно я проверил и даже руками аккуратно вписал Петров П.П. и Петров Петр Петрович, не помогает. А вот если скопировать ячейчу Петров Пётр Петрович в файл с инициалами и переписать на П.П., тогда после отработки кода всё работает.
Вот не пойму где проблему искать с кодировками что-то не то или я чего-то не понимаю. И почему если одинаковые данные ввести руками то код не работает, а если копировать, то работает. Не понятно. На косяки типо криво ввёл проверил 168 миллионов раз
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.06.2013, 16:31
Ответы с готовыми решениями:

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

Сравнение строк в Excel
Всем привет! Столкнулся с задачей, достаточно интересной, но в виду отсутствия у меня опыта работы со строками, очень для меня непростой....

Сравнение строк в Excel на совпадение
Смысл такой: Товар на складе до ревизии Смысл такой: Товар на складе до ревизии Наименование Кол-во Цена Сумма Молоко 1 ...

13
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.06.2013, 17:10
А если Илионор Иванович? Или Петр Павлович? Думаю, привязку надо брать от чего-то другого, что индивудуальное для записи. А ФИО уже вытягивать по этому критерию.
0
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
26.06.2013, 18:11  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
А если Илионор Иванович? Или Петр Павлович? Думаю, привязку надо брать от чего-то другого, что индивудуальное для записи. А ФИО уже вытягивать по этому критерию.
С уникальностью ФИО нет проблем. Это кусок кода, там ещё проверяется в каком человек подразделении трудится. А подразделений много, но в них человек по 10-20. За 3 года ток один случай был повторения фио и инициалов был. Их индивидуально обрабатывать проще.

Сейчас поковырял вот так работает

Visual Basic
1
spis.Cells(i, 1).Value = sotr.Range(sotr.Cells(7, 2), sotr.Cells(65536, 2)).Find(What:=spis.Cells(i, 1))
Но тут возникает проблема обработки ошибок, если человек не найден. Трай блока или кого нибудь в таком духе нету (или есть, но не нашёл в хэлпе). А как вставил On Error GoTo ErrorHandler сразу посыпались какие-то левые ошибки, которые раньше не возникали. Сейчас сижу разбираюсь как их лечить. Странные они например ошибка 0 без описания. Или 20 продолжить без ошибок.

Добавлено через 11 минут
А кроме как к фио привязаться больше не к чему. Так как документ с инициалами содержит только ФИО и цифры.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.06.2013, 18:45
Handler - предлагает обработку в ручном режиме. Что 0 - могу только догадываться. Может, выкидывает, что Err.Number = 0 (i.e. - ошибка отсутствует)? 20 означает как правило пропущенное Exit Sub (!!! не End Sub !!!). Попробуйте отказаться от Handler и использовать On Error Resume Next - перед проблемным участком, прошли - проверка на Err.Number. Если Err.Number > 0 значит проблема была и нужно делать одно, если Err.Number = 0 - все хорошо и делать другое. И главное, не забывать после прохождения проб-го участка возвращаться к обычной обработке (On Error goto 0).

Добавлено через 25 минут
Вобще, мне как-то странно выглядит такая запись:
= sotr.Range(sotr.Cells(7, 2), sotr.Cells(65536, 2))
Так мне больше привычно:
= sotr.Range(Cells(7, 2), Cells(65536, 2))
И читается как-то правильно. Дальше Find должна возвратить диапазон/ячейку, а не ее значение. Странна запись - записать в такую ячейку то, что ищем, а ищем именно то, что в этой ячейке уже записано. Посмотрите сами.
1
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
26.06.2013, 18:59  [ТС]
А с этим вариантом наконец-то заработало. Спасибо огромное!!!
А по поводу первоначального варианта есть мысли, почему может не работать сравнение? А-то раздражает. И ладно бы на всех не работало, так эта зараза процентов 10 только заворачивает.

А за Range - Это уже привычка. Как-то раз я пропустил подобный sotr и очень не хорошо попал, ибо при тесте всё отработало как надо. А на деле если выделить не тот лист... вообщем перегавнял кучу информации, а с бэкапами вечно беды, теперь предпочитаю писать везде =)

Добавлено через 8 минут
А запись работает, и это главное. А записать то что ищем логично потому что звёзды будем менять на настоящие быквы =) Хотя вы правы. Коммент надо себе написать
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.06.2013, 19:05
Так один раз достаточно указать листТакойто.ДиапазонТакойто. А Вы пишете листТакойто.диапазон(листТакойто....
1С - очень своеобразная программа. Наумничали, гении, дальше некуда. Причин может быть много. Гении иногда любят вставлять какие-то невидимые символы (например, пробелы), буквы другой раскладки ("а" при англ. etc.). Невидимые проверьте через длину (H121!!! ) - функция Len(). Если длину, например, Иван покажет больше 4 - ищите адрес гениев и скажите им все!!! С раскладкой немного сложнее.
0
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
26.06.2013, 20:27  [ТС]
Не, ну пройтись тримом и заменить 2 пробела на один - это стандартные операции с любой информацией, которою трогал бухгалтер. Проверил, длинна совпадает с ожидаемой. А вот про символы в иной раскладке не догадался, вот они где мастерство и опыт
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
26.06.2013, 20:44
Обычно в 1С вставляют символ Chr(10)... но могут быть и другие...
0
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
26.06.2013, 20:48  [ТС]
Это же новая строка вроде. Её и визуально видно
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.06.2013, 21:08
Видно, если до и после что-то есть.... И не обязательно два пробела на один. Хватит и того, что гений силой прописал один пробел в конце (или спереди, а выравнивание гор-е по центру). Вот ламайте тогда голову!

Добавлено через 3 минуты
Коточе, подходите как к ужасной халтуре. Не ошибетесь.
0
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
26.06.2013, 21:17  [ТС]
Цитата Сообщение от Igor_Tr Посмотреть сообщение
Хватит и того, что гений силой прописал один пробел в конце (или спереди, а выравнивание гор-е по центру).
Так тримом прошёлся. Просто до части, которую выклал. Главное со своими косяками разобрался, а дальше разберусь
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
26.06.2013, 21:34
Игорь, это не работает:
Visual Basic
1
a = sotr.Range(Cells(7, 2), Cells(65536, 2))
я пишу обычно так:
Visual Basic
1
2
3
With sotr
a = Range(.Cells(7, 2), .Cells(65536, 2))
End With
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
26.06.2013, 22:16
Если честно, я такое и не проверял, и не использовал. Написал, потому-что увидел сплошные Worksheet(ы): Worksheets().Range(Worksheets().cells(), worksheets().cells()).

Добавлено через 21 минуту
Да, Вы правы. Вот такое точно не работает:
Visual Basic
1
2
3
   dim a as range
   Set a = Worksheets("Sheet1"). _
         Range(Worksheets("Sheet1").Cells(1, 1), Worksheets("Sheet1").Cells(5, 10))
Но что б мы не запутали korvindeson, а вот такое точно тоже работает:
Visual Basic
1
2
dim a as string
    a=Worksheets("Sheet1").Cells(x, y).value
0
1261 / 147 / 32
Регистрация: 11.02.2011
Сообщений: 418
27.06.2013, 09:22  [ТС]
Не знаю что там не должно работать, но по факту работа делается, крайних моментов не вижу
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.06.2013, 09:22
Помогаю со студенческими работами здесь

Как Excel документ, в котором 10000 строк, разбить по 10 строк и сохранить каждые 10 строк в отдельный файл
Здравствуйте. Подскажите как Excel документ в котором 10000 строк разбить по 10 строк и сохранить каждые 10 строк в отдельный файл. Нашел...

Сравнение строк в двух Excel-файлах
Доброго дня. Есть два файла Excel. Как сравнить строку одного файла со строкой другого файла и в зависимости от результата сравнения...

Функции работы со строками символов: определение размера строки, копирование строк, добавление строк, сравнение строк
На языке Ассемблер написать функции работы со строками символов: определение размера строки, копирование строк, добавление строк, сравнение...

Сравнение строк одной БД с другой либо как избавится от ненужных строк
Доброе время суток! Проблема состоит в следующем. Есть корпоративная БД (то есть структуру придумывал не я) в ней есть две таблицы P с...

Сравнение строк введенных в грид и строк из массива
У меня есть массив с строками.(максимальная длина строки 8 символов, минимальная длина 3 символа). Также есть stringgrid в который я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru