Ошибка выполнения 4605 Excel VBA Копирование нескольких диапазонов в документ слова [дубликат]

Любой класс, который наследуется публично, полиморфно или нет, должен иметь виртуальный деструктор. Иными словами, если на него может указывать указатель на базовый класс, его базовый класс должен иметь виртуальный деструктор.

Если виртуальный, вызывается деструктор производного класса, то конструктор базового класса. Если не виртуально, вызывается только деструктор базового класса.

3
задан Community 9 July 2018 в 19:34
поделиться

4 ответа

Я начал получать эту ошибку при обновлении с 2003 по 2010 год, но макрос все еще работал в 2003 году.

Таблицы были там, но я заметил, что иногда копирование не работает. Поскольку это никогда не случалось в режиме отладки, я добавил 5 секунд ожидания перед копированием.

Это делает макрос медленнее, но по крайней мере он работает.

6
ответ дан scott 15 August 2018 в 21:32
поделиться
  • 1
    Извините, что я получил сторону, отслеживаемую на работе, для другой задачи и не мог вернуться к этому некоторое время. В любом случае, благодаря этому это позволило мне работать с кодом в 2010 году. – Gravity Kills 27 August 2012 в 21:37
  • 2
    Как сделать эти задержки ?! – Abdul Shiyas 16 June 2015 в 12:41
  • 3
    Application.Wait (Now + # 0: 00: 01 #) - См. Метод wait: msdn.microsoft.com/en-us/library/aa213656 (office.11) .aspx – scott 16 June 2015 в 12:56

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

Application.CutCopyMode = False

0
ответ дан Everett S 15 August 2018 в 21:32
поделиться

Это код, который я использую:

Private Declare Function apiOpenClipboard Lib "user32" Alias "OpenClipboard" (ByVal hWnd As Long) As Long
Private Declare Function apiEmptyClipboard Lib "user32" Alias "EmptyClipboard" () As Long
Private Declare Function apiCloseClipboard Lib "user32" Alias "CloseClipboard" () As Long
Private Declare Function CountClipboardFormats Lib "user32" () As Long

Function ClipboardEmpty() As Boolean
    ClipboardEmpty = (CountClipboardFormats() = 0)
End Function

Sub EmptyClipboard()
  If apiOpenClipboard(0&) <> 0 Then
    Call apiEmptyClipboard
    Call apiCloseClipboard
  End If
End Sub

функция ClipboardEmpty является тестом. например if clipboardempty then Суб EmptyClipboard просто очистит буфер обмена

1
ответ дан SeanC 15 August 2018 в 21:32
поделиться
  • 1
    Извините, что на стороне прослежена работа и не может вернуться к этому немного. Большое спасибо за решение, хотя это не решило его в течение 100% времени. Другой человек говорит, что задерживает код через несколько секунд после того, как каждая копия сделала это, чтобы он был на 100%. – Gravity Kills 27 August 2012 в 21:36

Я все еще тестирую свое решение, но оно отличается от сделанных предложений и до сих пор безупречно работает. Просто другой подход:

Я добавляю метку и окружаю мою попытку скопировать с помощью обработчика ошибок ...

Pg1CopyAttempt:
    DoEvents
    shSomeSheet.Range("A1:G30").Copy
    On Error GoTo Pg1PasteFail
    WordApp.Selection.PasteExcelTable False, False, False
    On Error goto 0 'disable the error handler 

Я вызываю метку «Pg1CopyAttempt», потому что знаю, что Excel, без моего собственного недостатка, может не копировать его в буфер обмена. Если Excel меня подведет, я не буду знать, пока не попытаюсь вставить. Когда я пытаюсь, я попадаю в обработчик ошибок (Pg1PasteFail), когда метод пасты терпит неудачу. Это сидит в нижней части моей подпрограммы (после прямого выхода или процедуры выхода).

Pg1PasteFail:
If Err.Number = 4605 Then ' clipboard is empty or not valid.
    DoEvents
    Resume Pg1CopyAttempt
 End If

Было бы лучше протестировать пустой буфер обмена программно, чем полагаться на обработчик ошибок, но Идея здесь заключается в том, чтобы заставить цикл, чтобы он продолжал копировать, пока не будет успешным. Более простой цикл с программным тестированием буфера обмена может использовать функцию ClipboardEmpty от Sean (см. Выше). DoEvents все еще эксплуатируется, но даже с DoEvents подпрограммы могут выйти из строя, и им просто поручено продолжать попытки.

5
ответ дан Steven 15 August 2018 в 21:32
поделиться
  • 1
    – Gravity Kills 22 March 2013 в 16:18
  • 2
    Ты спас меня! Я вижу, что это старо, но я хотел сообщить вам, что это 12:45 утра, и я могу лечь спать сейчас благодаря вам! – Emily 7 March 2016 в 09:44
Другие вопросы по тегам:

Похожие вопросы: