Копирование значения ячейки на другой лист в Excel с помощью VBA

У меня есть следующий код, который успешно копирует ячейки B, E и F в ячейки B, C, D на листе 2 после того, как я сопоставляю строку в другой ячейке. Проблема в том, что он копирует ячейку, а не только значение внутри нее (мне не нужны границы, цвет и т. д.).

Еще одна проблема, с которой я столкнулся, заключается в том, что, хотя он будет копировать данные в следующую свободную строку в столбце B, он не будет искать следующую свободную строку в соответствии со столбцами C и D.

Private Sub Worksheet_Change(ByVal Target As Range)
Dim thisrow As Long
Dim lr As Long
If Target.Column = 7 Then
    thisrow = Target.Row
If Target.Value = "FAULTY" Then
    lr = Sheets("sheet2").Range("B" & Rows.Count).End(xlUp).Row + 1
    Range("B" & ActiveCell.Row).Copy Sheets("sheet2").Range("B" & lr)
    Range("D" & ActiveCell.Row).Copy Sheets("sheet2").Range("C" & lr)
    Range("F" & ActiveCell.Row).Copy Sheets("sheet2").Range("D" & lr)
End If
End If

End Sub

person user3569697    schedule 24.04.2014    source источник
comment
используйте Range(..).Value = Range(..).Value вместо Range(..).Copy   -  person Dmitry Pavliv    schedule 24.04.2014
comment
Специальная вставка - еще один вариант. msdn.microsoft.com/en-us /библиотека/офис/   -  person RubberDuck    schedule 24.04.2014
comment
@ckuhn203 Да, но .select необходимо активировать, чтобы использовать специальную вставку, а выбор также известен как плохая практика программирования stackoverflow.com/questions/10714251/   -  person Rich    schedule 24.04.2014
comment
@Rich, but .select needs to be activated in order to use pastespecial,, почему ты так думаешь? Range("A1").Copy, а затем Sheets("sheet2").Range("B2").PasteSpecial xlPasteValues   -  person Dmitry Pavliv    schedule 24.04.2014
comment
Видимо слепое невежество. Смешной. Спасибо @simoco   -  person Rich    schedule 24.04.2014


Ответы (1)


Вместо этого вы можете использовать оператор .Value. Кроме того, просто установите отдельную переменную для диапазона C/D для следующей доступной ячейки.

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim thisrow As Long
    Dim lr As Long
    If Target.Column = 7 Then
        thisrow = Target.Row
        If Target.Value = "FAULTY" Then
            lr = Sheets("sheet2").Range("B" & Rows.Count).End(xlUp).Row + 1
            mr = Sheets("sheet2").Range("C" & Rows.Count).End(xlUp).Row + 1
            nr = Sheets("sheet2").Range("D" & Rows.Count).End(xlUp).Row + 1
            Sheets("sheet2").Range("B" & lr).Value = Range("B" & ActiveCell.Row).Value
            Sheets("sheet2").Range("C" & mr).Value = Range("D" & ActiveCell.Row).Value
            Sheets("sheet2").Range("D" & nr).Value = Range("F" & ActiveCell.Row).Value
        End If
    End If
End Sub
person Rich    schedule 24.04.2014
comment
Привет, Рич, данные в целевой строке фактически исчезают и никуда не денутся. Не совсем уверен, что там произошло! - person user3569697; 24.04.2014
comment
@user3569697 user3569697 Кажется, я получил это задом наперед, извините за мою дислексию :) Я обновил код выше, попробуйте. - person Rich; 24.04.2014
comment
Отлично, большое спасибо за помощь! - person user3569697; 25.04.2014