Скопировать и вставить значения, если значение = X

Я пытаюсь написать код, который перемещает строку с одного листа на другой при изменении значения в одном столбце. В целях тестирования указано, что если в ячейке в столбце 13 указано «Тест», то эта строка удаляется из исходного листа и перемещается на новый лист «Тестовый лист». Тем не менее, я пытаюсь вставить строку, перемещенную в новую, как значения, но когда я пытаюсь включить Pastespecial, появляются ошибки.

Это мой код в его нынешнем виде

Sub move_rows_to_another_sheet_master()
For Each myCell In Selection.Columns(13).Cells
If myCell.Value = "Test" Then
myCell.EntireRow.Copy Worksheets("TestSheet").Range("A" & Rows.Count).End(3)(2)
myCell.EntireRow.Delete
End If
Next
End Sub

Я почти уверен, что мне нужно где-то включить «PasteSpecial Paste:=xlValues», но везде, где я пытаюсь его включить, похоже, это не работает.

Вместо зацикливания просто используйте автофильтр, как показано ЗДЕСЬ

Siddharth Rout 11.03.2024 14:43

Покажите фактический код, который вы используете для вставки на другой лист, и точные сообщения об ошибках, которые он выдает. Вы можете создать макрос с помощью функции записи макросов в Excel. Записывая каждый шаг, делая это вручную, вы сможете найти решение самостоятельно.

OldBoy 11.03.2024 14:51

По сути, это тот же самый код, который я использую, и я не могу сохранить то, что у меня есть, потому что строка с копированием и вставкой становится красной и говорит: «Ошибка компиляции: Ожидается: конец оператора», когда я пытаюсь добавить «.PasteSpecial Paste:=». xlPasteValues» до конца строки 4.

Sam 11.03.2024 14:55

''' Sub move_rows_to_another_sheet_test() для каждой ячейки myCell в Selection.Columns(13).Cells If myCell.Value = "Test" Тогда myCell.EntireRow.Copy Worksheets("TestSheet").Range("A" & Rows.Count) .End(3)(2).PasteSpecial Paste:=xlPasteValues ​​myCell.EntireRow.Delete End If Next End Sub ''' Это то, что я пытаюсь сделать, и получаю упомянутую выше ошибку. Он прекрасно работает без текста «.PasteSpecial Paste:=xlPasteValues». Но мне нужно его вставить как значения

Sam 11.03.2024 14:57

Я заменил пустую строку на Rows.Count, сейчас отредактирую

Sam 11.03.2024 15:00

Думаю, я решил это сам, мне просто нужно было поместить копирование и вставку в отдельные строки, и это сработало!

Sam 11.03.2024 15:07
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
6
132
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

РЕДАКТИРОВАТЬ Комментарий @BigBen перефразировал ответ.

Неисправный код заключается в том, что вы хотите скопировать всю строку, но цель не охватывает всю строку. Поэтому попробуйте следующее:

myCell.EntireRow.Copy Worksheets("TestSheet").Range("B" & Rows.Count).End(xlUp)(2).EntireRow

Если вы хотите вставить первую пустую строку, используйте Offset

myCell.EntireRow.Copy Worksheets("TestSheet").Range("A" & Rows.Count).End(xlUp).Offset(1)

Если в исходном диапазоне есть формулы и вам нужны только значения, либо используйте только абсолютные ссылки, либо не можете напрямую скопировать/вставить диапазон. Тогда, как вы решили, нужно использовать PasteSpecial

myCell.EntireRow.Copy
Worksheets("TestSheet").Range("A" & Rows.Count).End(xlUp).Offset(1).PasteSpecial(xlPasteValues)

То, как я это сделал изначально, сработало, но я попробовал и ваш способ, и он тоже сработал! Я вообще не очень хорошо разбираюсь в коде VBA. Есть ли между ними существенная разница? Или что-то, что предлагает ваше решение, чего нет в моей текущей настройке? Кроме того, допустим, мне нужно было исходное приглашение для отправки строк с «Test» в столбце 13 в «TestSheet», но я также хотел отправить строки с «Test2» в столбце 13 в «TestSheet2» и строки с «Test3» в столбец 13 в «TestSheet3»? Могу ли я просто скопировать и вставить исходный код подряд с разными параметрами и «следующим» между ними?

Sam 11.03.2024 21:34

Существенной разницы нет, использование имен констант и явных выражений более понятно окружающим. Кажется, самый простой способ использовать ElseIf sg. вот так: If myCell.Value = "Test" Then -part1- ElseIf myCell.Value = "Test2" Then -part2- ElseIf myCell.Value = "Test3" Then -part3- Else -part4- End If

Black cat 12.03.2024 06:26

Ах, спасибо! Я попробую это с помощью «ElseIf». Если бы я использовал предложенный вами код, куда бы вы поместили ElseIf? Будет ли это просто заменить «Если» в строке 5?

Sam 12.03.2024 12:59

Попробуйте этот код:

Sub move_rows_to_another_sheet_master()
   Dim myCell As Range, ToDelete As Range
   Set ToDelete = Range("A" & Rows.Count)  ' initialize ToDelete
   For Each myCell In Selection.Columns(13).Cells
      If myCell.Value = "Test" Then
         Worksheets("TestSheet").Range("A" & Rows.Count).End(xlUp)(2).EntireRow.Value = myCell.EntireRow.Value
         Set ToDelete = Union(ToDelete, myCell)
      End If
   Next myCell
   ToDelete.EntireRow.Delete
End Sub

С вашим кодом есть 2 проблемы.

  1. Если вы хотите скопировать значения, лучше установить целевые значения, чем копировать и вставлять.
  2. Если ваш цикл For Each идет от начала до конца, и вы удаляете строки во время этого цикла, вы пропускаете строки. Обычно нам следует делать это в обратном порядке. Но вам нужно иметь скопированные строки без реверса.
    Таким образом, вы можете сохранить ячейки для удаления в отдельном диапазоне, а затем удалить все строки сразу.

Не имеет значения, я скопировал исходный код.

MGonet 11.03.2024 16:54

Для ОП: (2) было бы намного понятнее, если бы вы использовали .Offset.

BigBen 11.03.2024 16:56

Опять же, я использовал обозначение OP. Для меня это понятно, означает следующую строку и короче .Offset(1).

MGonet 11.03.2024 17:10

Другие вопросы по теме