VBA: Paste перестает работать (внезапно) в конкретном макросе

Я очень новый программист-самоучка, поэтому, пожалуйста, помните об этом в своих ответах. Я интенсивно искал этот и другие форумы и не могу найти похожий вопрос.

Следующий код работал в течение нескольких недель и не был изменен. (Мой макрос включает в себя больше переменных и кода, но я разбираюсь в том, что эти части работают, поэтому я оставил их для ясности). Из того, что я могу сказать, функция PasteSpecial специально не работает.

Dim StimSheet As String

ActiveCell.Rows("1:290").EntireRow.Select
Selection.Copy
'Copies the data for the current stimulus
StimSheet = Application.InputBox("Enter the name of the stimulus")
'asks name of the stimulus

Sheets.Add After:=Worksheets(Worksheets.Count)
ActiveSheet.Name = StimSheet
'adds new sheet at the end and names whatever you input as stimulus name

Sheets(StimSheet).Select
Selection.PasteSpecial Paste:=xlPasteValues
'pastes data into new sheet

На этом этапе ошибки нет, макрос просто останавливается после копирования и создания нового листа.

Вот что я знаю / пробовал:

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

  2. Другие макросы, которые используют точно такой же формат копирования / вставки, по-прежнему работают правильно.

  3. Другой форум с похожей программой предложил ввести "Application.EnableEvents=True" в ближайшее окно. Это ничего не изменило.

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

  5. Опция вставки будет работать один раз для нового файла, а затем перестанет работать снова.

Заранее благодарю за ваши предложения.

2 ответа

Решение

Вы можете обнаружить, что проблема заключается в том, что вы не имеете большого контроля над тем, к какой книге и листу применяется этот код. Лучше избегать ActiveSheet, Select, а также Sheet без родителей столько, сколько вы можете.

Если вам нужно только скопировать значения ячеек без какого-либо форматирования, то Paste тоже не нужно

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

Const BOOK_NAME As String = "Book1.xlsm" 'change this to your workbook name
Const SOURCE_SHEET_NAME As String = "Sheet1" 'change this to your sheet name
Dim wb As Workbook
Dim sourceSheet As Worksheet
Dim newSheet As Worksheet
Dim newSheetName As String
Dim validName As Boolean
Dim rng As Range

' Set the book, sheet and range objects
Set wb = Workbooks(BOOK_NAME)
Set sourceSheet = wb.Worksheets(SOURCE_SHEET_NAME)
Set newSheet = wb.Worksheets.Add(After:=wb.Worksheets(wb.Worksheets.Count))

' Acquire the new sheet name and check it's valid.
Do
    newSheetName = InputBox("Enter the name of the stimulus")
    On Error Resume Next
    newSheet.Name = newSheetName
    validName = (Err.Number = 0)
    On Error GoTo 0
    If Not validName Then MsgBox "Sheet name isn't valid. Try again."
Loop Until validName

' Write the values into the new sheet
Set rng = sourceSheet.Cells(1, 1).Resize(290, sourceSheet.UsedRange.Columns.Count)
newSheet.Range(rng.Address).value = rng.Value2

Я переместил эту строку:

StimSheet = Application.InputBox("Enter the name of the stimulus")

к вершине метода, и, кажется, работает надежно. Хотел бы я сказать вам точно, почему, но, по крайней мере, вы можете продолжить. Возможно, это как-то связано с изменением фокуса.

Кроме того, когда это не удалось для меня (Office 2013), я получил следующую ошибку:

Ошибка выполнения 1004: ошибка приложения или объекта.

Когда Sub был в листовом коде позади, а это:

Ошибка во время выполнения "1004" Метод PasteSpecial класса Range не выполнен.

При вставке в модуль.

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