В двух словах: в Excel есть большая таблица,в Excel параметры страницы сделаны так, чтоб колонки и строки не выходили за границы печатной страници. Нужно экспортировать в Word так, чтоб параметры листа сохранились, и не приходилось танцевать с бубном, и подгонять таблицу, чтоб ничего не вылезало. Специальная вставка не подойдет!
На www.sql.ru предложили код с комментариями. Есть баги, которые и прошу помочь исправить.
Скрытый текст
Код
Option Explicit
' ===========================================================================' =============================================================================
' копирование таблицы с первого листа данной книги в новый документ word
' обработка примера http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=971576&msg=13214591
Sub copypast()
'баг1: таблица получается не на всю ширину страницы :(
'баг2: после вставки word, собако, подбирает ширину столбцов "по содержимому"
'
Const wdCollapseStart = 1, wdCollapseEnd = 0
Dim wd As Object, doc As Object
Dim iTmpRow As Long, s As String
'создать объект word, добавить новый документ
Set wd = CreateObject("word.application")
Set doc = wd.documents.Add
With ThisWorkbook.Worksheets(1)
With .PageSetup
' *** размер страницы
' (!) будет работать только для форматов А3,А4
' (!) для остальных форматов не проверял соответствие вордовских и экселевских констант
'xlPaperA4= 9 wdPaperA4= 7
'xlPaperA3= 8 wdPaperA3= 6
doc.PageSetup.PaperSize = .PaperSize - 2
' *** ориентация страницы
'xlLandscape= 2 wdOrientLandscape= 1
'xlPortrait= 1 wdOrientPortrait= 0
doc.PageSetup.Orientation = .Orientation - 1
' *** поля
doc.PageSetup.TopMargin = .TopMargin
doc.PageSetup.BottomMargin = .BottomMargin
doc.PageSetup.LeftMargin = .LeftMargin
doc.PageSetup.RightMargin = .RightMargin
' *** сквозная *строка*
' (!) не строкИ, т.к. WORD не даст задать более одной строки в качестве заголовка
' (!) таблицы, если в последней есть вертикальное объединение ячеек
'
' если .PrintTitleRows = "" то сквозных строк нет
s = .PrintTitleRows
End With '.PageSetup
With .UsedRange
If Len(s) > 0 Then iTmpRow = .Range(s).Row
If iTmpRow > 1 Then
'добавляем абзац в начало документа (позже пригодится)
wd.Selection.InsertParagraphBefore
wd.Selection.collapse wdCollapseEnd
Else
iTmpRow = 1
End If
'копипастим часть экселевской таблицы от "сквозной" строки до конца
.Rows(iTmpRow & ":" & .Rows.Count).Copy
wd.Selection.PasteExcelTable False, False, False
'если в экселевской таблице есть "сквозные" строки
'назначить первую строку вордовской таблицы её "шапкой"
If Len(s) > 0 Then
'баг3 ' *непонятно*
' если устанавливать это свойство программно - не рисует шапку
' на каждой странице, хотя в юзерфейсе ворда флажок <Заголовки>
' для данной таблицы устанавливается
doc.tables(1).Rows.HeadingFormat = True
End If
' если "сквозная" строка в экселевской таблице не первая
If iTmpRow > 1 Then
'смещаем Selection в начало документа
wd.Selection.Start = 0
wd.Selection.collapse wdCollapseStart
'копипастим "шапку" экселевской таблицы (от начала до "сквозной строки")
.Rows("1:" & (iTmpRow - 1)).Copy
wd.Selection.PasteExcelTable False, False, False
'уменьшпем величину шрифта "буферного" абзаца
wd.Selection.Font.Size = 1
End If
End With '.UsedRange
End With 'ThisWorkbook.Worksheets(1)
'освободить буфер обмена
Application.CutCopyMode = False
Set doc = Nothing
wd.Visible = True
Set wd = Nothing
End Sub
Пример таблицы и того, что хочется получить в итого прикрепляю.
З.Ы. Поиском по форуму пользовался. Вопросы подобные моему в архиве. Решения удовлетворяющего полностью условия не нашел.
EducatedFool Конечно не секрет. Лично меня все устраивает и на печать он все правильно выводит, но руководство требует Word. Тем более, что в некоторых файлах, которые необходимо перегнать в Word довольно громоздкие формулы (не в этом примере) и когда кто-то пытается что-то "подшаманить" сбивается все.
galina mur Спасибо за совет, но это тоже не совсем удобно. С таким же успехом я могу сохранить в PDF, а потом его в Word программой по типу "solid converter". Гораздо удобнее будет сделать это нажав кнопочку))). Но если никто не поможет доделать макрос, то тогда буду уже ити по вашему пути.
wgraf---шаблон листа(ориентация, поля,макрос mm_graf) откройте шаблон в ворде w2007 и запустите макрос, который вставит ексель файл из этого каталога в ворд ------ на всякий случай создайте новый пустой каталог, в который распакуйте зип если у вас 2003 --переформирую, хотя надо будет исправить ссылку reference
galina mur Спасибо , но это не совсем то. Данный шаблон листа придется "подганять" под каждый случай. Практически такой же результат я получи использовав имеющийся код. Да и желательно чтоб макрос запускался с файла Excel, а не Word.
Вот для наглядности результат применения вашего способа и имеющегося кода на другом примере.
Так, ка размер файла превысил 100 кб. даю на него ссылку.
поля я не прописывала(это только макет макроса) но у каждого бланка есть особенности по крайней мере --ориентация ------- добавила в макрос 1 строку надо бы еще 2 добавить --поля ячейки