[CDR 2017-2021] Копирование из документа в документ. Проблема

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
Господа, бодрый день!
Прямо неудобно вас отвлекать на такое, но вот столкнулся с проблемой, может кто тоже сталкивался и знает решение.
Пишу макрос копирования группы страниц из одного файло в другой и столкнулся с такой проблемой: в режиме отладки все делает правильно, а при запуске в норм режиме - не вставляет из буфера памяти. Создается такое впечатление, что пока идет Copy в документе-источнике (макеты на страницах довольно тяжелые) макрос успевает завершиться не вставив ничего в документ-приемник. Задержку после ShapeRange.copy вставлял - не помогло. Помогите мыслью, пожалуйста.
 

dastin

Некромант-любитель
12 лет на форуме
Сообщения
2 147
Реакции
2 054
а Import как альтернатива не подходит?
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Завязывать макрос на системный клипбоард - очень плохая идея
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Хотя бы потому, что работа макроса с системными операциями совершенно не синхронизирована и возможность подобной синхронизации не предусмотрена разрабоичиками.
 

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
Корел утверждает, что должно работать:

The following VBA example copies each shape from the active page to a separate page in a new document.
Sub Test()
Dim s As Shape, bAddPage As Boolean
Dim doc1 As Document, doc2 As Document
Set doc1 = ActiveDocument
Set doc2 = CreateDocument()
bAddPage = False
For Each s In doc1.ActivePage.Shapes()
s.Copy
If bAddPage Then doc2.AddPages 1
doc2.ActiveLayer.Paste
bAddPage = True
Next s
End Sub
 

Gad

Сообщения
2 975
Реакции
1 408
Корел утверждает
С каких пор корел стал отвечать за правильность работы системных операций? '))'
при запуске в норм режиме - не вставляет из буфера памяти.
Вы уже нарвались на неприятность с буфером обмена, так зачем же упорно продолжаете настаивать на его использовании?
 
Последнее редактирование:

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
Удивительное рядом:
когда принудительно указал второй документ {Documents(2)} вместо ActiveDocument:
Documents(2).Activate
Documents(2).Pages(iPage).Activate
Documents(2).ClearSelection
Documents(2).ActivePage.Shapes.All.CreateSelection
Set iSR = ActiveSelectionRange
If iSR.Count = 0 Then
Documents(2).ActiveLayer.Paste
Else
iSR.Delete
Documents(2).ActiveLayer.Paste
End If
все заработало
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
Корел утверждает, что должно работать:

The following VBA example copies each shape from the active page to a separate page in a new document.
Sub Test()
Dim s As Shape, bAddPage As Boolean
Dim doc1 As Document, doc2 As Document
Set doc1 = ActiveDocument
Set doc2 = CreateDocument()
bAddPage = False
For Each s In doc1.ActivePage.Shapes()
s.Copy
If bAddPage Then doc2.AddPages 1
doc2.ActiveLayer.Paste
bAddPage = True
Next s
End Sub
Корел тут ничего не утверждает
Это просто пример использования функции
 
  • Спасибо
Реакции: BazzilioTheCat

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
С каких пор корел стал отвечать за правильность работы системных операций? '))'

Вы уже нарвались на неприятность с буфером обмена, так зачем же упорно продолжаете настаивать на его использовании?
потому что это самый простой вариант и потому что CorelDRAW Community утверждает, что это допустимая операция и потому что логика подсказывает, что это должно работать.
 

Gad

Сообщения
2 975
Реакции
1 408
это самый простой вариант
Для человека да :)
что может быть проще: ctrl+С - ctrl + V
это допустимая операция
Никто не утверждал обратного. Допустимая не значит что она будет работать быстро и "как часы" :)
логика подсказывает
Ну по крайней мере моя логика '))'
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 229
Реакции
10 851
потому что это самый простой вариант и потому что CorelDRAW Community утверждает, что это допустимая операция и потому что логика подсказывает, что это должно работать.
Логика подсказывает, что если капля водки ничего не стоит, то можно бесплатно бутылку водки себе накапать запросто.
Что касается вашей отсылки на CorelDRAW Community, так это я откровенно не понял. Здесь ваc цельных три Corel Community Professional уговаривают, как девственницу, что это не так, а вы упираетесь.
 
Последнее редактирование:
  • Спасибо
Реакции: DukereD

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
Ладно, когда подведет - буду посыпать себе голову пеплом, пока все работает как часы - 247 страничный файл объемом более 3 ГБ раскидал за несколько минут в 3 файло 100-100-47 страниц по 170 - 300 Мб каждый. Все страницы на месте. Спасибо что отвечаете, ну, а то, что мы нередко не сходимся во мнении - так это нормально. Никого не хотел обидеть. Спасибо, коллеги.
 
  • Спасибо
Реакции: DukereD

DukereD

макрософил
Сообщения
462
Реакции
114
Ладно, когда подведет - буду посыпать себе голову пеплом, пока все работает как часы - 247 страничный файл объемом более 3 ГБ раскидал за несколько минут в 3 файло 100-100-47 страниц по 170 - 300 Мб каждый. Все страницы на месте. Спасибо что отвечаете, ну, а то, что мы нередко не сходимся во мнении - так это нормально. Никого не хотел обидеть. Спасибо, коллеги.
ты просто сломал все вековые устои VBA "НИКОГДА!!! не используй .copy!!!!" )))
на самом деле через импорт было бы быстрее чем через открытие.
 

Gad

Сообщения
2 975
Реакции
1 408

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
ожидал такую реакцию. понятно, что здесь просто создаются 3 копии файла и удаляются ненужные страницы, я не стал всю цепочку описывать, мне копирование нужно было вот для чего: есть полный файл, но со старыми макетами он весил 3 ГБ и есть неполный файл, где на сотне с небольшим страниц (но на тех же что и в старом файле), новые макеты. Старый файл оч медленно вращался - прошлые дизайнеры не считали зазорным оставлять битмапы за 1000 дпи, скрипт для тотального понижения картинок хотя бы до 600 (в макетах есть штрихкода в 600 дпи) не справлялся - корел вылетал, поэтому и был создан новый файл, в котором я уже готовил для нового запуска макеты по всем правилам. И вот для того чтобы слить старый и новый файл мне и потребовался скрипт копировщик, а то, что я потом скриптом большой на 3 маленьких раскидал, так это для того, чтобы протестировать насколько же это "ужас-ужас" цопы-пастом пользоваться. Оказалось, что вообще не ужас, все перенеслось, а потом я в "малостраничных" файлах смог тотально разрешение уменьшить, так 3 Гб превратились в без малого 800 метров и с файлами в принципе теперь можно и с сервера работать.
 

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
да еще, боюсь сглазить, но похоже я прокачал у себя корелу способность копировать в буфер обмена! раньше, практически любое копирование, хоть даже рамочки, приводило к задумчивости корела - от секунды до нескольких, а теперь - мгновенно всасывает!
 

Gad

Сообщения
2 975
Реакции
1 408
Оказалось, что вообще не ужас
Проблема не в том, что это не работает, проблема в том, что это системно-зависимая операция, соответственно можно ждать всяческих "нежданчиков".
за несколько минут
Попробуйте ради интереса это:
Код:
Sub Split()
    Dim fp, fn, step, doc As Document
    step = 100
    Set doc = ActiveDocument
    fp = doc.FilePath
    fs = doc.FileName
    sPath = fp & fs
    fne = Mid(fs, InStrRev(fs, " ") + 1, InStrRev(fs, ".") - 1)
    apc = doc.Pages.Count
    Dim openopt As StructOpenOptions
    Set openopt = CreateStructOpenOptions
    For i = 1 To apc Step step
        Optimization = True
        EventsEnabled = False
        If i > 1 Then
        For d = 1 To i - 1
            With ActiveDocument.Pages(1)
                .Delete
            End With
        Next d
        End If
        If ActiveDocument.Pages.Count > step Then
        For d = 1 To ActiveDocument.Pages.Count - step
            With ActiveDocument.Pages(step + 1)
                .Delete
            End With
        Next d
        End If
        n = "_" & i & "-" & i - 1 + ActiveDocument.Pages.Count
        dPath = fp & fne & n & ".cdr"
        Dim so As New StructSaveAsOptions
        so.Range = cdrAllPages
        ActiveDocument.SaveAs dPath, so
        'ActiveDocument.Close
        docSource = OpenDocumentEx(sPath, openopt)
        EventsEnabled = True
        Optimization = False
    Next i
End Sub
Просто ради понимания разницы :) С import по идее такая же ситуация будет.
 
Последнее редактирование:
  • Спасибо
Реакции: iKoolk

iKoolk

Участник
Топикстартер
Сообщения
146
Реакции
8
Всех с наступающим Новым годом. На самом деле рад, что есть такие люди как вы, как мы (:)
Желаю всем здоровья и чтобы вас ценили во многих смыслах этого слова! Так же надеюсь, что если кто-то в настройках Корела найдет где можно поставить галочку "Не глючить, не тормозить и не вылетать", то человек этот не будет скрывать этого, а напишет всем, где она находится. Успехов, вьюноши!