Excel VBA – select剪切粘贴错误

我正在创build一个macros,但是我被困在这个剪切粘贴语句中,从昨天开始无法继续。

这里是问题:我select列“D2到F2”中的所有行,并粘贴在“A1”。 这是它的代码:

Range("D2:F2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste 

获取此错误:
错误

以下是我所尝试的:

  1. 代码更改:使用PasteSpecial而不是简单的Paste

     Range("D2:F2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Select 'ActiveSheet.Paste ' insted of this using paste special. ActiveSheet.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 

获取以下错误:
在这里输入图像说明

  1. 代码更改:将select的大小调整为3列。

     Range("D2:F2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Resize(1, 3).Select 'ActiveSheet.Paste 

得到这个错误:
在这里输入图像说明

  1. 尝试On Error Resume Next语句。 它将忽略错误消息,但不会粘贴数据。

我正在寻找一种方法来忽略此错误消息,并继续粘贴。 当我们在Excel表格中手动copy-pastecut-paste时,我们通常会得到这个错误,我们可以select忽略和粘贴数据。 同样,是否有任何方法可以在macros内忽略它?

避免Select不惜一切代价 。 尝试这样的事情,而不是

 Sub foo() Dim rng Set rng = Range("D2:F" & GetLastRow(4)) rng.Cut Application.Goto Range("A1").Offset(GetLastRow(1)) ActiveSheet.Paste End Sub Function GetLastRow(col As Long) ' modified from: ' https://stackoverflow.com/questions/11169445/error-in-finding-last-used-cell-in-vba If Application.WorksheetFunction.CountA(Columns(col)) <> 0 Then GetLastRow = Columns(col).Find(What:="*", _ After:=Cells(Rows.Count, col), _ Lookat:=xlPart, _ LookIn:=xlFormulas, _ SearchOrder:=xlByRows, _ SearchDirection:=xlPrevious, _ MatchCase:=False).Row Else GetLastRow = 1 End If End Function 

正如其他答案和评论中提到的,避免使用。不惜一切代价select。 这是许多常见错误的来源。 下一个解决scheme通过使用一个简单的函数find数据的最后一行。

 Option Explicit Function lastrow(rng_str As String) ' Adapted from http://www.rondebruin.nl/win/s9/win005.htm Dim rng As Range: Set rng = Range(rng_str) Dim r As Range lastrow = rng.Column With ActiveSheet For Each r In rng.Columns lastrow = Application.Max(lastrow, .Cells(.Rows.Count, r.Column).End(xlUp).Row) Next End With End Function Sub test() Dim source_rng As Range Dim dest_rng As Range Dim nr_rows As Long ' Maximum number of rows from D to F nr_rows = lastrow("D2:F2") Set source_rng = Range("D2:F" & nr_rows) Set dest_rng = Range("A1") source_rng.Cut dest_rng.Activate ActiveSheet.Paste End Sub 

HTH;)

问题是,您正在尝试select一个单元格,这是表格底部的一个单元格。 停止之后,你有一个偏移量,它给你一个较低的单元格。 看一下这个:

 Option Explicit Sub test() Range("D2:F2").Select Range(Selection, Selection.End(xlDown)).Select Selection.Cut Range("A1").Select Selection.End(xlDown).Select Debug.Print ActiveCell.Address Stop ActiveCell.Offset(1, 0).Select ActiveSheet.Paste End Sub 

而且,如前所述,尽量避免select。