Форум пользователей Visio
http://visio.getbb.ru/

Замена текста в нескольких файлах по таблице соответствия
http://visio.getbb.ru/viewtopic.php?f=6&t=1024
Страница 3 из 4

Автор:  AlexDen [ 24 сен 2016, 10:50 ]
Заголовок сообщения:  Замена текста в нескольких файлах по таблице соответствия

Добрый день !

Буду очень благодарен за помощь в решении задачи:
1. Есть схемы в формате "визио" с указанием адресов (это текстовые поля) элементов схемы. (Схема1)
2. Есть таблица соответствия неправильного текста - правильному, колонки А и В соответственно.
Можно ли автоматизировать процесс поиска в нескольких схемах текста из колонки А и их замену на текст из колонки В ?
Дополнено позднее: Тема получила свое продолжение в ветках обсуждения:
Find&Replace Addon For MS Visio
Скорость обработки документов Visio из Excel


Вложения:
1.rar [32.61 Кб]
Скачиваний: 157
IP адреса.xlsx [8.79 Кб]
Скачиваний: 134

Автор:  AlexDen [ 25 сен 2016, 13:33 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Вот нагуглил по перебору всех шейпов.
На схемах действительно всякое бывает.

Содержимое спрятано под спойлер ↓
Спойлер:
Здесь происходит перебор всех шейпов всех страниц с любой степенью вложенности в группах.
Запускать процедуру "a()". Все шейпы выводятся в окно Immediate:

Код:
Dim sh As Visio.Shape
    Dim pg As Visio.Page
    Dim coll As New Collection

    For Each pg In ThisDocument.Pages
        For Each sh In pg.Shapes
            If sh.Shapes.Count>0 Then
                Recursion sh.Shapes, coll
            End If
            coll.add sh
        Next sh
    Next pg
    For Each sh In coll
         Debug.Print sh.NameID
    Next sh
End Sub

Sub Recursion(ByVal shps As Visio.Shapes, coll As Collection)
    Dim sh As Visio.Shape
    For Each sh In shps
        If sh.Shapes.Count>0 Then
            Recursion sh.Shapes, coll 'здесь происходит вызов самой себя
        End If
        coll.add sh
    Next sh
End Sub

Автор:  Tumanov [ 25 сен 2016, 13:40 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Ну, уж если рассматривать все, что бывает, то надо вспомнить о гиперлинках, Custom properties...
А может быть еще и такой случай, что во всех документах нужно заменить Петрова на Сидорова, а вот в последнем не нужно. Или в шейпах типа "Штамп" не менять, а в шейпах типа "Владелец" менять.
То есть в общем случае нужен настраиваемый процессор.

Автор:  AlexDen [ 25 сен 2016, 13:57 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Тогда может первым делом в файле ВСЁ разгруппировать ?
Чтобы сюрпризы не оставались.
Это можно сделать ?

Тем более, что исходный файл мы оставляем, а измененный сохраняем с другим именем.

Автор:  Tumanov [ 25 сен 2016, 14:06 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Цитата:
Тогда может первым делом в файле ВСЁ разгруппировать ?

Здесь все зависит от того, что это за файлы. В некоторых действительно можно все разгруппировать безболезненно. Но таких очень мало. Чаще всего изображение при этом искажается. А функциональность тем более.

Автор:  Shishok [ 25 сен 2016, 20:51 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Сделал ведение лога при работе макроса. Только прежде нужно создать пустой файл Log.txt в целевой папке.
Скачать файл - IP адреса.zip
https://yadi.sk/d/qbpj9WI9d2eqF

Автор:  Shishok [ 26 сен 2016, 10:05 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Добавил простенькую "визуализацию". Качать там же.

Автор:  Surrogate [ 26 сен 2016, 15:30 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Tumanov писал(а):
Так сказать, совместим с процессом обучения. Глядишь, еще кому-то пригодится.
что-то я процесса обучения не увидел в этой ветке обсуждения ? Изображение
Константин Кинчев в песне Все это рок-н-ролл писал(а):
Где воспитательный фактор?
Где вера в светлую даль?
топик-стартер не успевал даже тестить предложенные коды, как появлялись новые !
AlexDen писал(а):
Спасибо всем за горячую поддержку !
Вы быстрее пишете код, чем я его проверять успеваю
в общем помучиться топик-стартеру таки не дали в решении данной задачи ! одна надежда, если топикстартеру захочется
Tumanov писал(а):
еще что-то добавить, усовершенствовать. Понятно, что это можно делать до бесконечности...
придется разбираться с полученным "на шару" некомментированным кодом Изображение
AlexDen писал(а):
Вот нагуглил по перебору всех шейпов.
На схемах действительно всякое бывает.
PS кстати не помешало бы ссылочку дать на первоисточник
9rey в сообщении #1863 писал(а):
Использование приема рекурсии.

Автор:  Tumanov [ 26 сен 2016, 17:03 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Кстати, упоминалось где-то вначале о макросе в Visio...
Провел вот такой эксперимент.
Сделал в файле 20 000 шейпов. Сделал три копии файла.
Вариант 1. Запускаю обработку из Excel
Код:
        Debug.Print Time()
        s = ""
        For Each Shp In doc.Pages(1).Shapes
            s = s & Shp.Text
        Next
        Debug.Print Time()

Вариант 2. Запускаю из Excel макрос в Visio, который делает ту же обработку.
Код:
        Debug.Print Time()
        Call doc.Start
        Debug.Print Time()

Сравниваю данные в протоколе
Код:
Доступ к шейпам из Excel
Имя документа = doc1.vsd
15:16:24
15:16:32
Имя документа = doc2.vsd
15:16:38
15:17:01
Имя документа = doc3.vsd
15:17:07
15:17:30
Доступ к шейпам макросом из Visio
Имя документа = doc1.vsd
15:17:37
15:17:51
Имя документа = doc2.vsd
15:17:57
15:18:12
Имя документа = doc3.vsd
15:18:18
15:18:33
Конец работы

И получается, что обработка в Visio идет почти в два раза быстрее, чем удаленно из Excel. (14 сек против 24 сек)
(Правда, первый документ из всей цепочки обрабатывается гораздо быстрее. Я пока не понял, почему. Но это так, побочный эффект)
Я, правда, ожидал, что эффект будет еще больше, но и в два раза - это тоже полезно.
Тогда получается, что если обработчик (код) сунуть в трафарет. Первым документом открывать этот трафарет. И потом, перебирая документы, обращаться из Excel к макросу в трафарете, то скорость можно повысить почти в два раза.

Автор:  Tumanov [ 26 сен 2016, 17:14 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

А "побочный эффект" тоже интересен.
В только что созданном Application первый документ обрабатывается за 8 сек, а все остальные - по 24 сек.
Вот и думай после этого, а стоит ли Application держать открытым :)
Вообще, процесс заслуживает того, чтобы промерить его более качественно от начала до конца, со всеми промужуточными этапами.

Автор:  AlexDen [ 26 сен 2016, 17:37 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Скорость конечно важный показатель, "лучше пол дня потерять, потом за пол часа долететь" ...
Но на первом же сгруппированном шейпе - облом, программа не увидела, что есть текст для замены.

Сегодня специально посмотрел на боевых файлах - много группировок. Некоторые схемы (потому,что это практически шаблон) затаскивают на пустой лист и правят текст без разгруппировки.

Автор:  Tumanov [ 26 сен 2016, 17:57 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Цитата:
Скорость конечно важный показатель

Так кому что интересно, тот тем и занимается :)

Автор:  Shishok [ 26 сен 2016, 19:12 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

AlexDen, ну-ка попробуй. Я сделал обработку сгруппированных шейпов.

Автор:  AlexDen [ 26 сен 2016, 20:24 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Вроде сработало ! Я правда на скорую руку всего парочку объединил.

Обнаружил другую неприятность
текст : Ответственный Иванов 89131234567 заменяет на
текст : Ответственный Петров 89131234567

если сделать
Ответственный 8-913-987-65-43 Иванов, то заменяет на
Ответственный 8-913-987-65-43 Петров

цифры игнорирует в любом месте

Автор:  Shishok [ 26 сен 2016, 20:59 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Подобного рода неприятность я предполагал стопроцентно. Ведь у тебя фамилии и телефоны находятся в разных строках таблицы. То есть это как бы разные данные. А в шейпах они представлены одной строкой. А строка в шейпе сравнивается со строками таблицы только по 1 разу. Вот один раз и меняет. Видимо фамилии идут раньше телефонов. Попробуй запустить макрос еще раз по файлам (которые уже с приставкой - new).

Автор:  Shishok [ 26 сен 2016, 21:02 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Это конечно не выход. Если в шейпе кроме фамилии и телефона будет и ip, то надо будет и третий раз запускать макрос.

Автор:  Shishok [ 26 сен 2016, 21:16 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Или вот что. В процедуре ReplaceShapeText закомментируй строку
Код:
Exit For ' после замены выходим из цикла

Но это замедлит выполнение макроса.

Автор:  Shishok [ 27 сен 2016, 10:24 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Так. Сделал тот же макрос, но в файле .vsd. Скачай архив 'Замена текста.zip'. Там и файл 'Ip адреса.xlsm' то же есть, подкорректированный. Надо тебе попробовать оба файла запустить на рабочих документах. И смотреть какой быстрее будет. Вот прямо с секундомером "в руках". Выводы какой использовать файл - сам решишь.

Важно:
Если в шейпах будут строки типа "Ответственный Иванов 10.255.0.10", то будет косяк. В таблице есть адрес для замены и 10.255.0.1 и 10.255.0.10. Поскольку 10.255.0.1 идет первым, то результат будет - "Ответственный Петров 10.221.0.110". А такого адреса (10.221.0.110) не существует. Как с этим бороться - не знаю. Вернее знаю, но это вообще уж костылина будет, и очень медленная. Ну а если в шейпе только ip адрес, то нормально работает. Так что смотри.

Автор:  Shishok [ 27 сен 2016, 10:37 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Я написал:
Цитата:
Как с этим бороться - не знаю. Вернее знаю, но это вообще уж костылина будет, и очень медленная.


Пошел курить и тут же мысля возникла. Надо попробовать. Но это ближе к вечеру.

Автор:  Shishok [ 27 сен 2016, 14:05 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Ну надеюсь последний вариант. Поменял концепцию немного. Скачай заново 'Замена текста.zip'.
Запускать файл ReplaceText.vsd.

Автор:  AlexDen [ 27 сен 2016, 18:02 ]
Заголовок сообщения:  Re: Замена текста в нескольких файлах по таблице соответствия

Идея интересная, потестил и понял, что против человеческого фактора программы, видимо бессильны.
1. в тексте может быть разное количество пробелов
2. мне показалось, что более корректно работает, если брать текст ячейки эксел целиком, так можно перечислить возможные варианты написания телефонов
3. встречаются грамматические ошибки в написании фамилий
4. видимо может быть что-то еще.

Необычайно радует, что основная задача замена IP адресов работает !

Описать разбор текста затрудняюсь, но примерно понятно из лога (я его откомментировал)
Цитата:
Начало записи: 27.09.2016 20:08:03 ' певый запуск

Документ: C:\testFOLDERtest\Схема1.vsd
Лист: Page-1 (на листе есть объединение шейпов)

Sheet.10: 10.255.0.1 > 10.221.55.55 ' адреса поменял ОТЛИЧНО ВЕЗДЕ (далее не комментируется)
Sheet.15: 10.255.0.2 > 10.221.66.66
Sheet.17: 10.255.0.3 > 10.221.77.77
Sheet.23: Ответственный Пупкина Ж.Ж. +7-234-567-89-00 > +7-999-888-77-77 ' заменил ТОЛЬКО телефон ,

Лист: Page-2 (на листе есть объединение шейпов)
Sheet.10: 10.255.0.11 > 10.221.11.11
Sheet.15: Ответственный 913-666-55-44 Иванов И.И. > 8-913-333-22-11 ' поменял ТОЛЬКО телефон
Sheet.11: 10.255.0.22 > 10.221.22.22
Sheet.12: 10.255.0.33 > 10.221.33.33
Sheet.16: Ответственный Пупкина Ж.Ж. +7-234-567-89-00 > +7-999-888-77-77 ' поменял ТОЛЬКО телефон

Лист: Page-3 (на листе нет объединения шейпов)
Sheet.10: 10.255.255.252 > 10.221.0.01
Sheet.15: 10.255.255.253 > 10.221.0.02
Sheet.22: Ответственный 913-666-55-44 Иванов И.И. > 8-913-333-22-11 ' поменял ТОЛЬКО телефон
Sheet.17: 10.255.255.254 > 10.221.0.03
Sheet.23: Ответственный Пупкина Ж.Ж. +7-234-567-89-00 > +7-999-888-77-77 ' поменял ТОЛЬКО телефон
Добавил в таблицу эксел строки
Цитата:
Иванов Петров
И.И. П.П.
Пупкина Шмупкина
Ж.Ж. З.З.
и запустил тот же файл
Цитата:
Начало записи: 27.09.2016 20:17:21

Документ: C:\testFOLDERtest\Схема1.vsd

Лист: Page-1 (на листе есть объединение шейпов)
Sheet.10: 10.255.0.1 > 10.221.55.55
Sheet.22: Ответственный 81234567899 Иванов И.И. > Петров
Sheet.15: 10.255.0.2 > 10.221.66.66
Sheet.17: 10.255.0.3 > 10.221.77.77
Sheet.23: Ответственный Пупкина Ж.Ж. +7-234-567-89-00 > З.З. 'заменил только отчество
Sheet.23: Ответственный Пупкина З.З. +7-234-567-89-00 > +7-999-888-77-77 ' поменял ТОЛЬКО телефон

Лист: Page-2 (на листе есть объединение шейпов)
Sheet.10: 10.255.0.11 > 10.221.11.11
Sheet.15: Ответственный 913-666-55-44 Иванов И.И. > 8-913-333-22-11
Sheet.15: Ответственный 8-913-333-22-11 Иванов И.И. > Петров 'заменил только фамилию
Sheet.11: 10.255.0.22 > 10.221.22.22
Sheet.12: 10.255.0.33 > 10.221.33.33
Sheet.16: Ответственный Пупкина Ж.Ж. +7-234-567-89-00 > З.З. 'заменил только отчество
Sheet.16: Ответственный Пупкина З.З. +7-234-567-89-00 > +7-999-888-77-77

Лист: Page-3 (на листе нет объединения шейпов)
Sheet.10: 10.255.255.252 > 10.221.0.01
Sheet.15: 10.255.255.253 > 10.221.0.02
Sheet.22: Ответственный 913-666-55-44 Иванов И.И. > 8-913-333-22-11
Sheet.22: Ответственный 8-913-333-22-11 Иванов И.И. > Петров
Sheet.17: 10.255.255.254 > 10.221.0.03
Sheet.23: Ответственный Пупкина Ж.Ж. +7-234-567-89-00 > З.З.
Sheet.23: Ответственный Пупкина З.З. +7-234-567-89-00 > +7-999-888-77-77
Адреса IP и телефоны меняет совершенно верно

Страница 3 из 4 Часовой пояс: UTC + 3 часа [ Летнее время ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/