PasteSpecial导致macros失败。为什么?

下面的macros打开一个外部工作簿,取消隐藏一个特定工作表,并将一些文本值读入到variables中,根据这些variables值在当前工作簿中创build一个新工作表,将工作表中的工作表的内容复制,然后将其粘贴到新的那一个。

但是,当我使用.Paste它工作正常,但不保留格式,只有在文本中粘贴。

如果我试图纠正这一点,并使用

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

它失败。

为什么是这样?

 Sub addsheet() Application.ScreenUpdating = False Application.DisplayAlerts = False filename = Sheets("Instructions").Range("C13").Value report = "report.xlsx" report_filepath = "\\xxx\xxx\xxx\report.xlsx" Dim report_name As String Workbooks.Open Filename:=(report_filepath) Windows(report).Activate Sheets("Info").Visible = True Sheets("Info").Activate report_month = Range("B5").Text report_year = Range("B4").Text Sheets("Report").Range("A1:AJ498").Copy Windows(filename).Activate Windows(report).Close Set newsheet = Sheets.Add(After:=Sheets(Worksheets.Count), Count:=1, Type:=xlWorksheet) report_name = (report_month & " " & report_year) newsheet.Name = (report_name) Sheets("Instructions").Range("C15").Value = (report_name) Sheets(report_name).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Instructions").Activate End Sub 

就像我在我的评论中提到的,你应该避免使用.Select/.Activate 。 你可能想看到这个

如果我改变你的代码并使用对象,那么你的代码可能看起来像这样。

还要在粘贴之前移动复制代码,然后在两者之间包含DoEvents ,以便Excel有足够的时间将数据放到剪贴板上。

尝试这个

UNTESTED

 Sub addsheet() Dim report_name As String Dim Filename As String, report_filepath As String, report As String Dim thisWb As Workbook, thatWb As Workbook Dim thatWs As Worksheet, NewSheet As Worksheet Dim report_month As String, report_year As String, report_name As String Application.ScreenUpdating = False Application.DisplayAlerts = False Set thisWb = ThisWorkbook With thisWb Set NewSheet = .Sheets.Add(After:=.Sheets(.Worksheets.Count), Count:=1, Type:=xlWorksheet) End With report_filepath = "\\xxx\xxx\xxx\report.xlsx" Set thatWb = Workbooks.Open(report_filepath) Set thatWs = thatWb.Sheets("Info") With thatWs report_month = .Range("B5").Value report_year = .Range("B4").Value End With report_name = report_month & " " & report_year NewSheet.Name = report_name thisWb.Sheets("Instructions").Range("C15").Value = report_name thatWb.Sheets("Report").Range("A1:AJ498").Copy DoEvents NewSheet.Range("A1").PasteSpecial Paste:=xlPasteValues, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False NewSheet.Range("A1").PasteSpecial Paste:=xlPasteFormats, _ Operation:=xlNone, _ SkipBlanks:=False, _ Transpose:=False thisWb.Sheets("Instructions").Activate Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub 

根据Office帮助文件,当您使用Worksheet.PasteSpecial方法“在使用此方法之前,您必须select目标范围”。

如果你改变

 Sheets(report_name).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 

 Sheets(report_name).Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False 

那么它会工作。

如果没有指定范围,则看起来.Paste方法将默认为“A1”。

进一步的调查显示,如果你使用.PasteSpecial没有任何参数,即Sheets(report_name).PasteSpecial那么它将工作,没有指定范围。 但是如果你包含参数,那么看起来你必须指定范围