#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, все работает отлично для пользователей. большое спасибо