Vba excel сохранить лист в word

 

Vova67

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

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

#1

07.11.2017 15:31:36

Всем привет.

Вот фрагмент кода , где копия листа схраняется в формате Pdf.

Код
Sheets("Рапорт").Select

pathS = "\192.168.64.33Quality10-ТЕСТЫ ПРОИЗВОДСТВОАрхив рапортов"

    Application.ScreenUpdating = False
 
     ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:= _
     pathS & "" & Year(Date) & "-" & Month(Date) & _
    
 "-" & Day(Date) & "  " & Hour(Time) & "." & 
Minute(Time) & "   Бригада   " & Range("F5") & "-" & 
Range("F6") & ".PDF", Quality:= _
     xlQualityStandard, IncludeDocProperties:=True, IgnorePrintAreas:=False, OpenAfterPublish:=False
 
    Application.ScreenUpdating = True

Но так как на компьютере, где выполняется макрос установлен Excel 2003, эта операция невозможна.
Помогите пожалуйста переделать код, чтобы лист сохранялся в Worde.

Изменено: Vova6707.11.2017 15:36:00

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

Сохранять в Word не так-то просто. Для этого надо сначала подключиться к самому Word. Далее надо будет вставить все данные листа. А потом самое сложное — отформатировать так, чтобы это вменяемо выглядело. Попробуйте просто скопировать всю необходимую инф-цию с листа Excel и вставить её на чистый лист Word. Если результат устроит — постараюсь накидать код.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Vova67

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

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

#3

07.11.2017 16:06:53

Цитата
The_Prist написал:
Попробуйте просто скопировать всю необходимую инф-цию с листа Excel и вставить её на чистый лист Word. Если результат устроит — постараюсь накидать код.

Сделал как вы сказали. Результат полностью устроил.
Скопировал полностью лист Excel и вставил в Word

Изменено: Vova6707.11.2017 16:10:51

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#4

07.11.2017 18:06:39

Пробуйте:

Код
Sub SaveRangeToWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    Dim pathS As String, IsAppClose As Boolean
    
    Application.ScreenUpdating = False
    
    'пытаемся подключится к Word
    On Error Resume Next
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        Set objWrdApp = CreateObject("Word.Application")
        IsAppClose = True
        'если надо сделать видимым - раскомментировать
        'objWrdApp.Visible = True
    End If
    On Error GoTo 0
    If objWrdApp Is Nothing Then
        MsgBox "Не удалось подключиться к Word"
        Application.ScreenUpdating = True
        Exit Sub
    End If
    Set objWrdDoc = objWrdApp.Documents.Add

    pathS = "\192.168.64.33Quality10-ТЕСТЫ ПРОИЗВОДСТВОАрхив рапортов"
    objWrdDoc.SaveAs pathS & Year(Date) & "-" & Month(Date) & _
                "-" & Day(Date) & "  " & Hour(Time) & "." & _
                Minute(Time) & "   Бригада   " & Range("F5") & "-" & _
                Range("F6") & ".doc"
    
    Sheets("Рапорт").UsedRange.Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste

    objWrdDoc.Close False
    If IsAppClose Then
        objWrdApp.Quit
    End If
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
    Application.ScreenUpdating = True
End Sub

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

cuprum

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

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

А если попробовать печать на виртуальный принтер типа doPDF?

 

Vova67

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

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

К сожалению такой вариант не подходит, лист «Рапорт» должен распечатываться и сохраняться его копия в один клик. Таковы условия на производстве…

The_Prist

, вставил Ваш код, создается вордовский файл, с нужным именем, но пустой…

 

Александр П.

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

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

#7

08.11.2017 02:31:45

The_Prist, Простите Дмитрий, у вас в 34ой строчке не опечатка ?

Код
objWrdDoc.Close False

Наверное, всё же, так должно быть.:)

Код
objWrdDoc.Close True

Изменено: Александр П.08.11.2017 02:36:44

 

Vova67

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

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

Александр П.

— в точку! Все работает!

Спасибо

The_Prist

, спасибо

Александр П.

!

 

Vova67

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

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

Эх, еще маленький нюанс.Не сохраняется диаграмма . Но если это сложно, то и фиг с ней.
И так сойдет(с)

 

The_Prist

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

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

Профессиональная разработка приложений для MS Office

#10

08.11.2017 20:41:54

Цитата
Александр П. написал:
у вас в 34ой строчке не опечатка ?

Нет, надо было просто строки местами поменять, что я забыл сделать :)

Код
Sub SaveRangeToWord()
    Dim objWrdApp As Object, objWrdDoc As Object
    Dim pathS As String, IsAppClose As Boolean
     
    Application.ScreenUpdating = False
     
    'пытаемся подключится к Word
    On Error Resume Next
    Set objWrdApp = GetObject(, "Word.Application")
    If objWrdApp Is Nothing Then
        Set objWrdApp = CreateObject("Word.Application")
        IsAppClose = True
        'если надо сделать видимым - раскомментировать
        'objWrdApp.Visible = True
    End If
    On Error GoTo 0
    If objWrdApp Is Nothing Then
        MsgBox "Не удалось подключиться к Word"
        Application.ScreenUpdating = True
        Exit Sub
    End If
    Set objWrdDoc = objWrdApp.Documents.Add

    Sheets("Рапорт").UsedRange.Copy
    'вставляем скопированные ячейки в Word - в начала документа
    objWrdDoc.Range(0).Paste
    pathS = "\192.168.64.33Quality10-ТЕСТЫ ПРОИЗВОДСТВОАрхив рапортов"
    objWrdDoc.SaveAs pathS & Year(Date) & "-" & Month(Date) & _
                "-" & Day(Date) & "  " & Hour(Time) & "." & _
                Minute(Time) & "   Бригада   " & Range("F5") & "-" & _
                Range("F6") & ".doc"
 
    objWrdDoc.Close False
    If IsAppClose Then
        objWrdApp.Quit
    End If
    Set objWrdDoc = Nothing: Set objWrdApp = Nothing
    Application.ScreenUpdating = True
End Sub

Цитата
Vova67 написал:
Не сохраняется диаграмма

Не знаю что там не сохраняется и где именно эта диаграмма. Как вариант можно попробовать в обязательном порядке в крайней нижней правой ячейке от  диаграммы поставить пробел и после этого выполнять макрос. Возможно, диаграмма полностью не попадает в рабочую область и именно поэтому не копируется. Но объекты при методе Copy с листа Excel могут не попадать в буфер обмена (наблюдал такое поведение на некоторых версиях).

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Vova67

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

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

#11

09.11.2017 10:32:12

Цитата
The_Prist написал:
Возможно, диаграмма полностью не попадает в рабочую область и именно поэтому не копируется.

Да, именно эта причина. Немного поигрался местоположением диаграммы и все стало хорошо. Большое вам спасибо.

И пробел тоже помог…

Изменено: Vova6709.11.2017 11:10:18

 

Olzhas

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

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

#12

22.01.2021 13:50:52

Цитата
The_Prist написал:
Нет, надо было просто строки местами поменять, что я забыл сделать Код

Добрый день!
При попытке использовать ваш код выгружается растянутая таблица без колонтитула.
Можете подсказать, как сделать так, чтобы выгрузить лист целиком в Word, включая колонтитулы?  

Изменено: Olzhas03.03.2021 12:34:22

 

Дмитрий(The_Prist) Щербаков

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

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

Профессиональная разработка приложений для MS Office

#13

22.01.2021 14:12:34

Цитата
Olzhas написал:
включая колонтитулы?  

файл не смотрел, но колонтитулы вообще отдельная тема и их так же отдельно надо переносить. Копировать не получится. Не самая простая тема.
Ну а про это

Цитата
Olzhas написал:
выгружается растянутая таблица

я писал в самом начале темы:

Цитата
The_Prist написал:
А потом самое сложное — отформатировать так, чтобы это вменяемо выглядело.

после переноса надо все подгонять под нужный Вам формат. Тоже не самое мое любимое занятие. Это надо делать уже в Word. Перенесите туда таблицу как есть и попробуйте отформатировать до нужного состояния руками. Если это будет просто(типа просто ужали её с краев) — значит вполне легко можно это записать макрорекордером ворда и подставить в код из Excel. А если там куча подстроек под размер — это уже совершенно отдельная тема и тоже не самая простая, возможно.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

A couple quick things will get you to a solution.

The first is to loop through the worksheets in your workbook, like this:

Dim ws As Worksheet
For Each ws in ThisWorkbook.Sheets
    Debug.Print "The used range is " & ws.UsedRange.Address
Next ws

The next part is to understand how adding content to a Word document is accomplished. The main concept involves where the insertion point for the document is located — generally this is the current Selection.

When you cut and paste into a Word document, the content just pasted is still «selected». This means that any subsequent paste will effectively replace what you just inserted. So you have to move the selection point to the end of the document.

Putting it all together in an example program:

Option Explicit

Public Sub ExcelToWord()
    Dim wb As Workbook
    Set wb = ThisWorkbook

    '--- create the Word document
    Dim objWd As Word.Application
    Set objWd = CreateObject("word.application")
    objWd.Visible = True

    Dim objDoc As Word.Document
    Set objDoc = objWd.Documents.Add
    objDoc.PageSetup.Orientation = 1             '  portrait = 0

    Const wdPageBreak As Long = 7

    Dim ws As Worksheet
    For Each ws In wb.Sheets
        ws.UsedRange.Copy
        objWd.Selection.Paste
        '--- advance the selection point to the end of
        '    the document and insert a page break, then
        '    advance the insertion point past the break
        objDoc.Characters.Last.Select
        objWd.Selection.InsertBreak wdPageBreak
        objDoc.Characters.Last.Select
    Next ws
    'objDoc.SaveAs Application.ThisWorkbook.Path & ".dokument.docx"
End Sub

Сохранить листа Exel в .docx.

Otradnoe_4D

Дата: Воскресенье, 20.08.2017, 00:03 |
Сообщение № 1

Группа: Пользователи

Ранг: Прохожий

Сообщений: 3


Репутация:

0

±

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


Excel 2013

Добрый. Помогите доработать код VBA. Мне нужно сохранить лист Exel в .docx. Возникло несколько проблем. Выскакивает окно с вопросом сохранить ли книгу Exel сохранять ее не надо, хочется что бы окно не выскакивало.
И еще в Ворде все выглядит так как на Screenshot_2.jpg а нужно что бы было как на Screenshot_3.jpg.
Еще заметил что текст копируется как таблица. Хочется что бы не таблицей копировалось а просто как текст.
Так же поля надо настроить лев:3 верх:2 низ:2 прав:1

Я в макросах плохо разбираюсь и этот код собрал из того что нашел в интернете если не сложно то предлагайте свои более мудрые варианты)

[vba]

Код

Sub save_As_Word_3()
    Application.ScreenUpdating = False
    Dim curWb As Workbook, newWb As Workbook, wdApp As Object, wdDoc As Object, folderName As String
    folderName = createFolder(«Рапорт», ThisWorkbook.Path)
    ‘ Текущий файл
    Set curWb = ThisWorkbook
    ‘ Новая копия
    Workbooks.Add
    Set newWb = ActiveWorkbook

        ‘ Копируем все ячейки в новую книгу — значения, форматы
    curWb.Sheets(«Рапорт»).Cells.Copy
    With newWb.ActiveSheet.Cells
        .PasteSpecial xlPasteValues
        .PasteSpecial xlPasteFormats
        Range(«A1»).Select
    End With

    ‘ Имя сохранения из ячейки B1
    saveName = curWb.Sheets(«Информация»).Range(«B1»)

        ‘ Создаём документ Word
    Set wdApp = CreateObject(«Word.Application»)
    wdApp.Documents.Add
    Set wdDoc = wdApp.ActiveDocument
    ‘ С копии листа Учсуд скопируем используемый диапазон
    ActiveSheet.UsedRange.Copy
    wdDoc.Range.Paste
    ‘  Word’e другая модель сохранения, сначала перейдем в папку
    wdApp.ChangeFileOpenDirectory folderName
    ‘ Сохраним
    wdDoc.SaveAs Filename:=saveName & «.docx», FileFormat:=wdFormatXMLDocument

                     ‘ К закрытию все причешем
    Application.CutCopyMode = False
    wdDoc.Close
    wdApp.Quit
    newWb.Close
    Application.ScreenUpdating = True
End Sub

‘ Проверить (и создать при необходимости папку, вернуть путь
Function createFolder(folderName As String, Optional folderPath As String = «») As String
    Dim fso As Object, folderFullPath As String
    If folderPath = «» Then folderPath = ThisWorkbook.Path
    folderFullPath = folderPath & «» & folderName & «»
    Set fso = CreateObject(«scripting.filesystemobject»)

        If Not fso.FolderExists(folderFullPath) Then
        fso.createFolder (folderFullPath)
    End If
    createFolder = folderFullPath
End Function

[/vba]

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

-1-.xlsm
(36.5 Kb)

Сообщение отредактировал Otradnoe_4DВоскресенье, 20.08.2017, 15:42

 

Ответить

Otradnoe_4D

Дата: Воскресенье, 20.08.2017, 00:25 |
Сообщение № 2

Группа: Пользователи

Ранг: Прохожий

Сообщений: 3


Репутация:

0

±

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


Excel 2013

Скриншоты

Сообщение отредактировал Otradnoe_4DВоскресенье, 20.08.2017, 15:48

 

Ответить

iMrTidy

Дата: Воскресенье, 20.08.2017, 00:47 |
Сообщение № 3

Группа: Пользователи

Ранг: Участник

Сообщений: 85


Репутация:

14

±

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


NO

Otradnoe_4D, а для чего Вы создаете новую книгу Excel?

У процедуры Close есть параметры, первый из которых как раз позволяет обойтись без сохранения:

Чтобы вставить не таблицей, а текстом лучше вручную формировать документ. Логично было бы попробовать PasteSpecial DataType:=2, но у Вас там объединение ячеек, и по-крайней мере у меня текст вставляется то количество раз, сколько объединенных ячеек.


Вышенаписанное мной не является истиной, но лишь моя точка зрения, которая скорее всего ошибочна.

 

Ответить

Otradnoe_4D

Дата: Воскресенье, 20.08.2017, 01:02 |
Сообщение № 4

Группа: Пользователи

Ранг: Прохожий

Сообщений: 3


Репутация:

0

±

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


Excel 2013

Otradnoe_4D, а для чего Вы создаете новую книгу Excel?

Не знаю))) Такой код был уже… я же без понятия что и как делать)))
Если вам не трудно то исправьте так как правильно будет. В прицепе я сделал так как вы написали и окно о сохранение пропало.

 

Ответить

iMrTidy

Дата: Воскресенье, 20.08.2017, 01:37 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 85


Репутация:

14

±

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


NO

Не знаю))) Такой код был уже… я же без понятия что и как делать)))

Тогда Вам лучше обратиться в раздел Работа.

А то получается:
— Я на гитаре играть не умею, только вот научился за нижнюю струну дергать, но мне нужно сочинить красивую мелодию. Сделайте пожалуйста.


Вышенаписанное мной не является истиной, но лишь моя точка зрения, которая скорее всего ошибочна.

 

Ответить

Pelena

Дата: Воскресенье, 20.08.2017, 10:54 |
Сообщение № 6

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Лично у меня на Радикал отображается всё, что угодно, только не скриншоты. Прикладывайте все файлы к сообщениям.

iMrTidy, для оформления кода используйте кнопку # ([vba][code]), а не fx ([code])
И да, не спешите посылать ТС в платный раздел, возможно, найдутся желающие потренироваться yes


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

This Excel VBA tutorial explains how to export Excel to Word.

You may also want to read:

Export Excel to PDF

In the previous post, I demonstrated how to export Excel to PDF, which is very easy because there is already a built in function to do that (using Save As and choose PDF). However, there is no built in function to export Excel to Word. Fortunately Excel cell is actually a table in Word, we can simply copy the cells and paste to Word. This tutorial explains how to do it automatically using Excel VBA to export Excel to Word.

Excel VBA export Excel to Word (Single Worksheet)

Excel has about 1M rows and 16k columns, we cannot simply export the whole spreadsheet to Word. So the first question to think about is, what Range do we need to export to Word? My recommendation is to export all UsedRange. You may also consider to reset UsedRange before copy as explained in my previous post.

Insert the following Procedure in Excel Module

Sub export_excel_to_word()
    Set obj = CreateObject("Word.Application")
    obj.Visible = True
    Set newObj = obj.Documents.Add
    ActiveSheet.UsedRange.Copy
    newObj.Range.Paste
    Application.CutCopyMode = False
    obj.Activate
    newObj.SaveAs Filename:=Application.ActiveWorkbook.Path & "" & ActiveSheet.Name
End Sub

For example, we have the below worksheet

export Excel to Word 01

Run the Macro, and the below new Word document will pop up. The Word document is automatically saved as the Worksheet name under the same folder of the Workbook.

export Excel to Word 02

It is possible that the imported table length is too wide to display in Word, you can also use Word VBA Table.AutoFitBehavior Method to auto fit the table, which has the same effect of AutoFit in Word as below.

export Excel to Word 03

Run the below macro in Word VBA to loop through all tables in Word document to autosize.

Sub autoSizeTbl()
    For Each tbl In ActiveDocument.Tables
        tbl.AutoFitBehavior wdAutoFitContent
    Next
End Sub

Ideally this Macro can be run from Excel VBA, unfortunately I can’t get it work properly.

Excel VBA export Excel to Word (Multiple Worksheets)

Assume that we have Sheet1, Sheet2, Sheet3 in a Workbook “Export.xlsm”, we want to export all three worksheets to a single workbook.

export Excel to Word 04

Insert a Excel Module and paste the below Procedure.

The below Procedure will copy usedRange of each Worksheet to Word and page break by each Worksheet. Finally save and name the Word document as the Workbook name.

Sub export_workbook_to_word()
    Set obj = CreateObject("Word.Application")
    obj.Visible = True
    Set newobj = obj.Documents.Add
    
    For Each ws In ActiveWorkbook.Sheets
        ws.UsedRange.Copy
        newobj.ActiveWindow.Selection.PasteExcelTable False, False, False
        newobj.ActiveWindow.Selection.InsertBreak Type:=7
    Next
        newobj.ActiveWindow.Selection.TypeBackspace
        newobj.ActiveWindow.Selection.TypeBackspace
          
    obj.Activate
    newobj.SaveAs Filename:=Application.ActiveWorkbook.Path & "" & Split(ActiveWorkbook.Name, ".")(0)

End Sub

Run the Macro, a Word document called “Export.docx” pops up. Worksheet1 is pasted in page 1, Worksheet2 is pasted in page 2, Worksheet3 is pasted in page 3.

export Excel to Word 05

export Excel to Word 06

export Excel to Word 07

Несколько быстрых вещей приведут вас к решению.

Первый — это циклически просматривать листы в вашей книге, например так:

Dim ws As Worksheet
For Each ws in ThisWorkbook.Sheets
    Debug.Print "The used range is " & ws.UsedRange.Address
Next ws

Следующая часть состоит в том, чтобы понять, как выполняется добавление содержимого в документ Word. Основная концепция заключается в том, где находится точка вставки документа — обычно это текущая Selection,

Когда вы вырезаете и вставляете в документ Word, только что вставленный контент остается «выделенным». Это означает, что любая последующая вставка эффективно заменит то, что вы только что вставили. Таким образом, вы должны переместить точку выбора в конец документа.

Собираем все вместе в пример программы:

Option Explicit

Public Sub ExcelToWord()
    Dim wb As Workbook
    Set wb = ThisWorkbook

    '--- create the Word document
    Dim objWd As Word.Application
    Set objWd = CreateObject("word.application")
    objWd.Visible = True

    Dim objDoc As Word.Document
    Set objDoc = objWd.Documents.Add
    objDoc.PageSetup.Orientation = 1             '  portrait = 0

    Const wdPageBreak As Long = 7

    Dim ws As Worksheet
    For Each ws In wb.Sheets
        ws.UsedRange.Copy
        objWd.Selection.Paste
        '--- advance the selection point to the end of
        '    the document and insert a page break, then
        '    advance the insertion point past the break
        objDoc.Characters.Last.Select
        objWd.Selection.InsertBreak wdPageBreak
        objDoc.Characters.Last.Select
    Next ws
    'objDoc.SaveAs Application.ThisWorkbook.Path & ".dokument.docx"
End Sub

Like this post? Please share to your friends:
  • Vba excel сохранить книгу как без подтверждения
  • Vba excel сохранить как копию
  • Vba excel сохранить как книгу без макросов
  • Vba excel сохранить изменения в книге
  • Vba excel сохранить документ word