12 / 11 / 3
Регистрация: 07.09.2015
Сообщений: 256
21.04.2020, 13:45
7
Narimanych,
Сообщение от Narimanych
Кикие следующие действия после нахождения?
Да там, задача простая. В определённой таблице (именно в таблице №7) найти текст в строке, (например: «Отчёт №3», а их например всего пять),
и удалить все строки
(со столбцами)
идущие до этого текста
(в таблице).
Т.е. скажем так: укоротить таблицу, обрезая её с начала. А флагом остановки, служит искомый текст. Это, то я реализую. Хотя если будет, хороший пример (как выше), буду благодарен.
Сообщение от Narimanych
Visual Basic | ||
|
Блин, спасибо! Красивая реализация!
Вот совсем запамятовал про Метод «Like»
И с
Visual Basic | ||
|
тоже круто Нуб я в Word…
Не по теме:
Думаю: Т.к. мне искать только в одной таблице, всё ок.
А вот если перебирать каждую ячейку, например в 10 таблицах, то конечно, возможно, метод «Like» не так быстро справится как метод «Find». (не стану писать, что подвиснет, но … есть немного похожий код с выравниванием, вот там тоже все ячейки перебираются, ворд, как-то с этим грустно, справляется).
Добавлено через 24 минуты
Narimanych,
Сообщение от Narimanych
Кикие следующие действия после нахождения?
На самом деле, ещё один нюанс. Надо будет, потом, после строки (заголовка — «Отчёт №6», она без столбцов) найти максимальное число в последних 4 столбцах (всего столбцов 8).
Хотя опять же, уверен с этим справлюсь.
Не по теме:
Сообщение от Schumacher57
А вот если перебирать каждую ячейку, например в 10 таблицах, то конечно, возможно, метод «Like» не так быстро справится как метод «Find»
Зря. Всё чётко, и быстро отработал. Проверил, сейчас.
0
Формулировка задачи:
Добрый день! Есть документы word, в каждом есть определенная табличка 3*3 с какой то информацией! Заполнять ее надо из Excel. Она находится в середине текста. Ее порядковый номер я не знаю, перед ней могут быть еще таблицы. Помогите ее идентифицировать. Решил устроить поиск по уникальному тексту.
Ну нашли, а что нашли и где оно! Не очень понимаю работу ворда и Vba.
Код к задаче: «Макрос поиска таблицы в word»
textual
Листинг программы
Dim wdApp As Word.Application Dim wdDoc As Word.Document Dim wdTable As Word.Table Set wdApp = GetObject(, "Word.Application") Set wdDoc = wdApp.ActiveDocument With wdDoc.Content.Find .Text = "Сметная стоимость" .Execute If .Found = True Then Set wdTable = .Parent.Tables(1) wdTable.Cell(1, 1).Range = "Ячейка <a1>"</a1> wdTable.Cell(3, 3).Range = "Ячейка <c3>"</c3> End If End With
Полезно ли:
5 голосов , оценка 3.400 из 5
Похожие ответы
- Макрос поиска одного из указанных символов в Word
- Макрос поиска и замены дат в документе Word
- Word Поиск таблицы в документе
- Word: макрос для таблиц. Отформатировать определенный вид таблиц
- Макрос в Excel, использующий Word
- Создать таблицу в Word и заполнить её данными из массива
- Перенос таблицы из Word в Excel
- Создание нескольких таблиц в Word
- Как объединить ячейки таблицы в Word, обращаясь к ним по свойству Cell (n, m)
- Как изменить размер изображения, вставленного в ячейку таблицы MS Word?
- Импорт данных из Excel в таблицу колонтитула Word
Sub Поиск_и_вставка()
Dim tbl As Table
‘1. Цикл по всем таблицам в файле в поисках нужной таблицы.
For Each tbl In ActiveDocument.Tables
‘ Если начало таблицы находится на странице 3, то выход из цикла, при этом таблице,
‘ которая находится на странице 3, будет присвоено vba-имя «tbl».
If ActiveDocument.Range(Start:=tbl.Range.Start, End:=tbl.Range.Start). _
Information(wdActiveEndPageNumber) = 3 Then
Exit For
End If
Next tbl
‘2. Проверка, была ли найдена нужная таблица.
If tbl Is Nothing Then
MsgBox «На странице 3 нет таблицы.», vbExclamation
Exit Sub
End If
‘3. Вставка в конец таблицы строки.
tbl.Rows.Add
End Sub
Something like this:
Sub ReplaceTables()
Dim oTable As Table
Dim oRng As Range
For Each oTable In ThisDocument.Tables
If oTable.Rows.Count > 1 And oTable.Columns.Count > 1 Then
If IsNumeric(oTable.Cell(2, 1).Range.Words(1).Text) And _
IsNumeric(oTable.Cell(2, 2).Range.Words(1).Text) Then
Set oRng = oTable.Range
oTable.Delete
oRng.Text = "[TABLE]" & vbCrLf
End If
End If
Next
Set oTable = Nothing
Set oRng = Nothing
End Sub
It loops through all the tables in the document, checks in the first two cells in the second row if the first word is numeric, and if so deletes the table and puts the [TABLE] text and a new line instead.
Hope this helps.
Addition:
To check for 4 columns or more, and the presence of a $ sign in the text of the table, use this check instead:
If oTable.Columns.Count >= 4 Then
If InStrRev(oTable.Range.Text, "$") > 0 Then
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 23.11.2010 20:10:43
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Тема: Поиск в тексте включая таблицы — проблемы и !решение
В ходе работы по автоматизации поиска аббревиатур в документе столкнулся с тем, что в случае нахождения моего искомого выражения в части документа, являющегося таблицей поиск залипает — зацикливается
Dim MyRange, oRange As Range
Dim MyRangeEnd As Long
Dim strAcronym As String
Set MyRange = ActiveDocument.Range
MyRangeEnd = MyRange.End
strListSep = Application.International(wdListSeparator)
Set oRange = MyRange
With oRange.Find
.Text = "<[A-ZА-ЯЁ]{2" & strListSep & "}>"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True
.MatchWildcards = True
'Perform the search
Do While .Execute
'Continue while found
strAcronym = oRange
' VERY IMPORTANT line as for some docs Search gets stuck in headers/footers etc.
If strAcronym = "" Then oRange.Start = oRange.Start + 1
Debug.Print oRange.Start, "Table=" & Selection.Information(wdWithInTable), strAcronym
'***********************************************************************
'Манипуляции с найденным
oRange.Expand Unit:=wdSentence
Debug.Print strAcronym, oRange 'печать сокр. и предложения где оно найдено
'***********************************************************************
If oRange.Information(wdWithInTable) = True Then
oRange.MoveEnd wdCharacter, -1
Else
oRange.Start = oRange.End
oRange.End = MyRangeEnd
End If
Loop
раскопал следующее:
внешняя ссылка
If the end of the range includes the cell marker, then the range includes the whole cell regardless of where you set the start value.
А именно — если диапазон включает маркер конца ячейки, то диапазон расширяется на ВСЮ ячейку, независимо от того, какое задано значение Start
Не знаю как это связано, но именно взяв из указанного примера подход oRange.MoveEnd wdCharacter, -1
удалось добится работоспособности кода как в основном тексте, так и в таблицах. Да, еще и колонтитулы проскакивает.
В общем, дополнения исправления и т.д. приветствуются. Так, например я расширяю диапазон на oRange.Expand Unit:=wdSentence — если кто предложит как по другому получить на этот же диапазон ссылку без расширения oRange было бы лучше, а то там по моему опасению запрятан потенциальный глюк.
З.Ы.
Если соберусь — выложу потом еще код поиска ссылок типа (ХХ-)XXX-XX-XXXX-XXXXXX — госты, осты и др. стандарты… в работе…
Отредактировано VBA-addict (24.11.2010 11:17:54)
Делай, что можешь, и будь, что будет!
2 Ответ от andrkar 23.11.2010 20:44:12
- andrkar
- Модератор
- Неактивен
- Откуда: Томск
- Зарегистрирован: 10.03.2010
- Сообщений: 431
- Поблагодарили: 26
Re: Поиск в тексте включая таблицы — проблемы и !решение
По стандартам было бы интересно посмотреть и потестировать.. У самого некоторые задумки тоже есть по этому поводу:)
Мой механизм в макросе по поиску аббревиатур не смотрели? может что полезное для себя найдете??? Лежит в готовых решениях..
Отредактировано andrkar (23.11.2010 20:45:40)
3 Ответ от Вождь 24.11.2010 07:59:30
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Поиск в тексте включая таблицы — проблемы и !решение
Ваш код ищет только первый акроним в предложении. Так и задумано?
Чтобы не было зацикливаний, всегда продолжайте поиск с конца найденного текста. Если все же изменяете область, то не переходите за знак абзаца.
Попробуйте так:
Dim strSentence As String
With oRange.Duplicate
.Expand Unit:=wdSentence
strSentence = .Text
End With
Debug.Print strAcronym, strSentence
oRange.Collapse Direction:=Word.wdCollapseEnd
Макросы под заказ и готовый пакет — mtdmacro.ru
4 Ответ от VBA-addict 24.11.2010 11:46:42
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Re: Поиск в тексте включая таблицы — проблемы и !решение
Вождь пишет:
With oRange.Duplicate
.Expand Unit:=wdSentence
strSentence = .Text
End With
Вождь, спасибо!!! То, что доктор прописал
Вождь пишет:
oRange.Collapse Direction:=Word.wdCollapseEnd
Это кому как Мне не подходит, т.к. моя задумка шире — не приведена здесь MyRange — в зависимости от ситуации принимает разные значения — По умолчанию — весь документ, при зажатом Ctrl c текущего места и до конца, при зажатом Shift — только в выделении
Интересующимся поправленный вариант:
Dim MyRange, oRange As Range
Dim MyRangeEnd As Long
Dim strAcronym As String
Set MyRange = ActiveDocument.Range
MyRangeEnd = MyRange.End
strListSep = Application.International(wdListSeparator)
Set oRange = MyRange
With oRange.Find
.Text = "<[A-ZА-ЯЁ]{2" & strListSep & "}>"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True
.MatchWildcards = True
'Perform the search
Do While .Execute
'Continue while found
strAcronym = oRange
' VERY IMPORTANT line as for some docs Search gets stuck in headers/footers etc.
If strAcronym = "" Then oRange.Start = oRange.Start + 1
Debug.Print oRange.Start, "Table=" & Selection.Information(wdWithInTable), strAcronym
'***********************************************************************
'Манипуляции с найденным
With oRange.Duplicate
.Expand Unit:=wdSentence
strSentence = Trim(Replace(.Text, vbCr, ""))
End With
Debug.Print strAcronym, strSentence 'печать сокр. и предложения где оно найдено
'***********************************************************************
If oRange.Information(wdWithInTable) = True Then
oRange.MoveEnd wdCharacter, -1
Else
oRange.Start = oRange.End
oRange.End = MyRangeEnd
End If
Loop
End With
Делай, что можешь, и будь, что будет!
5 Ответ от Вождь 24.11.2010 13:11:13
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Поиск в тексте включая таблицы — проблемы и !решение
С полным кодом все стало ясно. Во народ скрытный пошел
Надо менять алгоритм, иначе будет и дальше в таблицах зацыкливатся. Для ясности, поместите курсор в середине таблицы и запустите код:
Dim R As Range
Set R = Selection.Range
R.End = R.StoryLength
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = False
.Text = "^?"
End With
R.Find.Execute
R.Select
Искать надо не в заданной области, а просто вперед проверяя попадание результата в область поиска. Где-то так:
Dim RWork As Range
Dim RFind As Range
Set RFind = RWork.Duplicate
With RFind.Find
'...
.Wrap = wdFindStop
End With
RFind.Collapse wdCollapseStart
Do While RFind.Find.Execute
If RFind.End > RWork.End Then Exit Do
'...
RFind.Collapse wdCollapseEnd
Loop
Макросы под заказ и готовый пакет — mtdmacro.ru
6 Ответ от VBA-addict 24.11.2010 13:45:38
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Re: Поиск в тексте включая таблицы — проблемы и !решение
Вождь пишет:
Для ясности, поместите курсор в середине таблицы и запустите код:
Поместил, запустил — заданый код выделяет первый символ первой ячейки текущей строки таблицы — но ясности это мне не добавило Запустил в таблице со объединенными ячейками — выделяет самую левую необъединенную ячейку после 1 объединенной. В общем — неясно.
Второй пример кода тоже не вразумил
Понял, что:
1) Поиск осуществляется по дубликату Range RWork
2) Поиск запускается с начала диапазона RWork RFind.Collapse wdCollapseStart ?
3) В цикле проверяется не заскочил ли RFind за RWork.End — если да, то завершается работа
Не понял главное — зачем так?
Duplicate, видимо, чтобы невозможно было что-то поменять, т.к. он Read only — ОК
А вот зачем проверять заскок — если определена работа до конца диапазона… непонятно…
Отредактировано VBA-addict (24.11.2010 13:50:06)
Делай, что можешь, и будь, что будет!
7 Ответ от Вождь 24.11.2010 17:23:45
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Поиск в тексте включая таблицы — проблемы и !решение
Первый мой код наглядно иллюстрирует алгоритм работы Вашего кода. Т.е. зацикливание, когда поиск в заданной области, а начало этой области в таблице.
Второй мой код ищет не в области (она схлопнута), а вперед, начиная с текущей позиции. В этом случае зацикливание исключено. Найденный фрагмент проверяется на попадание в область поиска.
Макросы под заказ и готовый пакет — mtdmacro.ru
8 Ответ от VBA-addict 24.11.2010 18:16:54
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Re: Поиск в тексте включая таблицы — проблемы и !решение
Вождь пишет:
R.Find.Execute
R.Select
На мой скромный взгляд не является полным док-вом зацикливания в табл.
если заменить на:
For i = 1 To 250
R.Find.Execute
R.Select
Selection.Font.Bold = True
Next
то видно, что все замечательно идет по/выходит из таблицы
Вопрос в том, что начало для диапазона поиска в таблице действительно берется не совсем корректно в случае выделения. Тут согласен.
Т.о. для заинтересовавшихся
Приведенный мной выше код будет работать некорректно, в случае отнесения oRange на кусок выделенный внутри таблицы. Необходима доп. адаптация для определения позиции курсора внутри ячейки таблицы и т.п.
Единственное, что на данный момент у меня для такой точности необходимости нет — все таблицы в моем случае шерстятся целиком
Отредактировано VBA-addict (24.11.2010 18:19:22)
Делай, что можешь, и будь, что будет!
9 Ответ от Вождь 24.11.2010 20:45:22
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Поиск в тексте включая таблицы — проблемы и !решение
Ну как же? В моем примере зацикливания, поиск запускается в области от курсора до конца документа, а находит вообще за этой областью. Ведь сами же пробовали:
VBA-addict пишет:
…запустил — заданный код выделяет первый символ первой ячейки текущей строки таблицы…
А должен быть найден первый символ за курсором!
VBA-addict пишет:
…все таблицы в моем случае шерстятся целиком…
Используется другой макрос? Если нет, то зацикливания не избежать. Для полной ясности доработал мой демонстратор циклом и выделением найденного красным:
Dim R As Range
Set R = Selection.Range
With R.Find
.ClearFormatting
.Replacement.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = False
.Text = "^?"
End With
Do While R.End < R.StoryLength - 1
R.Collapse wdCollapseEnd
R.End = R.StoryLength
R.Find.Execute
If R.Find.Found <> True Then Exit Sub
R.HighlightColorIndex = wdRed
Loop
Попробуйте, поместив курсор перед таблицей. Видно, что зацикливание идет на первом символе строки таблицы. Ваш же макрос будет зацикливаться на любом акрониме в таблице.
Макросы под заказ и готовый пакет — mtdmacro.ru
10 Ответ от VBA-addict 25.11.2010 11:56:29
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Re: Поиск в тексте включая таблицы — проблемы и !решение
Вождь пишет:
Попробуйте, поместив курсор перед таблицей
Попробовал ваш макро — 2 варианта:
1) Начал выделение перед таблицей и закончил в середине ее — циклится в следующей за выделением 1 ячейке таблицы.
2) Просто поставил курсор — циклится в 1 ячейке таблицы
Подумал….
Погонял свой макрос => обобщение — если работа будет запускаться в выделении, начинающемся или заканчивающемся в середине таблицы — все наглухо умрет
Т.о. согласен — нужно контроллировать
Вождь пишет:
Do While RFind.Find.Execute
If RFind.End > RWork.End Then Exit Do
‘…
RFind.Collapse wdCollapseEnd
Loop
единственное переписал короче — по идее должно работать также
Do While RFind.Find.Execute and RFind.End <= RWork.End
...
Loop
Остался пока открытым вопрос начала выделения в таблице… и корректной работы с ним поиска… Обдумываю
В общем, таблицы — СОВСЕМ отдельная песня
счас выделил в таблице 5х3 три средних ячейки… оказалось, что при этом Range возвращает
не выделенные ячейки (2,2),(3,2),(4,2), а (2,2),(2,3),(3,1),(3,2),(3,3),(4,1),(4,2)
Т.о. выделение в таблице нужно обрабатывать СОВСЕМ иначе.
поскольку мне не настолько это все нужно и в моем случае выделение никогда не будет начинаться в таблице — дальнейшую проработку пока делать не буду
окончательный код (с контролем вылета поиска за окончание выделения в таблице)
Dim MyRange, oRange As Range
Dim MyRangeEnd As Long
Dim strAcronym As String
Set MyRange = ActiveDocument.Range
MyRangeEnd = MyRange.End
strListSep = Application.International(wdListSeparator)
Set oRange = MyRange
With oRange.Find
.Text = "<[A-ZА-ЯЁ]{2" & strListSep & "}>"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = True
.MatchWildcards = True
'Perform the search
Do While .Execute And oRange.End <= MyRangeEnd
'Continue while found
strAcronym = oRange
' VERY IMPORTANT line as for some docs Search gets stuck in headers/footers etc.
If strAcronym = "" Then oRange.Start = oRange.Start + 1
Debug.Print oRange.Start, "Table=" & Selection.Information(wdWithInTable), strAcronym
'***********************************************************************
'Манипуляции с найденным
With oRange.Duplicate
.Expand Unit:=wdSentence
strSentence = Trim(Replace(.Text, vbCr, ""))
End With
Debug.Print strAcronym, strSentence 'печать сокр. и предложения где оно найдено
'***********************************************************************
If oRange.Information(wdWithInTable) = True Then
oRange.MoveEnd wdCharacter, -1
Else
oRange.Start = oRange.End
oRange.End = MyRangeEnd
End If
Loop
End With
Отредактировано VBA-addict (25.11.2010 12:12:55)
Делай, что можешь, и будь, что будет!
11 Ответ от Вождь 25.11.2010 14:53:09
- Вождь
- Модератор
- Неактивен
- Зарегистрирован: 07.01.2010
- Сообщений: 745
- Поблагодарили: 181
Re: Поиск в тексте включая таблицы — проблемы и !решение
Ох, тяжко мне Добавление проверок не спасет Ваш макрос. Менять надо принцип.
Похоже, нет понимания различия между поиском в заданной области (Range.Start < Range.End) и поиском когда область схлопнута (Range.Start = Range.End), т.е. во всем документе.
В Вашем макросе нет разницы, где начинается область поиска, главное — где находятся искомые акронимы. Ведь область поиска макрос меняет каждый раз после успешного поиска. В начале это MyRange, затем — от конца акронима до конца MyRange. Т.е. как только находится акроним в таблице, то оставшаяся область поиска будет начинаться в таблице и произойдет зацикливание.
По поводу области в таблице. Невозможно работать с областью: стока таблицы + ячейка таблицы. Как только в область попадает несколько строк таблицы, началом области будет начало строки таблицы. Из-за этого все беды с зацикливанием.
Макросы под заказ и готовый пакет — mtdmacro.ru
12 Ответ от VBA-addict 25.11.2010 17:10:10
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Re: Поиск в тексте включая таблицы — проблемы и !решение
Непоняток много — я до этого, в основном имел дело с Excel и Access Так что Word со своей моделью для меня животинка новая…
Итак попробуем подвести итоги:
1)
Вождь пишет:
Искать надо не в заданной области, а просто вперед проверяя попадание результата в область поиска.
Т.е. достаточно
Do While RFind.Find.Execute and RFind.End <= RWork.End
...
Loop
а все мои проверки в конце не нужны…?
Вместо них достаточно добавить
RFind.Collapse wdCollapseStart
...
RFind.Collapse wdCollapseEnd
2) Не понимаю:
2.1 В начале поиска oRange ссылается на некий текст в котором ищутся аббревиатуры
2.2. В момент, когд аббревиатура находится этот же oRange ссылается на найденную фразу
2.3. Не смотря на это после последующего выполнения .Execute oRange перемещается к другому найденному тексту
Непонятно — где же все-таки хранятся:
1) Начало и конец изначального oRange — иначе бы не действовало .Collapse
2) Маркер текущего положения курсора внутри oRange — иначе как бы возобновлялся поиск…
Отредактировано VBA-addict (25.11.2010 17:11:01)
Делай, что можешь, и будь, что будет!
13 Ответ от VBA-addict 25.11.2010 17:45:23
- VBA-addict
- майор
- Неактивен
- Зарегистрирован: 12.10.2010
- Сообщений: 66
Re: Поиск в тексте включая таблицы — проблемы и !решение
Нашел еще вариант
После определения MyRange в моем случае
Set myRgOrig = myRange.Duplicate
...
Do While .Execute And oRange.InRange(myRgOrig)
...
Loop
...
т.е. проверяется вхождение найденного интервала в исходный диапазон, который в Duplicate остается неизменным
Делай, что можешь, и будь, что будет!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться