Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/43: Рейтинг темы: голосов - 43, средняя оценка - 5.00
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72

Копирование надписей в документе Word

12.05.2011, 15:52. Показов 8917. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Ситуация следующая:
имеется документ Word в нем несколько надписей.
Необходимо скопировать их в этот же документ только чуть ниже.
Скажем, что на странице две надписи. необходимо их скопировать и разместить под ними.
Задача, вроде как простая - но не получается.
Использовать .copy .paste не получается - так как вставка осуществляется внутрь уже существующих надписей.
Копирование самих надписей я добился - но не могу скопировать содержимое.
Точнее сказать не могу определить содержимое надписи, чтобы его скопировать в новую.
Подскажите пожалуйста.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2011, 15:52
Ответы с готовыми решениями:

Анализ надписей в документе Word с центрированием самой длинной строки и выравниванием остальных
Добрый день. Имеется следующая ситуация: Имеем документ Word, в документе на каждой странице вставлена надпись, и в каждой из...

Word: поиск/замена по тексту и внутри надписей по формату
Столкнулся с проблемой поиска/заменой форматов после конвертации PDF=>DOC. Некоторый текст определяет как текст, а некоторый как надписи...

Работа метода Word.Selection.Find при поиске в документе Word
Дорого времени суток! никак не могу разобраться в механизме работы range.find Запускаю: ......................... ...

25
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 03:16
Visual Basic
1
2
3
4
5
Sub P1()
With ActiveDocument
    .Shapes(2).TextFrame.TextRange.Text = .Shapes(1).TextFrame.TextRange.Text
End With
End Sub
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 08:48  [ТС]
Добрый день.
Это да согласен.
Проблема в том, что текст форматирован по разному на разных строках и могут быть картинки вставлены в надписи.
С учетом этого можно скопировать ?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 09:02
Visual Basic
1
2
3
4
Sub P1()
ActiveDocument.Shapes(1).TextFrame.TextRange.Copy
ActiveDocument.Shapes(2).TextFrame.TextRange.Paste
End Sub
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 09:39  [ТС]
еще вопрос:
после
ActiveDocument.Shapes.AddTextbox(msoText OrientationHorizontal, 0, 0, iW, iH)
можно понять какой shapes по номеру оказался ?
Чтобы обратится к ней с помощью:
ActiveDocument.Shapes(?)
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 09:57
hub2002,
порядковый номер нельзя узнать просто так. Если количество надписей немного, то помещайте их в объектные переменные и уже через эти объектные переменные работайте с нужной надписью:
Visual Basic
1
2
3
4
5
Sub P1()
Dim Надпись As Word.Shape
Set Надпись = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 50, 50)
Надпись.TextFrame.TextRange.Text = "text"
End Sub
Вообще порядковый номер определяется следующим образом: задаётся нужный диапазон от начала документа до надписи, порядковый номер которой нужно узнать, и определяется количество надписей в данном диапазоне. В данном примере подсчитывается количество любых фигур от начала и до конца документа (т.е. надо ещё проверку проводить - является ли данная фигура надписью или нет, если в документе кроме надписей есть другие фигуры):
Visual Basic
1
2
3
4
5
6
7
Sub P2()
Dim Номер As Long
With ActiveDocument
    Номер = .Range(Start:=0, End:=.Range.End).ShapeRange.Count
End With
ActiveDocument.Shapes(Номер).TextFrame.TextRange.Text = "text2"
End Sub
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 11:23  [ТС]
Возникла следующая проблема:
при обработке всех Shapes
новые вставляются только на первой странице.
Как для текущего shapes определять на какой странице она находится и вставлять на ней же.
А потом переходить далее ?
Код прилагаю:
PureBasic
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
28
29
iDy = 380
pT = ActiveDocument.PageSetup.TopMargin
pB = ActiveDocument.PageSetup.BottomMargin
pL = ActiveDocument.PageSetup.LeftMargin
pR = ActiveDocument.PageSetup.RightMargin
            
For i = 1 To ActiveDocument.Shapes.Count
  iOrig = 0
  iCopy = 0
  iOrig = InStr(1, ActiveDocument.Shapes(i).Name, "orig")
  iCopy = InStr(1, ActiveDocument.Shapes(i).Name, "copy")
  If iOrig = 0 And iCopy = 0 Then
    ActiveDocument.Shapes(i).Name = "orig_" & i
    iL = ActiveDocument.Shapes(i).Left
    iT = ActiveDocument.Shapes(i).Top
    iH = ActiveDocument.Shapes(i).Height
    iW = ActiveDocument.Shapes(i).Width
    ActiveDocument.Shapes(i).TextFrame.TextRange.Copy
    With ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, iL + pL, iT + pT + iDy, iW, iH)
       .Name = "copy_" & i
       With .WrapFormat
         .AllowOverlap = True
         .Side = wdWrapBoth
         .Type = 5
       End With
       .TextFrame.TextRange.Paste
    End With
  End If
Next i
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 11:31
hub2002,
вот так перемещается надпись в нужную позицию, независимо от полей и размера бумаги. Отталкиваемся от левого края страницы и верха страницы. С помощью интерфейса можно здесь посмотреть: выделите надпись - вкладка Формат - группа Упорядочить - Обтекание текстом - Дополнительные параметры разметки... - вкладка Положение рисунка - выбираете радиокнопки Положение - правее/ниже Страницы.
Visual Basic
1
2
3
4
5
6
7
8
Sub P1()
With ActiveDocument.Shapes(1)
    .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    .RelativeVerticalPosition = wdRelativeVerticalPositionPage
    .Left = CentimetersToPoints(8.22)
    .Top = CentimetersToPoints(4.39)
End With
End Sub
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 11:39  [ТС]
у меня установлено обтекание "Перед текстом" - поэтому указанные радио кнопки у меня не доступны.
расстояние от текста соответственно тоже.
Если я правильно понял о чем речь.
Может есть другое решение.
Вообще как соотносятся надписи и страницы - на которых они расположены ?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 11:41
hub2002,
эти радиокнопки доступы во всех случаях, кроме В тексте.
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 11:51  [ТС]
У меня они не доступны: "За текстом", "Перед текстом", "В тексте".

И как их разместить в нужных местах?
Когда я перебираю надписи привязки к страницам нет.
я так понимаю.
А когда вставляю их, то как быть со вставкой ?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 11:53
hub2002,
вставьте сюда документ, содержащий надпись в таком виде, чтобы были недоступны эти радикнопки (кроме В тексте).
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 12:17  [ТС]
а вставка:
With ActiveDocument.Shapes.AddTextbox(msoText OrientationHorizontal, iL + pL, iT + pT + iDy, iW, iH)
осуществляется на той странице где установлен курсор ?
или как осуществляется вставка ?
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 13:26
hub2002,
попробуйте вот этим воспользоваться:
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
Sub P3()
Dim НадписьOrig As Word.Shape, НадписьCopy As Word.Shape
Dim iL As Single, iT As Single, iH As Single, iW As Single
Set НадписьOrig = ActiveDocument.Shapes(2)
With НадписьOrig
    .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    .RelativeVerticalPosition = wdRelativeVerticalPositionPage
    iL = .Left
    iT = .Top
    iH = .Height
    iW = .Width
    .TextFrame.TextRange.Copy
End With
Set НадписьCopy = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 100, 50, 50)
With НадписьCopy
    .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    .RelativeVerticalPosition = wdRelativeVerticalPositionPage
    .Left = iL
    .Top = iT
    .Height = iH
    .Width = iW
    .TextFrame.TextRange.Paste
End With
End Sub
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
13.05.2011, 13:51  [ТС]
Таже самая ситуацию. Вставка осуществляется на странице, где установлен курсор.
PureBasic
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
28
29
30
31
32
33
34
35
36
37
38
39
Dim НадписьOrig As Word.Shape, НадписьCopy As Word.Shape
Dim iL As Single, iT As Single, iH As Single, iW As Single
 
  iDy = 380
 
For i = 1 To ActiveDocument.Shapes.Count
Set НадписьOrig = ActiveDocument.Shapes(i)
 
  iOrig = 0
  iCopy = 0
 
With НадписьOrig
    .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    .RelativeVerticalPosition = wdRelativeVerticalPositionPage
    iL = .Left
    iT = .Top
    iH = .Height
    iW = .Width
    .TextFrame.TextRange.Copy
    iOrig = InStr(1, .Name, "orig")
    iCopy = InStr(1, .Name, "copy")
    .Name = "orig_" & i
End With
 
  If iOrig = 0 And iCopy = 0 Then
 
Set НадписьCopy = ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, 100, 100, 50, 50)
With НадписьCopy
    .Name = "copy_" & i
    .RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    .RelativeVerticalPosition = wdRelativeVerticalPositionPage
    .Left = iL
    .Top = iT + pT + iDy
    .Height = iH
    .Width = iW
    .TextFrame.TextRange.Paste
End With
  End If
Next i
0
2309 / 1541 / 115
Регистрация: 13.06.2009
Сообщений: 5,575
13.05.2011, 14:02
hub2002,
попробуйте тогда выделять надпись (Select).
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
31.10.2011, 15:56  [ТС]
Добрый день.
Спасибо все получилось.
Единственно, что сразу не заметил.
Получается следующая ситуация.
При копировании надписей и копировании и вставке текста из образцов.
получается, так что, последний абзац в надписи не сохраняет свое форматирование.
Ему присваивается всегда выравнивание слева, а в основном форматирование имеется выравнивание по ширине.
Вопрос: как это можно исправить.
думаю двумя способами:
1) Определить выравнивание последнего абзаца в надписи и установить его (думаю сложно).
2) Добавить enter перед вставкой, чтобы начался новый столбец (тут только вопрос поможет ли это).
Но думаю, это все-таки не правильные способы решения вопроса.
Прошу помочь и посоветовать как можно решить данную проблему.
Насчет, вставки .TypeParagraph к сожаленью тоже решить не могу, так как TypeParagraph есть только у selection, а я пользуюсь:

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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
Sub CopyTextBox()
'
' CopyTextBox Макрос
' Макрос создан 13.05.2011 Пользователь
'
' Скопировать все надписи в документе
 
Dim iLineF As Long
Dim DocUnit%
 
iDy = 420
pLM = 0
pTM = 0
 
fExit = 1
fTextBox.Show
If fExit = 1 Then GoTo jExit
 
DocUnit = Options.MeasurementUnit: Options.MeasurementUnit = wdPoints
 
If fLM Then pLM = ActiveDocument.PageSetup.LeftMargin
If fTM Then pTM = ActiveDocument.PageSetup.TopMargin
 
For i = 1 To ActiveDocument.Shapes.Count
  iOrig = 0
  iCopy = 0
  iOrig = InStr(1, ActiveDocument.Shapes(i).Name, "orig")
  iCopy = InStr(1, ActiveDocument.Shapes(i).Name, "copy")
  If iOrig = 0 And iCopy = 0 Then
' Изменяем название надписи
    ActiveDocument.Shapes(i).Name = "orig_" & i
' Определяем размеры надписи
    ActiveDocument.Shapes(i).RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
    ActiveDocument.Shapes(i).RelativeVerticalPosition = wdRelativeVerticalPositionPage
    
    iL = ActiveDocument.Shapes(i).Left
    iT = ActiveDocument.Shapes(i).Top
    iH = ActiveDocument.Shapes(i).Height
    iW = ActiveDocument.Shapes(i).Width
' Сохраняем параметры внутреннего текста
    tML = ActiveDocument.Shapes(i).TextFrame.MarginLeft
    tMR = ActiveDocument.Shapes(i).TextFrame.MarginRight
    tMT = ActiveDocument.Shapes(i).TextFrame.MarginTop
    tMB = ActiveDocument.Shapes(i).TextFrame.MarginBottom
   
    iRHP = ActiveDocument.Shapes(i).RelativeHorizontalPosition
    iRVP = ActiveDocument.Shapes(i).RelativeVerticalPosition
' Сохраняем параметры линии надписи
    fLine = ActiveDocument.Shapes(i).Line.Visible
    iLineW = ActiveDocument.Shapes(i).Line.Weight
    iLineS = ActiveDocument.Shapes(i).Line.Style
    iLineT = ActiveDocument.Shapes(i).Line.Transparency
    iLineF = ActiveDocument.Shapes(i).Line.ForeColor.RGB
' Копируем содержание надписи в буфер
    ActiveDocument.Shapes(i).TextFrame.TextRange.Copy
' Выделяем текущую надпись
    ActiveDocument.Shapes(i).Select
' Определяем на какой странице надпись
    pn = Selection.Information(wdActiveEndPageNumber)
    Selection.GoTo What:=wdGoToPage, Which:=wdGoToNext, Name:=pn
' Создаем копию надписи
    With ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, iL + pLM, iT + pTM + iDy, iW, iH)
       .RelativeHorizontalPosition = iRHP
       .RelativeVerticalPosition = iRVP
       .Name = "copy_" & i
       .TextFrame.MarginLeft = tML
       .TextFrame.MarginRight = tMR
       .TextFrame.MarginTop = tMT
       .TextFrame.MarginBottom = tMB
       .Line.Visible = fLine
       .Line.Weight = iLineW
       .Line.Style = iLineS
       .Line.Transparency = iLineT
       .Line.ForeColor.RGB = iLineF
       With .WrapFormat
         .AllowOverlap = True
         .Side = wdWrapBoth
         .Type = 5
       End With
       .TextFrame.TextRange.Paste
       .Select
    End With
  End If
Next i
Options.MeasurementUnit = DocUnit
Options.MeasurementUnit = wdCentimeters  'wdMillimeters 'wdCentimeters
jExit:
End Sub
Добавлено через 2 часа 44 минуты
Или другой вопрос:
как в конце текста каждой из надписей вставить Enter ?

Добавлено через 12 минут
В продолжение исследования получается, что это зависит от каких-то настроек Word.
На одном компьютере вставляется без проблем с форматирование последнего абзаца, а на другом компьютере имеется проблема с форматирование последнего абзаца.
Может быть есть идеи в чем разница ?
Может: вместо: .Paste
использовать .PasteAndFormat ?
или еще есть какие-то варианты ?
0
1302 / 404 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
01.11.2011, 13:20
hub2002,
выложите здесь документ и поясните, что надо сделать.
0
1 / 1 / 0
Регистрация: 12.05.2011
Сообщений: 72
01.11.2011, 14:17  [ТС]
Итак. файл Пример1.
В нем две надписи образец - черная рамка, и две надписи скопированные - красная рамка.
Обратите внимание: в красных рамках последний абзац - имеет форматирование по левому краю, а в образце было установлено: по правому.
Причем, не понятно почему так получается.
На моем компьютере - все нормально копируется.
А вот на некоторых получается такое поведение.
Процедура указана в предыдущем посте.
Так вот не понятно, почему получается такое поведение, с чем оно связано и как его победить.
Вложения
Тип файла: doc Пример1.doc (31.5 Кб, 24 просмотров)
0
1302 / 404 / 22
Регистрация: 21.10.2011
Сообщений: 1,285
02.11.2011, 10:02
Цитата Сообщение от hub2002 Посмотреть сообщение
в красных рамках последний абзац - имеет форматирование по левому краю
Стандартная панель инструментов - Непечатаемые знаки (всплывающие подсказки появляются при наведении курсора на кнопки)(слева от Масштаб). Появятся непечатаемые символы. В скопированной надписи посмотрите на текст, который должен быть справа. Вы увидите в конце каждой строки специальный символ. Этот символ означает абзац. Т.е. влево ушёл не один абзац, а несколько.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2011, 10:02
Помогаю со студенческими работами здесь

Копирование содержимого word в word из Excel с макросом
Ребят, добрый вечер! Подскажите,. пожалуйста, мне надо по сути создать копию документа WORD из Excel и работать с копией. Я указываю...

Схемы в документе Word
Подскажите кто знает как решить проблему: Я нарисовал схему в Splan, затем мне нужно её вставить в текстовый документ, я импортирую из...

рукопись в документе Word
Здравствуйте! Имею такую задумку: очень много требуют текста написанного от руки (хотя он есть в цыфре), создал шрифт своего подчерка,...

Автосумма в документе Microsoft Word
Здравствуйте. Cам я в полях Ворда разбираюсь не настолько хорошо, поэтому обращаюсь за помощью... В документе есть произвольное...

Вставка по меткам в документе Word
Задачка: Есть шаблон ".dot", в котором нужно в определенные места вставить данные(текст, картинки, формулы и т.д..). Я...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru