Vba word замена таблицы

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

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Добрый вечер!
Имеется небольшой затык. Есть 2 документа. Нужно из из документа 1 взять таблицу 2-ю по счету, ее удалить и поставить на ее место 2-ю таблицу из 2-го документа. Потом то же с 5-й таблицей. Удалять — потому что они с разным количеством строк и при просто вставке выходит не так. Или я не так делаю.

Собственно вопрос: как заменить таблицу? Сейчас у меня так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   Set wd1 = Documents.Open(FileName:=ThisDocument.Path & "" & FN1)
   Set wd2 = Documents.Open(FileName:=ThisDocument.Path & "" & FN2)
 
' документ 1: выбрать таблицу 2 и удалить, курсор остается на ее месте
wd1.Tables(2).Select
Selection.Cut
 
' документ 2: выбрать таблицу 2 и скопировать
wd2.Tables(2).Select
Selection.Copy
 
' документ 1: вставить таблицу в точку вставки
wd1.Activate
Selection.Paste
 
' ... дальше

Но думается мне, можно и без Select. Только не пойму как. Подскажите?



0



1233 / 671 / 238

Регистрация: 22.12.2015

Сообщений: 2,092

18.11.2022, 13:26

2

Цитата
Сообщение от Zeag
Посмотреть сообщение

Но думается мне, можно и без Select. Только не пойму как.

Насколько я понимаю — речь про wd1.Tables.Item(2).Range.Cut или вы не это имеете в виду?



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 как решение

Решение

Цитата
Сообщение от Zeag
Посмотреть сообщение

Чем и как это лучше сделать?

Не уверен, какой способ оптимальнее, я бы наверное делал что-то вроде кода ниже:

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
27
Option Explicit
Sub rt()
Dim wd1, wd2, FN1 As String, FN2 As String, rngObj As Range, i As Integer
FN1 = "Иванов Иван 18.docx"
FN2 = "Иванов Иван 19.docx"
 
    Set wd1 = Documents.Open(FileName:=ThisDocument.Path & "" & FN1)
    Set wd2 = Documents.Open(FileName:=ThisDocument.Path & "" & FN2)
    
    i = 4
    
    Set rngObj = wd2.Range(wd2.Tables.Item(i).Range.Start, wd2.Tables.Item(i).Range.Start)
    wd1.Tables.Item(i).Range.Cut
    wd2.Tables.Item(i).Delete
    rngObj.Paste
    
    i = 2
    
    Set rngObj = wd2.Range(wd2.Tables.Item(i).Range.Start, wd2.Tables.Item(i).Range.Start)
    wd1.Tables.Item(i).Range.Cut
    wd2.Tables.Item(i).Delete
    rngObj.Paste
    
    Set wd1 = Nothing
    Set wd2 = Nothing
    Set rngObj = Nothing
End Sub

Код по аналогии с вашим нужно сохранить в отдельной книге и сохранить ее в той же папке, что и обрабатываемые. Таблицы нужно перечислять от большего индекса к меньшему, т.к. из исходного файла таблица удаляется (не очень понял — нужно ли их удалять или нет).



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's user avatar

kvantour

24.7k4 gold badges49 silver badges69 bronze badges

asked Sep 4, 2013 at 9:21

122user321's user avatar

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-stroyer's user avatar

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  

Christopher Oezbek's user avatar

answered Jan 30, 2014 at 6:59

122user321's user avatar

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

Чтобы отправить ответ, вы должны войти или зарегистрироваться

Like this post? Please share to your friends:
  • Vba word выбрать строку в таблице
  • Vba word выбрать строки
  • Vba word выбрать все
  • Vba word выбрать весь текст
  • Vba word вставка картинки