Дорогие форумчане, просьба помочь с написанием макроса.
Есть таблица "опросный лист", в ней каждый опрашиваемый выбирает в столбце D "Статус" значение. Задача - при выборе значения "-2" или "0" excel должен автоматически копировать эти строки на другой лист "Список задач". Ранее никогда не работала с макросами, очень слабо представляю как все это делается. Буду безумна благодарна за Вашу помощь! [moder]Правила формума прочитайте для начала. А здесь нужно файл смотреть
Дорогие форумчане, просьба помочь с написанием макроса.
Есть таблица "опросный лист", в ней каждый опрашиваемый выбирает в столбце D "Статус" значение. Задача - при выборе значения "-2" или "0" excel должен автоматически копировать эти строки на другой лист "Список задач". Ранее никогда не работала с макросами, очень слабо представляю как все это делается. Буду безумна благодарна за Вашу помощь! [moder]Правила формума прочитайте для начала. А здесь нужно файл смотретьbel
Сообщение отредактировал _Boroda_ - Понедельник, 31.08.2015, 14:09
Если честно, не совсем поняла, что я сделала не по правилам форума... файл прилагаю. как написано в правилах - 20 строк достаточно для понятия сути... В столбце D выбирается значение. Нужно, чтобы при выборе значения "-2" или "0" строка копировалась на следующий лист.
Если честно, не совсем поняла, что я сделала не по правилам форума... файл прилагаю. как написано в правилах - 20 строк достаточно для понятия сути... В столбце D выбирается значение. Нужно, чтобы при выборе значения "-2" или "0" строка копировалась на следующий лист.bel
Именно так, как у Вас написано в условии - см. файл _1 Но что Вы будете делать, когда статус изменится с -2 (или с 0) на 1 или 2? Вам придется вручную удалять строки из листа Список задач. Короче, смотрите файл _2.
не совсем поняла, что я сделала не по правилам форума...
В Вашем файле списки не работают - в имени ссылка на другую книгу; листа "Список задач" нет; таблицы для сбора там выводимых данных тоже нет. Строку Правил про 10-20 строк Вы увидели, это прекрасно, а следующую строку что ж не прочитали?
Именно так, как у Вас написано в условии - см. файл _1 Но что Вы будете делать, когда статус изменится с -2 (или с 0) на 1 или 2? Вам придется вручную удалять строки из листа Список задач. Короче, смотрите файл _2.
не совсем поняла, что я сделала не по правилам форума...
В Вашем файле списки не работают - в имени ссылка на другую книгу; листа "Список задач" нет; таблицы для сбора там выводимых данных тоже нет. Строку Правил про 10-20 строк Вы увидели, это прекрасно, а следующую строку что ж не прочитали?_Boroda_
Следующий лист может быть разным. В данном примере это Лист2, именно на него копировать? Или по счету типа ActiveSheet.Index+1? А на самом листе куда? Лист "Список задач" не нашёл.
Следующий лист может быть разным. В данном примере это Лист2, именно на него копировать? Или по счету типа ActiveSheet.Index+1? А на самом листе куда? Лист "Список задач" не нашёл.Udik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com
Наверняка я тут такая не первая, кто не отправляет файл с конфиденциальными данными и старается обобщить суть вопроса, чтобы использовать пример макроса потом самой. Так что прошу прощения за то, что приложила пример файла, а не сам файл.
Но что Вы будете делать, когда статус изменится с -2 (или с 0) на 1 или 2? Вам придется вручную удалять строки из листа Список задач.
да, второй вариант мне больше подходит. спасибо!
Можете также подсказать, как сделать так, чтобы копировалась не вся строка, а только отдельные ячейки. Если посмотрите файл: с листов "Risk Mgmt","Asset Protection", "Protect People", "Brand Protection", "Incident Management" данные из ячеек столбцов B, C, D при значении "-2" должны копироваться в лист "Action Items" (столбцы A,B,C), а при значении "0" - в лист "Not Applicable". Это возможно? И если можно, хотелось бы не просто готового файла, а какого-то описания как Вы это делаете..
Наверняка я тут такая не первая, кто не отправляет файл с конфиденциальными данными и старается обобщить суть вопроса, чтобы использовать пример макроса потом самой. Так что прошу прощения за то, что приложила пример файла, а не сам файл.
Но что Вы будете делать, когда статус изменится с -2 (или с 0) на 1 или 2? Вам придется вручную удалять строки из листа Список задач.
да, второй вариант мне больше подходит. спасибо!
Можете также подсказать, как сделать так, чтобы копировалась не вся строка, а только отдельные ячейки. Если посмотрите файл: с листов "Risk Mgmt","Asset Protection", "Protect People", "Brand Protection", "Incident Management" данные из ячеек столбцов B, C, D при значении "-2" должны копироваться в лист "Action Items" (столбцы A,B,C), а при значении "0" - в лист "Not Applicable". Это возможно? И если можно, хотелось бы не просто готового файла, а какого-то описания как Вы это делаете..bel
кто не отправляет файл с конфиденциальными данными
Никто не ожидает секретных данных, но общую структуру файла желательно предоставить, иначе потом начинаются 100500 переделок. И похоже они начались Udik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim arrLName(), arrLName2(1 To 2) As String Dim cllRow As Integer Static i As Byte, flOut As Byte Const strRng As String = "D2:D20" 'диапазон отслеживания
flOut = 1 For i = 0 To UBound(arrLName) - 1 'проверяем на каком листе изменение If Sh.Name = arrLName(i) Then flOut = 0 Next i If flOut Then Exit Sub 'если ненужный лист выходим If Intersect(Range(strRng), Target) Is Nothing Then Exit Sub 'проверяем диапазон If Not (Target = 0 Or Target = -2) Then Exit Sub 'проверяем значение в измененной ячейке i = Abs(Target) / 2 + 1 'определяем лист куда писать With Sheets(arrLName2(i)) cllRow = .Range("a65536").End(xlUp).Row + 1 'определяем на какую строку писать .Range(.Cells(cllRow, 1), .Cells(cllRow, 3)) = Sh.Range(Cells(Target.Row, 1), Cells(Target.Row, 3)).Value 'пишем диапазон End With End Sub
[/vba]
2007 вроде понимает xlsb
Вроде так [vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim arrLName(), arrLName2(1 To 2) As String Dim cllRow As Integer Static i As Byte, flOut As Byte Const strRng As String = "D2:D20" 'диапазон отслеживания
flOut = 1 For i = 0 To UBound(arrLName) - 1 'проверяем на каком листе изменение If Sh.Name = arrLName(i) Then flOut = 0 Next i If flOut Then Exit Sub 'если ненужный лист выходим If Intersect(Range(strRng), Target) Is Nothing Then Exit Sub 'проверяем диапазон If Not (Target = 0 Or Target = -2) Then Exit Sub 'проверяем значение в измененной ячейке i = Abs(Target) / 2 + 1 'определяем лист куда писать With Sheets(arrLName2(i)) cllRow = .Range("a65536").End(xlUp).Row + 1 'определяем на какую строку писать .Range(.Cells(cllRow, 1), .Cells(cllRow, 3)) = Sh.Range(Cells(Target.Row, 1), Cells(Target.Row, 3)).Value 'пишем диапазон End With End Sub
Спасибо большое! То, что нужно!)) единственное, не подскажете, как сделать так, что бы если в итоге кто-то меняет значение с -2 или 0 на другое, то скопированная ранее строчка на странице Action Items или Not Applicable автоматически была удалена?
И еще - заметила, что если на каком-либо из листов я очищаю выставленный ранее статус при помощи кнопки "delete", то эта строчка автоматически копируется на лист Not Applicable Можете помочь разобраться - почему?((
Спасибо большое! То, что нужно!)) единственное, не подскажете, как сделать так, что бы если в итоге кто-то меняет значение с -2 или 0 на другое, то скопированная ранее строчка на странице Action Items или Not Applicable автоматически была удалена?
И еще - заметила, что если на каком-либо из листов я очищаю выставленный ранее статус при помощи кнопки "delete", то эта строчка автоматически копируется на лист Not Applicable Можете помочь разобраться - почему?((bel
Сообщение отредактировал bel - Вторник, 01.09.2015, 16:20
Насчет delete - скорее всего пустую ячейку Target воспринимает как ноль, неохота разбирать проверку по свойству Text вставил [vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim arrLName(), arrLName2(1 To 2) As String Dim cllRow As Integer Static i As Byte, flOut As Byte Const strRng As String = "D2:D20" 'диапазон отслеживания
flOut = 1 If Target.Text = "" Then Exit Sub ' если пустая ячейка выходим For i = 0 To UBound(arrLName) - 1 'проверяем на каком листе изменение If Sh.Name = arrLName(i) Then flOut = 0 Next i If flOut Then Exit Sub 'если ненужный лист выходим If Intersect(Range(strRng), Target) Is Nothing Then Exit Sub 'проверяем диапазон If Not (Target = 0 Or Target = -2) Then Exit Sub 'проверяем значение в измененной ячейке i = Abs(Target) / 2 + 1 'определяем лист куда писать With Sheets(arrLName2(i)) cllRow = .Range("a65536").End(xlUp).Row + 1 'определяем на какую строку писать .Range(.Cells(cllRow, 1), .Cells(cllRow, 3)) = Sh.Range(Cells(Target.Row, 1), Cells(Target.Row, 3)).Value 'пишем диапазон End With End Sub
[/vba]
А удаление строк при изменении на "ненужные" цифры - это придётся искать строку по обоим листам. Если строки уникальные, то несложно, но это уже новая тема.
Насчет delete - скорее всего пустую ячейку Target воспринимает как ноль, неохота разбирать проверку по свойству Text вставил [vba]
Код
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim arrLName(), arrLName2(1 To 2) As String Dim cllRow As Integer Static i As Byte, flOut As Byte Const strRng As String = "D2:D20" 'диапазон отслеживания
flOut = 1 If Target.Text = "" Then Exit Sub ' если пустая ячейка выходим For i = 0 To UBound(arrLName) - 1 'проверяем на каком листе изменение If Sh.Name = arrLName(i) Then flOut = 0 Next i If flOut Then Exit Sub 'если ненужный лист выходим If Intersect(Range(strRng), Target) Is Nothing Then Exit Sub 'проверяем диапазон If Not (Target = 0 Or Target = -2) Then Exit Sub 'проверяем значение в измененной ячейке i = Abs(Target) / 2 + 1 'определяем лист куда писать With Sheets(arrLName2(i)) cllRow = .Range("a65536").End(xlUp).Row + 1 'определяем на какую строку писать .Range(.Cells(cllRow, 1), .Cells(cllRow, 3)) = Sh.Range(Cells(Target.Row, 1), Cells(Target.Row, 3)).Value 'пишем диапазон End With End Sub
[/vba]
А удаление строк при изменении на "ненужные" цифры - это придётся искать строку по обоим листам. Если строки уникальные, то несложно, но это уже новая тема.Udik
вот вам барабан яд 41001231307558 wm R419131876897 udik1968@gmail.com