Excel vba вставить картинку в word

Sub ExportExcelToWord()

‘PURPOSE: Copy/Paste An Excel Table, Text, & Logo Image Into a New Word Document
‘NOTE: Must have Word Object Library Active in Order to Run _
  (VBE > Tools > References > Microsoft Word 12.0 Object Library)

‘SOURCE: www.TheSpreadsheetGuru.com

Dim tbl As Excel.Range
Dim WordApp As Word.Application
Dim myDoc As Word.Document
Dim WordTable As Word.Table
Dim myText As Excel.Range
Dim myLogo As Excel.Shape

‘Optimize Code
  Application.ScreenUpdating = False
  Application.EnableEvents = False

‘Copy Data from Excel
  Set tbl = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects(«Table1»).Range
  Set myText = ThisWorkbook.Worksheets(Sheet1.Name).Range(«B4:B5»)
  Set myLogo = ThisWorkbook.Worksheets(Sheet1.Name).Shapes(«Logo_Image»)

  ‘Create an Instance of MS Word
  On Error Resume Next

        ‘Is MS Word already opened?
      Set WordApp = GetObject(class:=»Word.Application»)

        ‘Clear the error between errors
      Err.Clear

    ‘If MS Word is not already open then open MS Word
      If WordApp Is Nothing Then Set WordApp = CreateObject(class:=»Word.Application»)

        ‘Handle if the Word Application is not found
      If Err.Number = 429 Then
        MsgBox «Microsoft Word could not be found, aborting.»
        GoTo EndRoutine
      End If

  On Error GoTo 0

‘Optimize Code
  WordApp.Application.ScreenUpdating = False

  ‘Make MS Word Visible and Active
  WordApp.Visible = True
  WordApp.Activate

  ‘Create a New Document
  Set myDoc = WordApp.Documents.Add

‘Copy/Paste Logo
  myLogo.Copy
  myDoc.Paragraphs(myDoc.Paragraphs.Count).Range.Paste

  ‘Spacing
  myDoc.Paragraphs.Add
  myDoc.Paragraphs.Add
  myDoc.Paragraphs.Add

‘Copy/Paste Text
  myText.Copy
  myDoc.Paragraphs(myDoc.Paragraphs.Count).Range.PasteAndFormat (wdFormatPlainText)

  ‘Spacing
  myDoc.Paragraphs.Add
  myDoc.Paragraphs.Add

  ‘Copy Excel Table Range
  tbl.Copy

‘Paste Table into MS Word
  myDoc.Paragraphs(myDoc.Paragraphs.Count).Range.PasteExcelTable _
    LinkedToExcel:=False, _
    WordFormatting:=False, _
    RTF:=False

‘Autofit Table so it fits inside Word Document
  Set WordTable = myDoc.Tables(1)
  WordTable.AutoFitBehavior (wdAutoFitWindow)

   EndRoutine:
‘Optimize Code
  Application.ScreenUpdating = True
  Application.EnableEvents = True
  WordApp.Application.ScreenUpdating = True

‘Clear The Clipboard
  Application.CutCopyMode = False

End Sub

‘Copy Data from Excel
  Set tbl = ThisWorkbook.Worksheets(Sheet1.Name).ListObjects(«Table1»).Range
  Set myText = ThisWorkbook.Worksheets(Sheet1.Name).Range(«B4:B5»)
  Set myLogo = ThisWorkbook.Worksheets(Sheet1.Name).Shapes(«Logo_Image»)

‘Copy/Paste Text
  myText.Copy
  myDoc.Paragraphs(myDoc.Paragraphs.Count).Range.PasteAndFormat (wdFormatPlainText)

Start Being Creative And Automate!

Hopefully, through this example, you have gained an appreciation for the capabilities of VBA macros across multiple applications (ie Excel to MS Word).  I have been able to apply the concepts covered in this post to create monthly newsletters and reports within seconds in my financial analyst role.  I’m sure there are many other examples out there showing how Excel to Word automation can be beneficial.  If you have any examples from your own professional experience please share them with everyone in the comments section below.  I am curious about what anyone else may be automating!  I look forward to reading your thoughts!!

Download Example Excel File

If you would like to get a copy of the Excel file I used throughout this article, feel free to directly download the spreadsheet by clicking the download button below.

About The Author

Hey there! I’m Chris and I run TheSpreadsheetGuru website in my spare time. By day, I’m actually a finance professional who relies on Microsoft Excel quite heavily in the corporate world. I love taking the things I learn in the “real world” and sharing them with everyone here on this site so that you too can become a spreadsheet guru at your company.

Through my years in the corporate world, I’ve been able to pick up on opportunities to make working with Excel better and have built a variety of Excel add-ins, from inserting tickmark symbols to automating copy/pasting from Excel to PowerPoint. If you’d like to keep up to date with the latest Excel news and directly get emailed the most meaningful Excel tips I’ve learned over the years, you can sign up for my free newsletters. I hope I was able to provide you with some value today and I hope to see you back here soon!

— Chris
Founder, TheSpreadsheetGuru.com

Sub Макрос()

        Dim shape As shape
    Dim FN As String

            ‘ Полное имя файла-рисунка.
    FN = «C:UsersUserDesktopРисунок.png»

        ‘ Вставка неплавающего рисунка и превращение неплавающего рисунка в плавающий.
        ‘ При этом присваиваем рисунку имя ‘shape’ и далее в коде будем обращаться
        ‘ к рисунку по имени ‘shape’.
    Set shape = Selection.InlineShapes.AddPicture(FileName:=FN, LinkToFile:=False, _
        SaveWithDocument:=True, Range:=Selection.Range).ConvertToShape

        ‘ Здесь можете делать нужные действия с рисункам, используя имя ‘shape’.
        ‘ Например, так можно узнать левое положение рисунка.
        ‘ Информация запишется в View — Immediate Window.
    Debug.Print shape.Left

    End Sub

[свернуть]

 

Олег Кулиничев

Пользователь

Сообщений: 13
Регистрация: 11.07.2021

#1

28.03.2022 22:19:51

доброго времени суток

на одном из сторонних форумов нашёл код для вставки в создаваемый документ Word картинки формата PNG (код ниже)

при вставке в документ Word картинки с печатью она вставляется в определённое место с типом форматирования «В тексте»

помогите, пожалуйста, решить мою проблему;

1) как сделать после вставки картинки её «За текстом», а не «В тексте»
2) как «привязать» вставку картинки к опреднённому месту в документе (например, к какой-то закладке), т.к. документ Word (например письмо или справка) может быть как на 1 лист, так и на несколько

заранее спасибо

Код
Sub InsertPicture() 

Dim wdTable As Object
Dim objWrdDoc As Object
Dim strFile As String
Dim p As InlineShape, t As Object
Dim pShape As Object

On Error Resume Next

strFile = Range("E8").Value                           'путь к документу (можно "d:...Документ.docx")
Set objWrdApp = GetObject(, "Word.Application")       'пытаемся подключится к объекту Word
If objWrdApp Is Nothing Then
    Set objWrdApp = CreateObject("Word.Application")  'если приложение закрыто - создаем новый экземпляр
    Set objWrdDoc = objWrdApp.Documents.Open(strFile) 'открываем документ Word - документ с таким именем должен существовать
    objWrdApp.Visible = True
End If
Set objWrdDoc = objWrdApp.Documents.Open(strFile)
On Error GoTo 0
    
Set WdRange = objWrdDoc.Content
Set wdTable = WdRange.Tables(1)

Set p = wdTable.Rows(1).Cells(1).Range.InlineShapes.AddPicture(Range("C11").Value, False, True) ' путь к картинке (можно "d:...печать.png")

'вставка в документ
p.ScaleWidth = 20
p.ScaleHeight = 20
Set t = p.ConvertToShape
t.WrapFormat.Type = wdWrapNone

t.RelativeHorizontalPosition = wdRelativeHorizontalPositionPage
t.RelativeVerticalPosition = wdRelativeVerticalPositionPage
t.Left = 260                                                    'значения, конкретно под этот случай
t.Top = 370                                                     'значения, конкретно под этот случай

End Sub

Прикрепленные файлы

  • InsertStamp.xlsm (17.83 КБ)
  • Документ.docx (224.85 КБ)
  • печать.png (225.52 КБ)

 

whateverlover

Пользователь

Сообщений: 435
Регистрация: 15.06.2018

#2

28.03.2022 23:09:34

моя печать  :D

Код
t.WrapFormat.Type = wdWrapNone

Вот это, скорей всего, отвечает за то «в тексте» она будет или «за текстом». Вот

тут

можно посмотреть какие есть варианты, вам, я так понял, подойдет wdWrapBehind.

 

Олег Кулиничев

Пользователь

Сообщений: 13
Регистрация: 11.07.2021

#3

28.03.2022 23:53:19

Цитата
написал:
моя печать   Код ? 1t.WrapFormat.Type = wdWrapNoneВот это, скорей всего, отвечает за то «в тексте» она будет или «за текстом». Вот  тут  можно посмотреть какие есть варианты, вам, я так понял, подойдет wdWrapBehind.

Спасибо!!!
Это побороли. Исправил код и картинка вставилась «за текстом»

А как по поводу места в документе? возможно привязать картинку к «закладке» в Word?

 

Юрий М

Модератор

Сообщений: 60570
Регистрация: 14.09.2012

Контакты см. в профиле

Олег Кулиничев,  Вы с правилами знакомились? Каком максимально допустимый суммарный размер файлов?

 

whateverlover

Пользователь

Сообщений: 435
Регистрация: 15.06.2018

#5

29.03.2022 00:23:10

Цитата
Олег Кулиничев написал:
А как по поводу места в документе? возможно привязать картинку к «закладке» в Word?

Объектную модель Word не знаю, нагуглил вот такое:

Код
ActiveDocument.Bookmarks("TEST").Range.InlineShapes.AddPicture FileName:="P:test.png"

Я так понимаю, эта строчка вставит картинку В закладку «TEST». Попробуйте, может это не то.
Я в своем варианте привязывался к строчке, содержащей фразу «руководитель проекта» и вставлял в ту же строчку, но с определенным отступом вправо.

Изменено: whateverlover29.03.2022 00:26:20

Вставка и редактирование рисунков в Word. VBA

RAN

Дата: Четверг, 24.04.2014, 19:14 |
Сообщение № 1

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Мяв!
Закину и сюда (http://programmersforum.ru/showthread.php?t=259385)

Другой день бодаюсь со вставкой рисунков в Word.

В исходном файле пытаюся вставить рисунок в таблицу с 1 ячейкой содержащей закладку и установить его размеры.

[vba]

Код

        wd.Bookmarks.Item(marker).Select
          wa.Selection.InlineShapes.AddPicture Filename:=basep & aan, LinkToFile:= _
                     False, SaveWithDocument:=True
          wa.Selection.Tables(1).Select
          With wa.Selection.InlineShapes(1)    ‘Если Формат — Рисунок — Положение «в тексте»
‘            Heght = .Height: wigt = .Width    ‘ костыль
              .LockAspectRatio = -1    ‘msoTrue    ‘Формат — Риснок — Размер — Сохранять пропорции
                          .Height = 141.88    ‘Высота рисунка 227 = 8 см
‘            .Height = 100 ‘360 ‘: .Width = .Height * (wigt / Heght)    ‘ костыль
          End With

[/vba]

Без костыля меняется только либо высота, либо ширина. При этом ошибки нет
Сегодня создал шаблон с таблицей в 1 ячейку, написал код для вставки

[vba]

Код

            For Each x In coll
                  .Selection.InsertRowsBelow 1
                  .Selection.TypeText Text:=»Фото № » & x(1) & » » & x(2)
                  .Selection.EndKey Unit:=5, Extend:=1    ‘ 5   1
                  .Selection.ParagraphFormat.KeepWithNext = True
                  .Selection.InsertRowsBelow 1
                  .Selection.ParagraphFormat.KeepWithNext = False
                  .Selection.InlineShapes.AddPicture Filename:=x(3), LinkToFile:= _
                     False, SaveWithDocument:=True
                  wa.Selection.EndKey Unit:=5, Extend:=1    ‘ 5   1
                  With wa.Selection.InlineShapes(1)    ‘Если Формат — Рисунок — Положение «в тексте»
                      .LockAspectRatio = -1    ‘ msoTrue    ‘Формат — Риснок — Размер — Сохранять пропорции
                      .Width = 100 ‘454    ‘Ширина рисунка
                  End With
              Next

[/vba]

Все работает.

Аналогичным кодом вставляю рисунок на лист, но вылетаю с ошибкой при изменении размера.

[vba]

Код

            wd.Bookmarks.Item(marker).Select
              wa.Selection.InlineShapes.AddPicture Filename:=iFulleName, LinkToFile:= _
                     False, SaveWithDocument:=True
              With wa.Selection.InlineShapes(1)    ‘Если Формат — Рисунок — Положение «в тексте»
                  .LockAspectRatio = -1    ‘ msoTrue    ‘Формат — Риснок — Размер — Сохранять пропорции
                  .Width = 400    ‘Высота рисунка 227 = 8 см
              End With

[/vba]
Подскажите, где собака порылась? И как правильно?

Обработка идет из Excel.


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANЧетверг, 24.04.2014, 19:16

 

Ответить

anvg

Дата: Пятница, 25.04.2014, 05:13 |
Сообщение № 2

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Добрый день Андрей
В коде в самом Word размер меняет произвольно, думаю, что из Excel будет работать. Или я чего-то не понял в вопросе?
[vba]

Код

Public Sub test()
     Dim pMarker As Bookmark, pShape As InlineShape
     Set pMarker = ThisDocument.Bookmarks(«marker»)
     Set pShape = pMarker.Range.InlineShapes.AddPicture(«c:Temp23.jpg», False, True)
     pShape.LockAspectRatio = msoFalse
     pShape.Height = 142
     pShape.Width = 142
End Sub

[/vba]
Успехов.
P. S. Подобно как и в Excel зачем мучать Selection?

 

Ответить

RAN

Дата: Пятница, 25.04.2014, 10:55 |
Сообщение № 3

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Потестил.
Переменная помогла. Спасибо.

Однако, похоже в файле Word глюк.
Тестовый работает, а основной без костыля не хочет.

Пример теста в архиве.

По поводу Selection подумаю.

Люди разные бывают. Я человеку исправил точку изменения отображения окна Word, а он в претензии — зачем в скрытом режиме сделал, желаю смотреть, как картинки в Word вставляются. lol

К сообщению приложен файл:

Test.rar
(78.7 Kb)


Быть или не быть, вот в чем загвоздка!

 

Ответить

anvg

Дата: Пятница, 25.04.2014, 11:07 |
Сообщение № 4

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Странно, у меня Word 2010 32bit выполнилось без проблем. А где должна была быть ошибка?

 

Ответить

RAN

Дата: Пятница, 25.04.2014, 12:09 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Ошибки как таковой нет, код выполняется, просто игнорируется строка
[vba]

Код

pShape.LockAspectRatio = -1

[/vba]
Изменяется только один размер, тот, который укажешь.

А в примере все работает, изменяются оба размера.

Костыль в первом коде первого поста.


Быть или не быть, вот в чем загвоздка!

 

Ответить

anvg

Дата: Пятница, 25.04.2014, 13:26 |
Сообщение № 6

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

LockAspectRatio = -1 блокирует изменение соотношения сторон. Изменив один размер, в силу этого, изменится и второй так, чтобы сохранить это отношение. В моём же примере LockAspectRatio = msoFalse, то есть размеры можно менять произвольно

 

Ответить

RAN

Дата: Пятница, 25.04.2014, 21:10 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

LockAspectRatio = -1 блокирует изменение соотношения сторон.

Совершенно ай ай ай! Именно это и требуется. Но не работает. >(
Т.е. в примере работает, а в основном файле — нет.

PS
Чтобы совсем избежать разночтений
Берем картинку 50х50
Запускаем
[vba]

Код

.LockAspectRatio = -1
       .Width = 100

[/vba]

Должны получить картинку 100х100 (и получаем в тестовом файле)

А в рабочем получаем 100х50.


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANПятница, 25.04.2014, 22:50

 

Ответить

anvg

Дата: Суббота, 26.04.2014, 06:26 |
Сообщение № 8

Группа: Друзья

Ранг: Ветеран

Сообщений: 581


Репутация:

271

±

Замечаний:
0% ±


2016, 365

Странно, у меня в выложенном основном все коты получились «квадратные», как и положено. Word 2010 32bit.

 

Ответить

RAN

Дата: Суббота, 26.04.2014, 10:20 |
Сообщение № 9

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Выложен тестовый. А основной(рабочий) — это док шаблон страниц на 40, в который нужно еще столько же вставить.
Он у меня дома остался.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Excel vba всплывающее окно
  • Excel vba все границы ячейки
  • Excel vba время как текст
  • Excel vba время выполнения макроса
  • Excel vba внести данные в ячейку