Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.09.2011, 15:06   #1
timsun
 
Регистрация: 12.09.2011
Сообщений: 4
По умолчанию VBA: копирование областей печати в Word

Доброго времени суток.
Имеется книга состоящая из множества листов с данными.
На каждом листе задана область печати, диапазон ячеек в каждой области печати может быть различным.
При копировании диапазонов областей печати из Excel в Word средствами VBA возникает проблема: диапазоны областей печати, состоящие из не смежных диапазонов ячеек (например: ActiveSheet.PageSetup.PrintArea = "$B$3:$K$29,$N$3:$T$21"), не копируются в Word.

Вопрос: имеется ли возможность в VBA для решения данной проблемы.
timsun вне форума Ответить с цитированием
Старый 12.09.2011, 15:59   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Да, конечно.
Разбиваете эти диапазоны на части - и копируете в Word по-одному:

Код:
Sub test()
    Dim ra As Range, ar As Range
    Set ra = Range(ActiveSheet.PageSetup.PrintArea) ' область печати
    For Each ar In ra.Areas    ' перебираем все области
        'Debug.Print ar.Address
        ar.Copy    ' копируем
        appWord.PasteExcelTable False, False, False    ' вставляем в Word
    Next ar
    Application.CutCopyMode = False
End Sub
EducatedFool вне форума Ответить с цитированием
Старый 15.09.2011, 12:19   #3
timsun
 
Регистрация: 12.09.2011
Сообщений: 4
По умолчанию

Спасибо за помощь.
Но код не работает на странице с областью печати, состоящей из не смежных диапазонов ячеек возникает ошибка:

Run-time error '1004'
Method 'Range' of object '_Global' failed
timsun вне форума Ответить с цитированием
Старый 15.09.2011, 12:23   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Неужели так сложно почитать правила раздела, и прикрепить файл, на которой возникает ошибка?

Я тестировал на вашем примере (ActiveSheet.PageSetup.PrintArea = "$B$3:$K$29,$N$3:$T$21") - всё работает
EducatedFool вне форума Ответить с цитированием
Старый 15.09.2011, 12:59   #5
timsun
 
Регистрация: 12.09.2011
Сообщений: 4
По умолчанию

Пользуюсь MS Office 2010.
Файл, где возникает ошибка, приложил согласно правилам. Хотя ошибка у меня возникает в любом похожем примере, где количество диапазонов >1.
Вложения
Тип файла: zip Книга1.zip (8.8 Кб, 10 просмотров)
timsun вне форума Ответить с цитированием
Старый 15.09.2011, 14:08   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

У меня всё работает:

Код:
Sub test()
    Dim ra As Range, ar As Range
    Set wa = CreateObject("Word.Application")
    wa.Visible = True: Set wd = wa.Documents.Add

    Set ra = Range(ActiveSheet.PageSetup.PrintArea)    ' область печати
    For Each ar In ra.Areas    ' перебираем все области
        ar.Copy    ' копируем
        wa.Selection.PasteExcelTable False, False, False    ' вставляем в Word
    Next ar
    Application.CutCopyMode = False
End Sub
Скриншот результата: http://www.ExcelVBA.ru/pictures/20110915-88m-214kb.jpg

Пример в вашем файле: http://excelvba.ru/XL_Files/Sample__...__16-14-09.zip
EducatedFool вне форума Ответить с цитированием
Старый 15.09.2011, 14:40   #7
timsun
 
Регистрация: 12.09.2011
Сообщений: 4
По умолчанию

Попробовал на разных компах: переменной ra присваивается значение только при версии Excel 2003, видимо что-то с настройками, буду искать.
В любом случае, спасибо.
timsun вне форума Ответить с цитированием
Старый 15.09.2011, 15:39   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,858
По умолчанию

Проблема была в том, что Excel 2003 выдаёт свойство ActiveSheet.PageSetup.PrintArea так:
Цитата:
$B$1:$K$19,$N$1:$V$14
а Excel 2007 и старше - так:
Цитата:
$B$1:$K$19;$N$1:$V$14
Чтобы функция RANGE поняла адрес диапазона, он должен разделяться запятыми.
Поэтому надо исправить код макроса:

Код:
Sub test()
    Dim ra As Range, ar As Range
    Set wa = CreateObject("Word.Application")
    wa.Visible = True: Set wd = wa.Documents.Add

    Set ra = Range(Replace(ActiveSheet.PageSetup.PrintArea, ";", ","))  ' область печати
    For Each ar In ra.Areas    ' перебираем все области
        ar.Copy    ' копируем
        wa.Selection.PasteExcelTable False, False, False    ' вставляем в Word
    Next ar
    Application.CutCopyMode = False
End Sub
Теперь будет работать во всех версиях Excel: http://excelvba.ru/XL_Files/Sample__...__17-39-00.zip
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA Word,VBA Excel решить 2 задачи fafolo4ka Фриланс 6 05.03.2012 01:15
Копирование объектов из WORD dgleg Общие вопросы Delphi 0 28.12.2010 15:35
Копирование областей экрана DRAgon™ Паскаль, Turbo Pascal, PascalABC.NET 22 23.07.2010 21:54
Нужна программа или макрос для печати шаблонов word с данными взятыми из таблицы EXCEL dimatz Microsoft Office Excel 3 05.03.2010 12:17
Сложное копирование в Word. rzrwolf Microsoft Office Excel 2 11.01.2009 05:48