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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.12.2009, 12:53   #1
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию Как скопировать range в другой документ

Есть 2 документа. Хочу скопировать range из 1ого во 2ой. Как это сделать не используя clipboard?
Есть ли возможность скопировать range в другой документ предварительно не сохраняя документ в который планируется вставить range?
У range-a есть методы ExportFragment и ImportFragment, но они принимают параметром путь к файлу.
Как это сделать в одном документе?

Последний раз редактировалось Diego__; 17.12.2009 в 13:18.
Diego__ вне форума Ответить с цитированием
Старый 17.12.2009, 16:43   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

MathType это делает таким макросом
Код:
Function CopyRange(ByVal rng As Range) As Range
    Dim saved As Range
    Set saved = Selection.Range
    rng.Select
    Set CopyRange = Selection.Range ' makes a copy, not a reference
    If right(CopyRange.Text, 2) = Chr(13) & Chr(7) Then CopyRange.SetRange CopyRange.start, CopyRange.end - 1
    saved.Select
End Function
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 17.12.2009, 18:36   #3
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

До этого момента было понятно, а сейчас ... не сильно разбираюсь в VBA, если быть точным - вообще не шарю
Вроде, рекурсия там....

можно немного описания, типа, вызвать то-то у того-то?
Diego__ вне форума Ответить с цитированием
Старый 17.12.2009, 20:05   #4
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Никакой рекурсии. Просто в бейсике, чтобы вернуть значение из функции его нужно присвоить имени функции. Извини, думал что ты понимаешь. Вот код с комментариями.
Код:
Function CopyRange(ByVal rng As Range) As Range
    Dim saved As Range
    'Запоминаем в переменную выделенный диапазон
    Set saved = Selection.Range
    'Выделяем диапазон, переданный в качестве аргумента
    rng.Select
    'Функции даём возвратить выделенный диапазон
    Set CopyRange = Selection.Range ' makes a copy, not a reference
    'Если переданный функции диапазон находится в ячейке таблицы (символ с кодом 7 — знак конца ячейки) _
    то сжимаем возвращаемый диапазон на 1 символ справа
    If right(CopyRange.Text, 2) = Chr(13) & Chr(7) Then CopyRange.SetRange CopyRange.start, CopyRange.end - 1
    'Выделяем сохранённый диапазон
    saved.Select
End Function
Добавлено позже
Но с двумя документами такой фокус не пройдёт:
Код:
Sub test()
  Dim newdocrng As Range
  Dim olddoc As Document
  Set olddoc = ActiveDocument
  
  Set newdocrng = Documents.Add().Range 'Диапазон нового документа
  Set newdocrng = olddoc.Paragraphs.First.Range 'А здесь уже старого
  Set newdocrng = CopyRange(olddoc.Paragraphs.First.Range) 'И здесь тоже старого
End Sub
Попробовал экспорт во временный файл, а потом импорт, но даёт ошибку
Код:
Sub test()
  Dim FSO As Object
  Dim sFileName As String
  Dim onewdoc As Range
  
  Set FSO = CreateObject("Scripting.FileSystemObject")
  sFileName = FSO.GetTempName()
  sFileName = Environ("temp") & "\" & sFileName
  ActiveDocument.Paragraphs.First.Range.ExportFragment sFileName, wdFormatDocument
  Set onewdoc = Documents.Add().Range
  With onewdoc
    .Collapse
    .ImportFragment sFileName, False
  End With
End Sub
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 17.12.2009 в 20:52.
viter.alex вне форума Ответить с цитированием
Старый 18.12.2009, 17:29   #5
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо за объяснения
Diego__ вне форума Ответить с цитированием
Старый 20.12.2009, 00:31   #6
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Diego__, я когда то вам уже предлагал подобное в другом топике
1) В исходном документе определяете Bookmark для вашего ранга
2) В принимающий документ вставляете поле INCLUDETEXT с этой закладкой.
3) Обновляете поле и отвязываете его от источника.
Aent вне форума Ответить с цитированием
Старый 24.12.2009, 17:19   #7
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Что то похожее было...
через includetext добавлял xml документ с подготовленным WordArt-ом.

Код:
CComVariant inc(Word::wdFieldIncludeText);
_variant_t v_path(L"\"D://DOCTemplate.xml\"");
Word::FieldPtr field = m_WordDocument->Fields->Add(range, &inc, &v_path);

field->Update();
field->Unlink();
а, вот как реализовать передачу range-a через данный механизм непонятно

пробую
Код:
Word::RangePtr range = firstDocument->GetParagraphs()->GetLast()->GetRange();
range->InsertAfter(L"param pam pam");

VARIANT anchor;
anchor.vt = VT_DISPATCH;
anchor.pdispVal = range;

_bstr_t str(L"MyBookmark");
Word::BookmarkPtr myBookmark = m_WordDocument->Bookmarks->Add(str, &anchor);

	
Word::RangePtr range2 = secondDocument->GetParagraphs()->GetLast()->GetRange();

VARIANT bookmarkVar;
bookmarkVar.vt = VT_DISPATCH;
bookmarkVar.pdispVal = myBookmark;

CComVariant type(Word::wdFieldIncludeText);
Word::FieldPtr field = secondDocument->Fields->Add(range2, &type, &bookmarkVar);

field->Update();
field->Unlink())
после secondDocument->Fields->Add(range2, &type, &bookmarkVar); в документе приемнике получаю "Error! Not a valid filename."
что я делаю не так? Можете привести небольшой пример?

Последний раз редактировалось Diego__; 24.12.2009 в 17:23.
Diego__ вне форума Ответить с цитированием
Старый 24.12.2009, 23:28   #8
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Вставляемое поле INCLUDETEXT должно иметь вид вида
{INCLUDETEXT D:\\123.docx bmk1}, где первый параметр имя файла
откуда берётся ранг, а второй - имя закладки для этого ранга.
Для исключения коллизий рекомендую для букмарков использовать короткие символьно-цифровые имена латиницей.
Aent вне форума Ответить с цитированием
Старый 25.12.2009, 12:53   #9
Diego__
Форумчанин
 
Регистрация: 12.08.2009
Сообщений: 118
По умолчанию

Спасибо, Aent. В коде выглядит так:
Код:
Word::RangePtr range = firstDocument->GetParagraphs()->GetLast()->GetRange();
range->InsertAfter(L"param pam pam");

VARIANT anchor;
anchor.vt = VT_DISPATCH;
anchor.pdispVal = range;

_bstr_t str(L"bmk1");

Word::BookmarkPtr myBookmark = m_WordDocument->Bookmarks->Add(str, &anchor);

CComVariant fileName(_T("C:\\BookmarkTest.doc"));
firstDocument->SaveAs(&fileName);

Word::RangePtr range2 = secondDocument->GetParagraphs()->GetLast()->GetRange();

CComVariant type(Word::wdFieldIncludeText);
CComVariant text(L"C://BookmarkTest.doc bmk1");

Word::FieldPtr field = secondDocument->Fields->Add(range2, &type, &text);
field->Update();
field->Unlink();
Здесь получается, что мой источник range-a должен быть сохранен. Можно тоже самое сделать не сохраняя ни один из документов?
Diego__ вне форума Ответить с цитированием
Старый 25.12.2009, 15:25   #10
Aent
Форумчанин
 
Аватар для Aent
 
Регистрация: 17.07.2009
Сообщений: 519
По умолчанию

Цитата:
Сообщение от Diego__;
Здесь получается, что мой источник range-a должен быть сохранен. Можно тоже самое сделать не сохраняя ни один из документов?
Нет. Для источника данных в INCLUDETEXT нужно указывать путь.
Пока документ не сохранён - пути нет ...
Aent вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как скопировать выпадающий список на другой лист и в другую книгу gleod Microsoft Office Excel 4 07.07.2009 22:36
Как правильно скопировать данные с одного текстового файла в другой? Dem80 Общие вопросы C/C++ 2 06.03.2009 22:17
Как скопировать текст из мемо одной формы в мемо другой CraZZy RabbIt Общие вопросы Delphi 4 27.02.2009 00:01
Как скопировать текст в буфер обмена с одного edit-a и вставить в другой SeRhy Общие вопросы Delphi 2 26.07.2008 23:02
открываю документ. ввожу дату и другие данные, как сделать чтобы на другой странице велась статистика по Аленка Microsoft Office Excel 5 12.02.2008 17:36