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
На этом этапе ошибки нет, макрос просто останавливается после копирования и создания нового листа.
Вот что я знаю / пробовал:
Макрос успешно создает и называет новый лист и копирует выделение в буфер обмена, потому что я могу вставить его вручную после запуска макроса. Кажется, застревает на кусочке пасты.
Другие макросы, которые используют точно такой же формат копирования / вставки, по-прежнему работают правильно.
Другой форум с похожей программой предложил ввести "Application.EnableEvents=True" в ближайшее окно. Это ничего не изменило.
Этот макрос работал в течение нескольких недель без ошибок. Я сделал новые макросы, используя ранее сохраненный код на случай непреднамеренного изменения чего-либо в текущем, но это тоже не сработало.
Опция вставки будет работать один раз для нового файла, а затем перестанет работать снова.
Заранее благодарю за ваши предложения.
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 не выполнен.
При вставке в модуль.