2015-10-13 7 views
1

Я очень новый, самонаводящийся программист, поэтому, пожалуйста, помните об этом в своих ответах. Я интенсивно искал этот и другие форумы и, похоже, не нашел аналогичного вопроса.VBA: Паста перестает работать (неожиданно) в конкретном макросе

Этот код работает несколько недель и не был изменен. (В моем макросе есть больше переменных и кода, но я знаю, что отделяю их, чтобы эти части работали, поэтому я оставил их для ясности). Из того, что я могу сказать, функция 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. Другой форум с аналогичной программой предложил ввести «Приложение.EnableEvents = True» в ближайшее окно. Это ничего не изменило.

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

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

Благодарим вас за ваши предложения.

+0

ли это работать на другой рабочей станции? – MatthewD

+0

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

+0

@MatthewD Я работаю на Mac с помощью Office 2011; отправленный коллеге с использованием Mac с Office 2011, и код работает, поэтому должен быть определен для моей рабочей станции. С тех пор я пытался написать новый код и попробовать его на другом наборе файлов, и у меня все еще есть эта проблема. Перезагрузили компьютер и т. Д. – katunruh

ответ

1

Возможно, вы обнаружили, что у вас нет большого контроля над тем, к какой книге и рабочему листу относится этот код. Лучше избегать 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 
+0

Вы работаете в двух разных книгах, и исходный лист имеет общее имя, например «Sheet1»? Это объясняет это и ваши 1004 ошибки. – Ambie

+0

Я только что удалил свой предыдущий комментарий, так как теперь он работает - должно быть, была ошибка с моей стороны, когда я вставил ваш код. Теперь он работает плавно. Большое вам спасибо за вашу помощь! – katunruh

0

я переехал эту строку:

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

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

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

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

Когда Суб был в коде Листовая позади, и это:

Ошибка выполнения «1004» PasteSpecial метод класса Range не удалось.

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

+0

Спасибо @Chaz. Я как раз собирался опубликовать обновление, в котором говорилось, что я пытался переписать/использовать другой образец документа, и все работало до тех пор, пока я не добавил эту строку. Я попробую переместить это и проверить любые обновления Excel, которые могут иметь был установлен. – katunruh

+0

«Возможно, это имеет какое-то отношение к изменению фокуса». Да. @katunruh, см. мой ответ, поскольку ваш код небезопасен. Если у вас открыто несколько приложений, открывается более одной рабочей книги или коммутатор листов, тогда ваш код всегда будет вызывать ошибку 1004. – Ambie