Ошибка microsoft visual basic '1004': сбой метода pastespecial класса диапазона

Этот документ был создан кем-то до меня и почти не используется. Так что да, я мог бы его переписать, но я хотел посмотреть, есть ли способ заставить его работать.

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

До прошлой недели он работал нормально.

Ошибка возникает после того, как я удаляю данные, обновляю их и хочу переместить новые данные для исправления отчета:

    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False

Вот код:

 Sub move_data()
'
' move_data Macro
'

'
    Sheets("Table").Select
    Range("A4").Select
    Range(Selection, Selection.End(xlDown).Offset(-1, 0)).Select

    Selection.Copy
    Sheets("Call List").Select
    Range("A4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Call Date").Select
    Range("C20").Select
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
    Sheets("Call List").Select
    Call test
End Sub

Просто к вашему сведению - очень рекомендуется избегайте использования .Select / .Activate. Весь этот макрос можно сократить примерно до 3 строк.

BruceWayne 13.09.2018 19:28
0
1
377
2

Ответы 2

Попробуйте избавиться от всех переключений выбора и вкладок следующим образом:

 Sub move_data()
'
' move_data Macro
'

'
    With ThisWorkbook

        With .Sheets("Table").Range("A4")
            .Resize(.End(xlDown).Offset(-1, 0).Row - .Row, 1).Copy
        End With

        .Sheets("Call List").Range("A4").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
            :=False, Transpose:=False

        .Sheets("Call Date").ListObject.QueryTable.Refresh BackgroundQuery:=False

        .Sheets("Call List").Select

    End With

    Call test

End Sub

Мой ответ удален, так как он того же типа и более оптимизирован, хотя я бы не стал выполнять копирование и вставку любого типа, было бы лучше передать его напрямую?

jamheadart 13.09.2018 19:43

@jamheadart Я оставил это как копировать / вставить, потому что на самом деле я не знаю, как выглядят данные, и поэтому не хочу создавать дополнительных предположений.

Valon Miller 13.09.2018 20:01

Я все еще сталкиваюсь с той же ошибкой в ​​этой части. .Sheets ("Список вызовов"). Диапазон ("A4"). PasteSpecial Paste: = xlPasteValues, Operation: = xlNone, SkipBlanks _: = False, Transpose: = False Вероятно, лучше всего было бы передать его напрямую, но мой босс это сделает не любит перемены и не понимает, почему это сработало раньше, а теперь - нет.

CCTD Inquiry 13.09.2018 20:02

Ошибка Microsoft Visual Basic '1004': сбой метода PasteSpecial класса диапазона

CCTD Inquiry 13.09.2018 20:03

@CCTDInquiry Я не уверен, что предоставлено достаточно информации для решения этой проблемы. Если приведенный выше код не сработал, то в вашей книге могут быть другие факторы, которые мы не можем видеть, которые влияют на выполнение этой подпрограммы.

Valon Miller 13.09.2018 20:04

Эта ошибка может означать, что он пытается вставить в таблицу с включенным фильтром? - или пытаетесь наклеить какие-то заголовки в таблицу?

jamheadart 13.09.2018 20:10

Спасибо Да, фильтр был включен, поэтому он не работал

CCTD Inquiry 13.09.2018 20:28

@jamheadart хороший звонок, у меня было ощущение, что это было что-то вроде этого, что нам просто не хватало видимости.

Valon Miller 13.09.2018 20:31

Вот весь код.

Sub remove_old_data()
'
' remove_old_data Macro
'

'
    Sheets("Call List").Select
    Range("A4").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.ClearContents
    Sheets("Macro Page").Select

End Sub
Sub move_data()
'
' move_data Macro
'

'
    Sheets("Table").Select
    Range("A4").Select
    Range(Selection, Selection.End(xlDown).Offset(-1, 0)).Select

    Selection.Copy
    Sheets("Call List").Select
    Range("A4").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Sheets("Call Date").Select
    Range("C20").Select
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
    Sheets("Call List").Select
    Call test
End Sub
Sub refresh_data()
'
' refresh_data Macro
'

'
    Sheets("DL Data").Select
    Range("B10").Select
    Selection.ListObject.QueryTable.Refresh BackgroundQuery:=False
    Sheets("Table").Select
    Range("B23").Select
    ActiveSheet.PivotTables("PivotTable2").PivotCache.Refresh
    Sheets("Macro Page").Select
End Sub
Sub test()
'
' test Macro
'

'
    ActiveWorkbook.Worksheets("Call List").ListObjects("Table3").Sort.SortFields. _
        Clear
    ActiveWorkbook.Worksheets("Call List").ListObjects("Table3").Sort.SortFields. _
        Add Key:=Range("Table3[Balance]"), SortOn:=xlSortOnValues, Order:= _
        xlDescending, DataOption:=xlSortNormal
    With ActiveWorkbook.Worksheets("Call List").ListObjects("Table3").Sort
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
End Sub

Другие вопросы по теме