VBA:粘贴在特定的宏中停止工作(突然)

时间:2015-10-13 17:04:56

标签: excel vba excel-vba mac-office

我是一位非常新的,自学成才的程序员,所以请在回复中牢记这一点。我已经广泛搜索了这个和其他论坛,似乎无法找到类似的问题。

以下代码已经使用了几周而且没有更改过。 (我的宏包含更多的变量和代码,但我知道从分开来看这些部分是有效的,所以为了清楚起见,我将它们遗漏了)。据我所知, 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. 粘贴选项 将在新文件上运行一次,然后再次停止工作。

  6. 提前感谢您的建议。

2 个答案:

答案 0 :(得分:1)

您可能会发现问题在于您无法控制此代码适用于哪个工作簿和工作表。最好避免ActiveSheetSelectSheet尽可能没有父母。

如果您只需要复制没有任何格式的单元格值,那么也不需要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

答案 1 :(得分:0)

我移动了这一行:

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

到方法的顶部,它似乎可靠地工作。我希望我能告诉你到底为什么,但至少你可以继续。也许它与焦点变化有关。

此外,当它失败了(Office 2013)时,我收到以下错误:

运行时错误1004: 应用程序定义或对象定义的错误。

当Sub在Sheet代码后面时,这个:

运行时错误' 1004' Range类的PasteSpecial方法失败。

粘贴在模块中时。