2016-09-28 303 views
3

我正在創建一個宏,但我被困在這個剪切粘貼語句中,不能從昨天開始繼續。Excel VBA - 選擇剪切粘貼錯誤

這裏是問題:我選擇列「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  


Error

這是我曾嘗試:

  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 
    

得到以下錯誤:
enter image description here

  • 代碼變化:調整大小的選擇,以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 
    
  • 獲取此錯誤:
    enter image description here

  • 試過On Error Resume Next語句。它忽略錯誤消息,但不粘貼數據。

  • 我正在尋找一種方式來忽略此錯誤消息,並貼進行。當我們在Excel工作表中手動輸入copy-pastecut-paste時,我們通常會得到這個錯誤,我們可以選擇忽略和粘貼數據。同樣,是否有任何方法可以在宏中忽略它?

    +4

    不要使用'Select'。 –

    +5

    我很確定你的原始選擇要複製到工作表底部。因此,複製的單元格太大而無法放入目標中。 。參見[如何避免在Excel VBA宏中使用Select](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)瞭解更多有關遠離依賴選擇並激活以實現您的目標。 – Jeeped

    +2

    僅使用單個左上角單元格爲複製的單元格指定目標粘貼區域。嘗試一下 – Jeeped

    回答

    5

    Avoid Select at all costs。嘗試這樣的事情,而不是

    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 
    
    +1

    我得到「對象不支持此屬性或方法。」錯誤(我在'D2:F10'中有數據)在'Range(「A1」)。Paste'中。任何猜測什麼是錯的? – RCaetano

    +0

    嘗試'設置rng =範圍(rng.Address,rng.End(xlDown).Address)' –

    +0

    @RCaetano我也變得一樣,但是試圖計算。謝謝你問了。我會嘗試大衛的建議 –

    0

    的問題是,您要選擇一個單元格,這是一個細胞的表的末尾下方。停止之後,你有一個偏移量,它給你一個較低的單元格。看看這個:

    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 
    

    而且,如前所述,儘量避免選擇。

    +1

    非常感謝你的努力。你的回答告訴了我關於'Debug.print.'的問題 –

    1

    正如在其他答案和評論中提到的,不惜一切代價避免使用.Select。這是許多常見錯誤的根源。下一個解決方案通過使用一個簡單的函數找到最後一行數據。

    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)

    +0

    感謝你的努力!這種方法是正確的,只是在糊劑選擇中實施同樣的方法會導致解決方案。謝謝!!! –