Не удается заставить мой код выполнить специальную вставку

#vba #copy-paste

#excel #vba #копировать-вставить

Вопрос:

У меня есть небольшой код VBA для копирования строки с одного листа и вставки на другой, он отлично работает для вставки, но не для специальной вставки, поскольку я пытаюсь вставлять только значения, а не просто вставлять.

это мой код, очень простой. Отмечено, что 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
  

Комментарии:

1. Обратите внимание на различия между рабочими листами. Вставьте специальный и диапазон. Специальная вставка. ( Перечисление XlPasteType).

Ответ №1:

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 , это «заставит» вас указать все переменные ( a , b ).
  • Если вы дополнительно уточните рабочую книгу и рабочие листы, код станет вполне читаемым.
  • Поскольку код можно запустить с помощью командной кнопки на любом листе, вы можете присвоить ему подходящее имя и поместить его в стандартный модуль. Затем вы можете легко вызвать его в коде события щелчка командной кнопки (расположенной в модуле листа).

Стандартный модуль, например 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
  

Модуль листа, например Inventory List Costing Review , и / или Completed by Sales

 Option Explicit

Private Sub CommandButton1_Click()
    updateSales
End Sub
  

Комментарии:

1. благодаря Vbasic2008 мне обязательно нужно будет улучшить свои базовые навыки. с благодарностью

2. Очень тщательно; это именно то, на что я намекал, и даже больше.

3. еще раз спасибо Vbasic2008 — очень признателен, я многому научился

Ответ №2:

Следующее должно сработать (по пути убрано немного беспорядка). Хотя, если вы просто копируете данные из ячеек, было бы быстрее присваивать значения непосредственно целевым ячейкам вместо копирования-вставки.

 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
  

Комментарии:

1. Привет, Slaqr — я обработал выше, и он отлично работает. быстрый вопрос от пользователей листа, как я мог бы очистить содержимое, скажем, ячеек в столбцах A C F из строки 10 (i) вниз после вставки специального. Может ли этот код быть включен в приведенный выше код? заранее спасибо

2. Конечно. Вы можете вставить следующее после цикла: .Range("A10:A" amp; a).ClearContents И затем повторить это один раз для каждого столбца, который вы хотите очистить. Предполагая, что вы хотите очистить список инвентаря. В противном случае добавьте лист впереди.

3. Спасибо Slaqr, все работает отлично для пользователей. большое спасибо