powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как расставить фотографии на странице Word?
9 сообщений из 9, страница 1 из 1
Как расставить фотографии на странице Word?
    #39799223
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!

Не думал, что работа с VBA в Word настолько гиморна в сравнении с Excel.
Раньше никогда не писал макросы для Word, вот тут приспичило)
Помогите плиз.

Условие задачи:
1. пользователь загружает в Word-документ фотографии (обычно их много - более 5 шт)
2. после загрузки пользователь хочет запустить макрос, который
-- меняет размеры фотографий так, чтобы они сформировали "табличку" по 2 фотки в строке

второй тень играю с этими InlineShapes и Shapes, а счастья нет.
да еще и запись макросов в Word не так хорошо работает как в Excel.

Коллеги! Помогите расставить 5 фоток на листе в виде матрицы (по 2 фотки в строке)

П.С.

Пока не буду думать, как мне отслеживать еще переброс фоток на новые страницы.
Начнем просто с расстановки картинок в любое место листа.

П.П.С.
Кстати, почему проперти Shape.Left, Shape.Top, Shape.Width, Shape.Heignt показываются то в point то inches.
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799285
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUser,
пробуйте. Предполагается, что картинки вставлены подряд как InlineShapes, т.е. Вставка - Рисунок - выделено несколько - Вставить, ну или по одному, но без пробелов.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub Re()
Dim i&, p As InlineShape, q As InlineShape, w#, k#
'ширина печатного поля
  With Selection.Sections(1).PageSetup
    w = .PageWidth - .LeftMargin - .RightMargin - .Gutter
  End With
'ширина текущего абзаца
  With Selection.Paragraphs(1)
    w = w - .LeftIndent - .RightIndent
  End With
  
  i = ActiveDocument.InlineShapes.Count
  For i = 1 To i - (i And 1) Step 2
    Set p = ActiveDocument.InlineShapes(i)
    Set q = ActiveDocument.InlineShapes(i + 1)
    p.LockAspectRatio = msoTrue
    q.LockAspectRatio = msoTrue
    k = w / (p.Width + q.Width) * 0.95 'подберите коэф. увеличения
    p.Width = p.Width * k
    q.Width = q.Width * k
  Next
End Sub
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799291
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RegisteredUser5 фоток на листе в виде матрицы (по 2 фотки в строке)
а 5-ю куда

ф1ф2ф3ф4ф5

inlineShapes --вставляете в табличку, заранее созданную, сама перенесет на следующий лист
хотя самой вставлять не приходилось, только считывала
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799331
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ПЕНСИОНЕРКАRegisteredUser5 фоток на листе в виде матрицы (по 2 фотки в строке)
а 5-ю куда

ф1ф2ф3ф4ф5

inlineShapes --вставляете в табличку, заранее созданную, сама перенесет на следующий лист
хотя самой вставлять не приходилось, только считывала

вот эту идею я сейчас и рассматриваю как самую лучшую.
НО
столкнулся с проблемой Cut/Paste картинки в определенную ячейку таблицы

П.С.
Вы как раз все правильно показали: 5 фоток - это 3 строки
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799345
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Коллеги!

Подскажите как работать с таблицей в Word.

1. я создал программно таблицу, но в документе могут быть иные таблицы.
Как мне точно знать, что я буду работать именно с моей таблицей?

2. я решил делать Picture.Cut и вставлять () эту картинку в ячейку моей таблицы
типа так Table1.Cell(iRow, iCol).Range.Paste

НО картинка не вставляется в ячейку
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799347
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
КазанскийRegisteredUser,
пробуйте. Предполагается, что картинки вставлены подряд как InlineShapes, т.е. Вставка - Рисунок - выделено несколько - Вставить, ну или по одному, но без пробелов.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
Sub Re()
Dim i&, p As InlineShape, q As InlineShape, w#, k#
'ширина печатного поля
  With Selection.Sections(1).PageSetup
    w = .PageWidth - .LeftMargin - .RightMargin - .Gutter
  End With
'ширина текущего абзаца
  With Selection.Paragraphs(1)
    w = w - .LeftIndent - .RightIndent
  End With
  
  i = ActiveDocument.InlineShapes.Count
  For i = 1 To i - (i And 1) Step 2
    Set p = ActiveDocument.InlineShapes(i)
    Set q = ActiveDocument.InlineShapes(i + 1)
    p.LockAspectRatio = msoTrue
    q.LockAspectRatio = msoTrue
    k = w / (p.Width + q.Width) * 0.95 'подберите коэф. увеличения
    p.Width = p.Width * k
    q.Width = q.Width * k
  Next
End Sub



Спасибо! я запустил Ваш пример.
Он меняете размер картинок прекрасно, НО не расставляет их в матрицу.
Картинки остаются InlineShapes, а их никак нельзя двигать по листу.
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799530
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал!
Как по мне это не очень красиво, но пока другого решения не нашел.
Буду благодарен за дельные мысли.
Мне не нравится то, что приходится выгружать InlineShapes в файлы а потом их подымать в таблицу.
Хотел сделать Cut/Paste, но не получилось

итак, нужны 2 процедурки
1. сгребает все InlineShapes в файлы в темповый фолдер
2. подымает все фотки из темпового фолдера и вставляет в таблицу

Код: vbnet
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.
Function WriteInlineShapesToFile(Optional IsRemoveImgFromDoc As Boolean = True) As Variant
    Dim arrPath()  As String
    Dim docCurrent As Document
    Dim shapeCurrent As InlineShape
    Dim RC As Integer
    Dim vData() As Byte
    Dim i As Long
    Dim lWritePos As Long
    Dim strOutFileName As String
    Dim tempFolder As String

    tempFolder = Environ("Temp") & "\"

    Set docCurrent = ActiveDocument

    i = 1

    For Each shapeCurrent In docCurrent.InlineShapes
        strOutFileName = tempFolder & "img" & CStr(i) & ".emf"
        Open strOutFileName For Binary Access Write As #1
        ReDim Preserve arrPath(i - 1)
        arrPath(i - 1) = strOutFileName
        i = i + 1
        vData = shapeCurrent.Range.EnhMetaFileBits
        lWritePos = 1

        Put #1, lWritePos, vData

        Close #1
        
        If (IsRemoveImgFromDoc) Then
            shapeCurrent.Delete
        End If

 Next shapeCurrent

    'RC = MsgBox("Job complete.", vbOKOnly, "Job Status")
    WriteInlineShapesToFile = arrPath()
End Function



основной макрос и запуск (параметр указывает сколько должно быть колонок) в таблице

Код: vbnet
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.
Sub ArrangeInlineShapes(Optional ByVal cntCol As Integer = 2)
Dim curInShp As InlineShape
Dim curShp As Shape
Dim Table1 As Table

Dim curPage As Long, curTableIndex As Long
Dim iRow As Long, iCol As Long
Dim iteration As Long
Dim curTableRange As Range, rgCell As Range
Dim rgBuf As Range

Dim maxCountImg As Long

Dim arrImgPaths()  As String

If (ActiveDocument.InlineShapes.Count > 0) Then

' select 1st InlineShapes in Document
    Set curInShp = ActiveDocument.InlineShapes(1)
        'curInShp.Range.Select
        
' insert Paragraf after 1st 1st InlineShapes
    Set curTableRange = curInShp.Range
    With curTableRange
        .Collapse (WdCollapseDirection.wdCollapseEnd)
        .Move WdUnits.wdCharacter, 1
        .Select
        .InsertParagraph
        '.InsertBreak (WdBreakType.wdPageBreak)
    End With

' detect PageNumber where 1st InlineShapes in Document
    'curPage = curTableRange.Information(wdActiveEndAdjustedPageNumber)

    arrImgPaths = WriteInlineShapesToFile(True)
    maxCountImg = UBound(arrImgPaths)
    
    Set Table1 = ThisDocument.Tables.Add(curTableRange, Round((maxCountImg + 1) / cntCol, 0), cntCol)

    If (maxCountImg > 0) Then
        iRow = 1: iCol = 1: iteration = 1
        For i = 0 To maxCountImg
            Set rgCell = Table1.Cell(iRow, iCol).Range
            ActiveDocument.InlineShapes.AddPicture arrImgPaths(i), Range:=rgCell
            iteration = iteration + 1
            iCol = iCol + 1
            If (iCol > cntCol) Then
                iCol = 1
                iRow = iRow + 1
            End If
            
            On Error Resume Next
            Kill arrImgPaths(i)
        Next i
    End If
    
End If


End Sub


Sub Start()
    ArrangeInlineShapes (3)
End Sub




не скажу что оптимально и быстро, но работает.
конструктивная критика приветствуется
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799533
RegisteredUser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот так выглядит результат
...
Рейтинг: 0 / 0
Как расставить фотографии на странице Word?
    #39799713
Казанский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RegisteredUserОн меняете размер картинок прекрасно, НО не расставляет их в матрицуОн ставит по две картинки в строке, что Вы и хотели (см. приложение).

RegisteredUserМне не нравится то, что приходится выгружать InlineShapes в файлы а потом их подымать в таблицуЖуть
Используйте метод InlineShape.ConvertToShape.

Вообще, лучше сначала пакетно обработать картинки в граф. редакторе, а потом вставлять в Word. Файл легче будет.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как расставить фотографии на странице Word?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]