Доброго времени суток! В приложенном файле на "Лист 1" имеется таблица, и такая же таблица на "Лист 2". В модуле "Лист 1" прописал код который срабатывает при выделении ячейки столбца "E". Распишу, что он должен делать: Если в ячейке столбца "B" "Лист 1" значение "S", тогда данные строки активной ячейки "Лист 1" должны копироваться в таблицу на "Лист 2" (при этом определить последнюю заполненную ячейку "Листа 2" по столбцу "B", и записать данные на строку ниже). А если в ячейке столбца "B" "Лист 1" значение "M", тогда ничего. Вроде бы код работает, но как то не так как надо ... помогите разобраться.
Доброго времени суток! В приложенном файле на "Лист 1" имеется таблица, и такая же таблица на "Лист 2". В модуле "Лист 1" прописал код который срабатывает при выделении ячейки столбца "E". Распишу, что он должен делать: Если в ячейке столбца "B" "Лист 1" значение "S", тогда данные строки активной ячейки "Лист 1" должны копироваться в таблицу на "Лист 2" (при этом определить последнюю заполненную ячейку "Листа 2" по столбцу "B", и записать данные на строку ниже). А если в ячейке столбца "B" "Лист 1" значение "M", тогда ничего. Вроде бы код работает, но как то не так как надо ... помогите разобраться.damask_86ru
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim lLastRow As Long 'определяем последнюю заполненную строку листа sheet1 по столбцу "B" lLastRow = sheet1.Cells(sheet1.Rows.Count, "B").End(xlUp).Row - 0 If Not Intersect(Target, Range("E:E")) Is Nothing Then If ActiveSheet.Cells(lLastRow, "B").Value = "S" Then 'определяем последнюю заполненную строку листа sheet2 по столбцу "B" lLastRow = sheet2.Cells(sheet2.Rows.Count, "B").End(xlUp).Row + 1 'заносим данные с таблицы sheet1 на sheet2 lLastRow = 3 sheet2.Cells(lLastRow, "B").Value = sheet1.Cells(lLastRow, "B").Value sheet2.Cells(lLastRow, "C").Value = sheet1.Cells(lLastRow, "C").Value sheet2.Cells(lLastRow, "D").Value = sheet1.Cells(lLastRow, "D").Value End If End If End Sub
[/vba] Таким образом я рассчитывал привязать код к активной строке, т.е. при последовательном заполнении таблицы на "Лист 1" активируя ячейку столбца "E", если ячейка активной строки столбца "B" имеет значение "S" код срабатывает и копирует данные активной строки в таблицу на "Лист 2" (при этом определяет последнюю заполненную строку в таблице на "Листе 2", и заносит данные в следующую строку).
[vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim lLastRow As Long 'определяем последнюю заполненную строку листа sheet1 по столбцу "B" lLastRow = sheet1.Cells(sheet1.Rows.Count, "B").End(xlUp).Row - 0 If Not Intersect(Target, Range("E:E")) Is Nothing Then If ActiveSheet.Cells(lLastRow, "B").Value = "S" Then 'определяем последнюю заполненную строку листа sheet2 по столбцу "B" lLastRow = sheet2.Cells(sheet2.Rows.Count, "B").End(xlUp).Row + 1 'заносим данные с таблицы sheet1 на sheet2 lLastRow = 3 sheet2.Cells(lLastRow, "B").Value = sheet1.Cells(lLastRow, "B").Value sheet2.Cells(lLastRow, "C").Value = sheet1.Cells(lLastRow, "C").Value sheet2.Cells(lLastRow, "D").Value = sheet1.Cells(lLastRow, "D").Value End If End If End Sub
[/vba] Таким образом я рассчитывал привязать код к активной строке, т.е. при последовательном заполнении таблицы на "Лист 1" активируя ячейку столбца "E", если ячейка активной строки столбца "B" имеет значение "S" код срабатывает и копирует данные активной строки в таблицу на "Лист 2" (при этом определяет последнюю заполненную строку в таблице на "Листе 2", и заносит данные в следующую строку).damask_86ru
Сообщение отредактировал damask_86ru - Среда, 04.11.2015, 19:58
Private Sub Worksheet_Change(ByVal Target As Range) Dim lLastRow As Long If Not Intersect(Target, Range("B:B")) Is Nothing Then If Target = "S" Then lLastRow = sheet2.Cells(sheet2.Rows.Count, "B").End(xlUp).Row + 1 sheet2.Cells(lLastRow, "B").Resize(, 4) = sheet1.Cells(Target.Row, "B").Resize(, 4).Value End If End If End Sub
[/vba]
Так нужно? [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Dim lLastRow As Long If Not Intersect(Target, Range("B:B")) Is Nothing Then If Target = "S" Then lLastRow = sheet2.Cells(sheet2.Rows.Count, "B").End(xlUp).Row + 1 sheet2.Cells(lLastRow, "B").Resize(, 4) = sheet1.Cells(Target.Row, "B").Resize(, 4).Value End If End If End Sub
[/vba] Копирует данные четырех последующих ячеек "B, C, D, E". Извиняюсь, что не написал об этом в самом начале, необходимо чтобы была возможность копировать данные не из всех столбцов, а выборочно, например: "A, C, D".
И еще один момент, код срабатывает при изменении в ячейке "B", т.е. когда ее изменяешь, а это уже не последовательно. Необходимо чтобы код срабатывал при выборе (активации) ячейки столбца "E" по значению в ячейке столбца "B".
[/vba] Копирует данные четырех последующих ячеек "B, C, D, E". Извиняюсь, что не написал об этом в самом начале, необходимо чтобы была возможность копировать данные не из всех столбцов, а выборочно, например: "A, C, D".
И еще один момент, код срабатывает при изменении в ячейке "B", т.е. когда ее изменяешь, а это уже не последовательно. Необходимо чтобы код срабатывал при выборе (активации) ячейки столбца "E" по значению в ячейке столбца "B".damask_86ru
Тогда так. Не совсем, правда, понимаю тайный смысл всего этого, ну да Вам виднее. [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("E:E")) Is Nothing Then If Target.Offset(, -3) = "S" Then lLastRow = sheet2.Cells(sheet2.Rows.Count, "B").End(xlUp).Row + 1 sheet2.Cells(lLastRow, "C") = sheet1.Cells(Target.Row, "C").Value sheet2.Cells(lLastRow, "D") = sheet1.Cells(Target.Row, "D").Value 'Размножаете строку выше сколько нужно раз для выборочного переноса End If End If End Sub
[/vba]
Тогда так. Не совсем, правда, понимаю тайный смысл всего этого, ну да Вам виднее. [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("E:E")) Is Nothing Then If Target.Offset(, -3) = "S" Then lLastRow = sheet2.Cells(sheet2.Rows.Count, "B").End(xlUp).Row + 1 sheet2.Cells(lLastRow, "C") = sheet1.Cells(Target.Row, "C").Value sheet2.Cells(lLastRow, "D") = sheet1.Cells(Target.Row, "D").Value 'Размножаете строку выше сколько нужно раз для выборочного переноса End If End If End Sub
_Boroda_, спасибо Вам за отклик, но все таки не так... Во вложении файл, если есть желание посмотрите, чего я добивался. Таблицы конечно условные, но вроде заработало как надо. Значения из таблицы 1 забирал через ActiveCells.Offset, а вносил ... Вообщем посмотрите файл.
_Boroda_, спасибо Вам за отклик, но все таки не так... Во вложении файл, если есть желание посмотрите, чего я добивался. Таблицы конечно условные, но вроде заработало как надо. Значения из таблицы 1 забирал через ActiveCells.Offset, а вносил ... Вообщем посмотрите файл.damask_86ru
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("E:E")) Is Nothing Then If Target = "Винт" Then ts = Selection.Row 'строка ячейки выбора With Sheets("Винт") ps = .Range("F" & Rows.Count).End(xlUp).Row + 1 .Cells(ps, "D") = Cells(ts, "D") .Cells(ps, "F") = Cells(ts, "F") .Cells(ps, "G") = Cells(ts, "G") .Cells(ps, "H") = Cells(ts, "H") End With End If End If End Sub
[/vba]
Может так будет понятней :) [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Not Intersect(Target, Range("E:E")) Is Nothing Then If Target = "Винт" Then ts = Selection.Row 'строка ячейки выбора With Sheets("Винт") ps = .Range("F" & Rows.Count).End(xlUp).Row + 1 .Cells(ps, "D") = Cells(ts, "D") .Cells(ps, "F") = Cells(ts, "F") .Cells(ps, "G") = Cells(ts, "G") .Cells(ps, "H") = Cells(ts, "H") End With End If End If End Sub
Wasilic, спасибо. Но пока остановлюсь на этом: [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim lLastRow As Long If Not Intersect(Target, Range("K:K")) Is Nothing Then If ActiveCell.Offset(0, -6).Value = "Винт" Then 'если в ячейке "E" значение "Винт" lLastRow = sheet2.Cells(sheet2.Rows.Count, "D").End(xlUp).Row + 1 'определяем последнюю заполненную строку листа sheet2 по столбцу "D" sheet2.Cells(lLastRow, "D").Value = ActiveCell.Offset(0, -7).Value 'заносим данные из таблицы 1 в таблицу 2 sheet2.Cells(lLastRow, "F").Value = ActiveCell.Offset(0, -5).Value sheet2.Cells(lLastRow, "G").Value = ActiveCell.Offset(0, -4).Value sheet2.Cells(lLastRow, "H").Value = ActiveCell.Offset(0, -3).Value End If End If End Sub
[/vba]
Wasilic, спасибо. Но пока остановлюсь на этом: [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim lLastRow As Long If Not Intersect(Target, Range("K:K")) Is Nothing Then If ActiveCell.Offset(0, -6).Value = "Винт" Then 'если в ячейке "E" значение "Винт" lLastRow = sheet2.Cells(sheet2.Rows.Count, "D").End(xlUp).Row + 1 'определяем последнюю заполненную строку листа sheet2 по столбцу "D" sheet2.Cells(lLastRow, "D").Value = ActiveCell.Offset(0, -7).Value 'заносим данные из таблицы 1 в таблицу 2 sheet2.Cells(lLastRow, "F").Value = ActiveCell.Offset(0, -5).Value sheet2.Cells(lLastRow, "G").Value = ActiveCell.Offset(0, -4).Value sheet2.Cells(lLastRow, "H").Value = ActiveCell.Offset(0, -3).Value End If End If End Sub
RAN, поверьте, я вообще "дуб" в этом деле (vba), и что лучше, я даже не знаю. Просто я понял, что ActiveCell это выделенная ячейка, а с помощью Offset можно сместится в нужный диапазон... Главное получилось, то что задумывал, работает! Результат выложил. А всем откликнувшимся большое СПАСИБО!
RAN, поверьте, я вообще "дуб" в этом деле (vba), и что лучше, я даже не знаю. Просто я понял, что ActiveCell это выделенная ячейка, а с помощью Offset можно сместится в нужный диапазон... Главное получилось, то что задумывал, работает! Результат выложил. А всем откликнувшимся большое СПАСИБО!damask_86ru
У меня есть еще один вопрос, по поводу: исключить повторное копирование данных из таблицы 1 в таблицу 2. Или необходимо создать для этого отдельную тему? [moder]Да, отдельную
У меня есть еще один вопрос, по поводу: исключить повторное копирование данных из таблицы 1 в таблицу 2. Или необходимо создать для этого отдельную тему? [moder]Да, отдельнуюdamask_86ru
Сообщение отредактировал _Boroda_ - Пятница, 06.11.2015, 22:22