无法让我的代码执行特殊粘贴

Unable to get my code to execute paste special

我有一个小的 VBA 代码可以从一个 sheet 复制一行并粘贴到另一个,它适用于粘贴但不适用于特殊粘贴,因为我只想粘贴值而不仅仅是粘贴。

这是我的代码,非常基础。请注意,将 pastespecial 更改为粘贴代码可以正常工作。

谢谢你的帮助

Private Sub CommandButton1_Click()

    a = Worksheets("Inventory List Costing Review").Cells(Rows.Count, 1).End(xlUp).Row

    For i = 10 To a

        If Worksheets("Inventory List Costing Review").Cells(i, 19).Value = "Completed" Then

            Worksheets("Inventory List Costing Review").Rows(i).Copy
            Worksheets("Completed by Sales").Activate
            b = Worksheets("Completed by Sales").Cells(Rows.Count, 1).End(xlUp).Row
            Worksheets("Completed by Sales").Cells(b + 1, 1).Select
            ActiveSheet.PasteSpecial Paste:=xlPasteValues, operation:=xlNone
            Worksheets("Inventory List Costing Review").Activate

        End If

    Next

    Application.CutCopyMode = False

    ThisWorkbook.Worksheets("Inventory List Costing Review").Cells(1, 1).Select

End Sub

以下应该有效(清理了沿途的一些混乱)。 尽管如果您只是从单元格复制数据,将值直接分配给目标单元格而不是 copy-pasting.

会更快
Private Sub CommandButton1_Click()

With Worksheets("Inventory List Costing Review")
    a = .Cells(Rows.Count, 1).End(xlUp).Row
    
    For i = 10 To a
        If .Cells(i, 19).Value = "Completed" Then
        
            .Rows(i).Copy
            b = Worksheets("Completed by Sales").Cells(Rows.Count, 1).End(xlUp).Row
            Worksheets("Completed by Sales").Cells(b + 1, 1).PasteSpecial Paste:=xlPasteValues, operation:=xlNone
        End If
    Next

    Application.CutCopyMode = False
    .Cells(1, 1).Select
End With

End Sub

PasteSpecial xlPasteValues 与赋值

快速修复

如果你坚持使用PasteSpecial,在IF子句中你可以使用:

Worksheets("Inventory List Costing Review").Rows(i).Copy
b = Worksheets("Completed by Sales").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("Completed by Sales").Cells(b + 1, 1).PasteSpecial Paste:=xlPasteValues

但更好(更有效)的方法是:

b = Worksheets("Completed by Sales").Cells(Rows.Count, 1).End(xlUp).Row
Worksheets("Completed by Sales").Rows(b + 1).Value = _
  Worksheets("Inventory List Costing Review").Rows(i).Value

Application.CutCopyMode = False... Cells(1, 1).Select 不再需要时。

改进

  • 如果你使用Option Explicit,它会'force'你限定所有变量(ab)。
  • 如果您另外限定工作簿和工作sheet,代码将变得非常可读。
  • 由于代码可以从任何 sheet 上的命令按钮 运行,您可以给它一个合适的名称并将其放入 标准模块 .然后你可以很容易地在命令按钮的点击事件代码中调用它(位于sheet模块)。

标准模块Module1

Option Explicit

Sub updateSales()
    
    Dim wb As Workbook
    Set wb = ThisWorkbook ' The workbook containing this code.
    Dim src As Worksheet
    Set src = wb.Worksheets("Inventory List Costing Review")
    Dim tgt As Worksheet
    Set tgt = wb.Worksheets("Completed by Sales")
    
    Dim a As Long
    Dim b As Long
    
    a = src.Cells(src.Rows.Count, 1).End(xlUp).Row
    
    For i = 10 To a
        If src.Cells(i, 19).Value = "Completed" Then
            b = tgt.Cells(tgt.Rows.Count, 1).End(xlUp).Row
            tgt.Rows(b + 1).Value = src.Rows(i).Value
        End If
    Next

End Sub

Sheet 模块例如Inventory List Costing Review and/or Completed by Sales

Option Explicit

Private Sub CommandButton1_Click()
    updateSales
End Sub