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
那么它将工作,没有指定范围。 但是如果你包含参数,那么看起来你必须指定范围