18/6/2024
Иногда, необходимо сделать копию текущего документа и продолжить работу с ним. В программе Corel Draw есть метод у документа Document.SaveAsCopy, но, увы, он некорректно работает. Причем уже много лет и проблема не исправлена до сих пор.
Рассмотрим, как работает этот метод.
Sub my_SaveAsCopy()
Dim OptSave As New StructSaveAsOptions
OptSave.Range = cdrSelection
ActiveDocument.SaveAsCopy "D:\copy_file.cdr", OptSave
End Sub
Если в качестве параметра Range указан cdrSelection (выделение), то все происходит нормально. Сохраняется копия файла, которая не открывается и вы продолжаете работать в исходном файле. Все хорошо, но нужно выделять всё, что необходимо сохранить. Неудобно.
Sub my_SaveAsCopy()
Dim OptSave As New StructSaveAsOptions
OptSave.Range = cdrAllPages
ActiveDocument.SaveAsCopy "D:\copy_file.cdr", OptSave
End Sub
Если в качестве параметра Range указан cdrAllPages (все страницы), то результат будет идентичен пункту меню Save As (сохранить как). Текущий документ сохранится с новым именем и он будет текущим открытым. Это совсем не то, чего хотелось.
Есть еще одно значение данного параметра cdrCurrentPage (текущая страница).
Sub my_SaveAsCopy()
Dim OptSave As New StructSaveAsOptions
OptSave.Range = cdrCurrentPage
ActiveDocument.SaveAsCopy "D:\copy_file.cdr", OptSave
End Sub
Но результат выдает ошибку и... длится это уже много лет.
В сообществе Корела недавно вспомнили эту проблему и решили поделиться, кто как решает её. Одно из решений следующее (учитывайте, что это все делается через одно место):
1. Создаем новый документ
2. Копируем всё с текущего листа в новый документ
3. Сохраняем новый документ с другим именем
4. Закрываем новый документ
Sub my_SaveCurrentPageAsCopy()
Dim cdrDoc As Document
Dim tempDoc As Document
Dim page As Page
Dim filePath As String
' Определяем путь для записи копии текущей страницы
filePath = "D:\current_page_copy.cdr"
' Проверяем, что есть текущий документ открытый
If Application.ActiveDocument Is Nothing Then
MsgBox "Нет открытого документа", vbCritical
Exit Sub
End If
' Ссылаемся на активный документ и на текущую активную страницу
Set cdrDoc = Application.ActiveDocument
Set page = cdrDoc.ActivePage
' Создаем новый документ
Set tempDoc = Application.CreateDocument
' Копируем все объекты с текущей страницы активного документа
page.Shapes.All.Copy
' Вставляем скопированные объекты в новый документ
tempDoc.ActiveLayer.Paste
' Сохраняем новый документ и закрывем его
tempDoc.SaveAs filePath
tempDoc.Close
' Выводим сообщение об успешном сохранении копии
MsgBox "Текущая страница сохранена, как " & filePath, vbInformation
End Sub
Вот с такими «костылями» сохраняем копию нашей текущей страницы 🤪.
Комментарии: