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
Zeag 810 / 465 / 180 Регистрация: 09.03.2009 Сообщений: 1,577 |
||||
1 |
||||
Word 17.11.2022, 22:42. Показов 408. Ответов 4 Метки нет (Все метки)
Добрый вечер! Собственно вопрос: как заменить таблицу? Сейчас у меня так:
Но думается мне, можно и без Select. Только не пойму как. Подскажите?
0 |
1233 / 671 / 238 Регистрация: 22.12.2015 Сообщений: 2,092 |
|
18.11.2022, 13:26 |
2 |
Но думается мне, можно и без Select. Только не пойму как. Насколько я понимаю — речь про
0 |
810 / 465 / 180 Регистрация: 09.03.2009 Сообщений: 1,577 |
|
18.11.2022, 19:54 [ТС] |
3 |
Уважаемый Dinoxromniy, спасибо, что откликнулись. Есть пары файлов 18 и 19, одну пару прилагаю. Нужно из 18 взять таблицы II и V и заменить ими соответствующие таблицы в 19. Чем и как это лучше сделать? Хотелось бы через указатели, чтобы не активировать файлы — если возможно. Указатель wd1 смотрит на 18, wd2 — на 19. В таблицах может быть разное количество строк, а то бы просто переписал значения из одной в другую.
0 |
Dinoxromniy 1233 / 671 / 238 Регистрация: 22.12.2015 Сообщений: 2,092 |
||||
19.11.2022, 08:56 |
4 |
|||
Сообщение было отмечено Zeag как решение Решение
Чем и как это лучше сделать? Не уверен, какой способ оптимальнее, я бы наверное делал что-то вроде кода ниже:
Код по аналогии с вашим нужно сохранить в отдельной книге и сохранить ее в той же папке, что и обрабатываемые. Таблицы нужно перечислять от большего индекса к меньшему, т.к. из исходного файла таблица удаляется (не очень понял — нужно ли их удалять или нет).
1 |
810 / 465 / 180 Регистрация: 09.03.2009 Сообщений: 1,577 |
|
19.11.2022, 18:28 [ТС] |
5 |
Dinoxromniy, большое спасибо! Записал Ваш способ себе в копилку, буду теперь знать. Как понимаю, в rngObj хранится точка начала таблицы. Я ее нашел путем wd1.Tables(i).Select, но не допер, как сохранить или найти без селекта. А удалять надо, а то таблица «прилипает» к старой. Спасибо!
0 |
Автор Anton, 21 декабря 2016, 13:50
Добрый день! Подскажите пожалуйста, вот есть такой макрос замены во всех таблицах.
Dim tbl As Table
For Each tbl In ActiveDocument.Tables
With tbl.Range.Find
.Text = «123»
.Replacement.Text = «321»
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
Next tbl
А как нужно его переделать, чтобы замена осуществлялась:
1. только в той таблице, где находится курсор
2. только в выделенных таблицах.
Мои действия такие в прикрепленном файле:
выделяю участок документа с Текст2 по Текст4. В выделенную область попадают таблицы 2 и 3. Необходимо запустить макрос, который произведет замену текста только в таблицах 2 и 3 (потому что только эти таблицы попали в выделенную область).
[вложение удалено администратором]
Администратор
- Administrator
- Сообщения: 2,252
- Записан
Sub Макрос()
Dim tbl As Table
For Each tbl In Selection.Tables
With tbl.Range.Find
.Text = «123»
.Replacement.Text = «321»
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
Next tbl
End Sub
[свернуть]
Только нужно понимать, что есть два режима выделения:
1) когда выделяется непрерывная область. Например, юзер выделяет абзац с текстом 2 и затем левой мышью выделяет текст ниже;
2) когда выделяются несмежные области. Это выделяется с помощью клавиши Ctrl.
Если используется первый режим выделения, то макрос обработает все выделенные таблицы.
Если используется второй режим, то макрос обработает только первую таблицу.
Что касается второго режима выделения, то в VBA-ворде нет инструментов, чтобы пройтись циклом по выделенным несмежным фрагментам. В этом случае нужно использовать какие-нибудь ухищрения. Например, можно закрасить выделенные фрагменты каким-нибудь редким цветом и затем уже работать с фрагментами, имеющими этот редкий цвет. Затем после обработки, цвет нужно удалить. Ну или можно ещё что-нибудь придумать вместо использования цвета заливки.
- Форум по VBA, Excel и Word
-
►
Word -
►
Макросы в Word -
►
Word Макросы: Замена в текущей таблице и выделенных таблицах
I have an MS Word document including a table. I am trying to find and replace text via VBA using the following code:
If TextBox1.Text <> "" Then
Options.DefaultHighlightColorIndex = wdNoHighlight
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Replacement.Highlight = True
With Selection.Find
.Text = "<Customer_Name>"
.Replacement.Text = TextBox1.Text
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.ClearFormatting
With Selection.Find.Font
.Italic = True
End With
Selection.Find.Replacement.ClearFormatting
With Selection.Find.Replacement.Font
.Italic = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
End If
This works fine for replacing all my content which is outside of the table. But it will not replace any of the content within the table.
kvantour
24.7k4 gold badges49 silver badges69 bronze badges
asked Sep 4, 2013 at 9:21
If your goal is to perform replacements in the whole documents (it looks so from the code, but it is not explicit), I would suggest you use Document.Range
instead of the Selection
object. Using Document.Range
will make sure everything is replaced, even inside tables.
Also, it is more transparent to the user, as the cursor (or selection) is not moved by the macro.
Sub Test()
If TextBox1.Text <> "" Then
Options.DefaultHighlightColorIndex = wdNoHighlight
With ActiveDocument.Range.Find
.Text = "<Customer_Name>"
.Replacement.Text = TextBox1.Text
.Replacement.ClearFormatting
.Replacement.Font.Italic = False
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
.Execute Replace:=wdReplaceAll
End With
End If
End Sub
answered Sep 4, 2013 at 10:47
d-stroyerd-stroyer
2,6282 gold badges18 silver badges31 bronze badges
0
I have used the following code and it works like charm….. for all the occurances that are found in the document.
stringReplaced = stringReplaced + "string to be searched"
For Each myStoryRange In ActiveDocument.StoryRanges
With myStoryRange.Find
.Text = "string to be searched"
.Replacement.Text = "string to be replaced"
.Wrap = wdFindContinue
.ClearFormatting
.Replacement.ClearFormatting
.Replacement.Highlight = False
.Execute Replace:=wdReplaceAll
End With
Next myStoryRange
answered Jan 30, 2014 at 6:59
122user321122user321
2211 gold badge4 silver badges13 bronze badges
Перейти к содержимому раздела
Серый форум
разработка скриптов
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
1 2015-11-05 19:10:36
- Alexs37
- Участник
- Неактивен
- Рейтинг : [0|0]
Тема: VBA: Word вставка таблицы в сроку с разделителем, замена в документе
Здравствуйте, идея следующая: из Excel копируем столбец, и в Word надо вставить значения в строку с разделителем например «;». Делаю так, копируем колонку, ставим курсор в ворде куда нужно вставить строку, нажимаем макрос, тот создает новый документ, туда вставляет содержимое буфера обмена как текст и делам замену символа перевода строки на наш разделить, потом копируем всю строчку что получилась, закрываем этот документ без сохранения и в нашь первый документ вставляем новый буфер, в котором отредактирована строка, при помощи макрозаписи и переработки получаю следующий код:
Sub Test ()
Selection.PasteAndFormat (wdFormatPlainText)
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "^p"
.Replacement.Text = "; "
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute Replace:=wdReplaceAll
Selection.WholeStory
Selection.Cut
ActiveWindow.Close wdDoNotSaveChanges
Selection.PasteAndFormat (wdUseDestinationStylesRecovery)
End Sub
все работает отлично, за одним исключением, мельтешит окно создаваемого документа в котором ведем замену.
Решил переработать для точно обращения к документу, а не к активному документу, чтобы новый документ был не видимым, чтобы преобразование было скрытым. получил вот такой код, но он не работает!!! вставляет, копирует, но замена почему то не работает. подскажите в чем проблема.
вот код:
Sub Test2 ()
Dim oWord As Word.Application
Dim oDocument As Word.Document
Dim isDocument As Word.Document
'Получаем доступ к запущенной программе Word.
Set oWord = GetObject(Class:="Word.Application")
'Даём документу Word имя "oDocument", через которое
'будем к нему обращаться в коде. Это нужно
'для удобства написания кода.
Set isDocument = oWord.Documents(oWord.ActiveDocument.Name)
Set oDocument = oWord.Documents.Add
'oDocument.Sections
'Documents.Add Template:="Normal", NewTemplate:=False, DocumentType:=0
oDocument.Content.PasteAndFormat (wdFormatPlainText)
oDocument.Range.WholeStory
oDocument.Range.Find.ClearFormatting
oDocument.Range.Find.Replacement.ClearFormatting
With oDocument.Range.Find
.Text = "^p"
.Replacement.Text = "; "
.Forward = True
.Wrap = wdFindContinue
.Format = True
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
oDocument.Range.Find.Execute Replace:=wdReplaceAll
oDocument.Range.WholeStory
oDocument.Range.Cut
' ActiveWindow.Close wdDoNotSaveChanges
isDocument.Content.PasteAndFormat (wdUseDestinationStylesRecovery)
oDocument.Close wdDoNotSaveChanges
End Sub
побывал Range и Content , и как потом попасть в тоже место где был курсор в первом документе, вставляет в замен всего текста в первый документ.
Сообщения 1
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться