Нужна помощь в доработке запускаемого из Excel макроса обработки Word-файла (кнопка на листе "Л" ;) . Точнее - не хватает куска кода, обозначенного как '***** ДОПОЛНЕНИЕ ТАБЛИЦЫ НТД *****. Макрос должен: - найти разбросанные в Word-файле номера вида [^#^#] и [^#^#^#], не содержащиеся в БС (таблице, которую можно найти по закладке "p_Список" ;) - составить из найденных результатов отсортированный по возрастанию список номеров (без повторов) - подгрузить для них вид и наименование НТД с листа "Л" Excel - интегрировать полученный перечень в таблицу NT, выделив его цветом * Очищать (удалять) таблицу NT нельзя!
Конечно, всё это можно выполнить вручную (см. видео и выделенный оранжевым кусок таблицы в файле Тест.docx). Но очень нужно автоматизировать! Своих мозгов и знаний VBA не хватает.
Выручайте, Товарищи!
Изменено: Acid Burn - 27.01.2013 18:03:51(Относительно задачи от 20.01.2013 всё сильно упростилось.)
Да уж, настолько точно описали, что получилось техзадание из 5 пунктов... Задавали бы вы конкретные вопросы по каждому пункту - тогда было бы больше шансов, что кто-то поможет.
PS: В макросе больше всего понравилось это:
Цитата
'•••••••••••••••••••••••••••••••••••• ' СОЗДАНИЕ СПИСКА НТД '•••••••••••••••••••••••••••••••••••• Sub НТД_Make() MsgBox "Упс..." End Sub
To EducatedFool Говорю ж меня на этом замкнуло ))) При этом макрос НТД_Proc вроде полностью рабочий.
Пока бьюсь над этими вопросами: 1. Как из Word-файла зачитать все элементы вида [^#^#^#] в столбец "O" Excel-файла 2. Как в макросе НТД_Proc подсчитать Z
Да не на этом замкнуло. Вам и намекают, и прямо пишут... Вы написали целое задание, и копаться-разбираться никому, как видите, не хочется.
Создайте отдельные темы по каждому вопросу. Если вопросы одного направления - можно в одну (но это не значит, что вопросы, объединенные только Вашей задачей, можно считать одного направления). К каждой теме - небольшие подопытные файлы с Вашими наработками для иллюстрации вопроса и для работы с ними. Иначе долго ждать будете.
vikttur пишет: небольшие подопытные файлы с Вашими наработками для иллюстрации вопроса и для работы с ними.
В первом посте постарался по максимуму всё расписать и приложить. Относительно 20.01.2013 задача сильно упростилась. Надеюсь, кто-нибудь откликнется и поможет добить макрос!
Sub FindText2()
Dim MyAR() As String
Dim i As Long
i = 0
With Selection
.HomeKey Unit:=wdStory
.Find.Text = "[^#^#^#]"
End With
Do While Selection.Find.Execute = True
ReDim Preserve MyAR(i)
MyAR(i) = Selection
i = i + 1
Loop
For i = LBound(MyAR) To UBound(MyAR)
Debug.Print MyAR(i)
Next i
End Sub
Он выводит все найденные результаты в окно VBA Immediate (можно открыть по Ctrl+G). Как сделать, чтобы результаты без повторов выводились в Excel на лист "Л" в столбец "O"?
Acid Burn пишет: Как сделать, чтобы результаты без повторов выводились в Excel на лист "Л" в столбец "O"?
Для начала нужно этот код адаптировать под Эксель, а именно: 1. Создать word application 2. Открыть нужный Ворд документ 3. Переделать последнюю часть кода, значения выводить в коллекцию, чтобы отсечь повторяющие значения 4. Вывести коллекцию на лист
Пс. Таких примеров куча, как на Планете, так и интернете. Юзайте поиск.
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
Добавил Ваш код в Module2. Также ввёл: - поиск "[^#^#]" дополнительно к "[^#^#^#]" - сортировку полученной коллекции - выборку по полученным результатам № и названия НТД с листа "Л" Excel - перенос данных в Word с выделением новых строк жёлтым цветом Цель почти достигнута!
Вопрос: как исключить из nC результаты, содержащиеся в таблице NT и оптимизировать мой корявый код?
PS: Если уважаемые Модераторы вновь сочтут данные вопросы не относящимися к теме "Экспорт и обработка данных в Word", прошу удалить данную тему.
Господа, день на исходе, но решения поставленной задачи пока не видно. Пытаюсь сделать следующее: - сформировать из первого столбца таблицы NT коллекцию nC1 - сравнить её с nC - уникальные значения из nC (те, которых нет в nC1) обозначить как nC2 Может кто-то из профессионалов Планеты что-нибудь посоветует? Я вообще на правильном пути или надо как-то иначе действовать?
Зачитал в коллекцию 1 весь документ, в коллекцию 2 - только первый столбец таблицы NT. Как убрать из коллекции 1 результаты, которые есть в коллекции 2?
Просто пройтись двумя циклами по коллекциям, с помощью оператора if найти одинаковые значения, и с помощью свойства remove (у коллекции) по счетчику цикла удалить нужный элемент из коллекции
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
To LightZ Я думал достаточно будет сравнить элементы первой коллекции со второй... Но не догнал, как выполнить перебор и удаление элементов по критерию. Буду разбираться...
To Юрий М Cогласен, что сразу формировать список уникальных элементов было бы правильнее и быстрее. Но как это реализовать вообще не представляю...
To Юрий М. Но первая "таблица" - это Word-файл, вторая - это реально таблица, но тоже в Word'e. Поэтому могу упростить, убрав лишь несколько лишних строк. Как понимать P.S.?
Acid Burn, если Вы еще не поняли, тогда разъясню Вам ситуацию - копаться в Ваших файлах с кучей макросов никто не хочет и я на 90% уверен, что никто не будет. Если же Вы действительно хотите, чтобы Вам помогли (я конечно не уверен, что у кого-то еще осталось желание это делать, после Ваших то сообщений, как например цитата приведенная ниже) - сделайте маленький пример в файле формата .xls, с двумя таблицами и Вашими "попытками" извлечь уникальные значения коллекцией.
Цитата
Acid Burn пишет: Господа, день на исходе, но решения поставленной задачи пока не видно.
Киса, я хочу Вас спросить, как художник — художника: Вы рисовать умеете?
LightZ, а что такого в моей цитате? Я на самом деле просидел весь день в поисках решения. Или Вы думаете, что я только выкладываю задачи вам, не думая как их решить самому?
Что ж я Вам такого сделал то? Чем заслужил такое отношение? Ведь другие вылезают на форум, вообще не пытаясь разобраться ни в чём, и им помогают. Я же пытаюсь сам что-то понять, написать. Вот только с массивами и коллекциями у меня туго. А Вы сразу с плеча рубите.
Реально перемудрил с массивами/коллекциями - на самом деле всё оказалось проще. :) В итоге макрос 100%-рабочий и достаточно быстрый. По любому работает быстрее меня: вместо пары часов ему надо минут 5 (от 4 до 32 опер/с).
В целом макрос умеет: 1. Запрашивать открытый или закрытый Word-файл для обработки 2. Работать с включённым и отключённым экраном по выбору пользователя 3. Обновлять поля Word 4. Находить отсутствующие в таблице НТД номера документов путём анализа Word-файла 5. Дополнять таблицу НТД списком недостающих документов с выборкой данных по ним из Excel 6. Считать число ссылок на НТД в Word-файле 7. Вводить новую нумерацию и закладки для списка НТД, удаляя старые поля и закладки (старый номер остаётся во вспомогательном столбце) 8. Вводить гиперссылки на НТД в Word-файле, удаляя старые поля 9. Считать время выполнения на основе очень точного таймера
Огромное спасибо: - SVA за WdGoToItem Enumeration, код выбора файла, а также помощь с подсчётом заполненных строк, вводом закладок и гиперссылок! - LightZ за совет с коллекциями - Юрий М за моральную поддержку
В принципе, тему можно закрывать. Хотя всё ещё надеюсь, что кто-нибудь поможет улучшить алгоритмы и скорость готового макроса.