День добрый. снизу таблицы кнопки, после добавления строки (кнопка+) кнопки смещаются вниз, как сделать то же самое при дублировании строк (кнопка дублировать)
День добрый. снизу таблицы кнопки, после добавления строки (кнопка+) кнопки смещаются вниз, как сделать то же самое при дублировании строк (кнопка дублировать)micholap_denis
micholap_denis, приветствую! Выделяете строку для дублирования и она добавляется в конец таблицы [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow Set iRow = Selection With Sheets("Лист1").ListObjects("Таблица1") Set tRow = .ListRows.Add Rows(iRow.Row).Copy tRow.Range End With End Sub
[/vba]
micholap_denis, приветствую! Выделяете строку для дублирования и она добавляется в конец таблицы [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow Set iRow = Selection With Sheets("Лист1").ListObjects("Таблица1") Set tRow = .ListRows.Add Rows(iRow.Row).Copy tRow.Range End With End Sub
micholap_denis, исправил, теперь учитывает и фильтр и несколько строк: [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow, i As Range Set iRow = Selection With Sheets("Лист1").ListObjects("Таблица1") For Each i In iRow.Rows If i.EntireRow.Hidden = False Then Set tRow = .ListRows.Add i.Copy tRow.Range End If Next i End With End Sub
[/vba] Проверяйте
micholap_denis, исправил, теперь учитывает и фильтр и несколько строк: [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow, i As Range Set iRow = Selection With Sheets("Лист1").ListObjects("Таблица1") For Each i In iRow.Rows If i.EntireRow.Hidden = False Then Set tRow = .ListRows.Add i.Copy tRow.Range End If Next i End With End Sub
jun, Спасибо работает, извините если наглею, но макрос дублирования изменился (шустрее в файле оригинале работает) как бы его допилить что бы так же кнопки смещались.. и так же в файле присутствует макрос вставки группы строк с листа шаблон, как бы что бы тоже при вставке кнопки смещались... пример прикладываю
jun, Спасибо работает, извините если наглею, но макрос дублирования изменился (шустрее в файле оригинале работает) как бы его допилить что бы так же кнопки смещались.. и так же в файле присутствует макрос вставки группы строк с листа шаблон, как бы что бы тоже при вставке кнопки смещались... пример прикладываюmicholap_denis
micholap_denis, макрос для вставки группы строк подправил: [vba]
Код
Private Sub CommandButton1_Click() ' копирование строк по выбранному признаку Dim res(), pz& Application.ScreenUpdating = False признак = ComboBox1.Value Set Tbl1 = Me.ListObjects(1) Set Tbl2 = ThisWorkbook.Worksheets("Шаблоны").ListObjects(1) pz = 0 dx = Tbl2.DataBodyRange Col = Tbl2.ListColumns("признак").Index ReDim res(1 To UBound(dx), 1 To UBound(dx, 2)) For i = 1 To UBound(dx) If dx(i, Col) = признак Then pz = pz + 1 For n = 1 To UBound(dx, 2) res(pz, n) = dx(i, n) Next End If Next If pz > 0 Then Dim LastRow As Long
With Sheets("Таблица").ListObjects("Таблица1") LastRow = .ListRows.Count For i = 1 To UBound(res, 1) .ListRows.Add Next i End With Debug.Print (UBound(res, 1)) Tbl1.ListRows(LastRow + 1).Range.Cells(1, 1).Resize(pz, UBound(res, 2)) = res End If Application.ScreenUpdating = True End Sub
но макрос дублирования изменился (шустрее в файле оригинале работает) как бы его допилить что бы так же кнопки смещались..
Имеется в виду макрос вот этот макрос? [vba]
Код
Sub Дублированиестрок() Application.EnableEvents = False Application.Calculation = xlCalculationManual Application.ScreenUpdating = False targetRow = ActiveSheet.UsedRange.Row + ActiveSheet.UsedRange.Rows.Count 'ActiveSheet.Cells(targetRow, 1) = "-" Set sh = Worksheets.Add Лист1.Activate Selection.SpecialCells(12).Copy sh.Range("A1") sh.UsedRange.Copy ActiveSheet.Rows(targetRow) Application.DisplayAlerts = False sh.Delete Application.DisplayAlerts = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.ScreenUpdating = True End Sub
[/vba]
micholap_denis, макрос для вставки группы строк подправил: [vba]
Код
Private Sub CommandButton1_Click() ' копирование строк по выбранному признаку Dim res(), pz& Application.ScreenUpdating = False признак = ComboBox1.Value Set Tbl1 = Me.ListObjects(1) Set Tbl2 = ThisWorkbook.Worksheets("Шаблоны").ListObjects(1) pz = 0 dx = Tbl2.DataBodyRange Col = Tbl2.ListColumns("признак").Index ReDim res(1 To UBound(dx), 1 To UBound(dx, 2)) For i = 1 To UBound(dx) If dx(i, Col) = признак Then pz = pz + 1 For n = 1 To UBound(dx, 2) res(pz, n) = dx(i, n) Next End If Next If pz > 0 Then Dim LastRow As Long
With Sheets("Таблица").ListObjects("Таблица1") LastRow = .ListRows.Count For i = 1 To UBound(res, 1) .ListRows.Add Next i End With Debug.Print (UBound(res, 1)) Tbl1.ListRows(LastRow + 1).Range.Cells(1, 1).Resize(pz, UBound(res, 2)) = res End If Application.ScreenUpdating = True End Sub
jun, спасибо макрос вставки строк с листа шаблоны работает и кнопки смещаются , но добавляет строки не только те что отмечены в признаке и выбираются в форме, но и все остальные строки что на лист е шаблоны в таблице....лишние пустыми добавляет...как подправить?
jun, спасибо макрос вставки строк с листа шаблоны работает и кнопки смещаются , но добавляет строки не только те что отмечены в признаке и выбираются в форме, но и все остальные строки что на лист е шаблоны в таблице....лишние пустыми добавляет...как подправить?micholap_denis
Private Sub CommandButton1_Click() ' копирование строк по выбранному признаку Dim res(), pz&, j Application.ScreenUpdating = False признак = ComboBox1.Value Set Tbl1 = Me.ListObjects(1) Set Tbl2 = ThisWorkbook.Worksheets("Шаблоны").ListObjects(1) pz = 1 dx = Tbl2.DataBodyRange col = Tbl2.ListColumns("признак").Index For i = 1 To UBound(dx, 1) If dx(i, col) = признак Then For j = 1 To UBound(dx, 2) ReDim Preserve res(1 To pz) res(pz) = dx(i, j) pz = pz + 1 Next j With Sheets("Таблица").ListObjects("Таблица1") LastRow = .ListRows.Count .ListRows.Add .ListRows(LastRow + 1).Range.Cells(1, 1).Resize(1, UBound(res)) = res End With Erase res pz = 1 End If Next Application.ScreenUpdating = True End Sub
Private Sub CommandButton1_Click() ' копирование строк по выбранному признаку Dim res(), pz&, j Application.ScreenUpdating = False признак = ComboBox1.Value Set Tbl1 = Me.ListObjects(1) Set Tbl2 = ThisWorkbook.Worksheets("Шаблоны").ListObjects(1) pz = 1 dx = Tbl2.DataBodyRange col = Tbl2.ListColumns("признак").Index For i = 1 To UBound(dx, 1) If dx(i, col) = признак Then For j = 1 To UBound(dx, 2) ReDim Preserve res(1 To pz) res(pz) = dx(i, j) pz = pz + 1 Next j With Sheets("Таблица").ListObjects("Таблица1") LastRow = .ListRows.Count .ListRows.Add .ListRows(LastRow + 1).Range.Cells(1, 1).Resize(1, UBound(res)) = res End With Erase res pz = 1 End If Next Application.ScreenUpdating = True End Sub
jun, копирует и вставляет выделеные строки вниз таблицы. и при фитьтре таже функция что и в вашем макросе... [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow, i As Range Set iRow = Selection With Sheets("Лист1").ListObjects("Таблица1") For Each i In iRow.Rows If i.EntireRow.Hidden = False Then Set tRow = .ListRows.Add i.Copy tRow.Range End If Next i End With End Sub
[/vba] только в оригинальном файле десятки тысяч строк и сотня столбцов, и вариант макроса Дублирование строк работает быстрее
jun, копирует и вставляет выделеные строки вниз таблицы. и при фитьтре таже функция что и в вашем макросе... [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow, i As Range Set iRow = Selection With Sheets("Лист1").ListObjects("Таблица1") For Each i In iRow.Rows If i.EntireRow.Hidden = False Then Set tRow = .ListRows.Add i.Copy tRow.Range End If Next i End With End Sub
[/vba] только в оригинальном файле десятки тысяч строк и сотня столбцов, и вариант макроса Дублирование строк работает быстрееmicholap_denis
копирует и вставляет выделеные строки вниз таблицы. и при фитьтре
micholap_denis, не совсем понял из файла примера что - откуда должно копироваться. При выделении строк в Таблица1 и вставка ниже в Таблица1, верно?
Можно изменить макрос по вставке строк (добавить SpecialCells): [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow, i As Range Set iRow = Selection With Sheets("Таблица").ListObjects("Таблица1") For Each i In iRow.SpecialCells(xlCellTypeVisible).Rows ' If i.EntireRow.Hidden = False Then Set tRow = .ListRows.Add i.Copy tRow.Range ' End If Next i End With End Sub
[/vba] Выделяете строки и в Таблице 1 и они вставляются ниже
Разобрался, код: [vba]
Код
Sub Дублированиестрок() Dim i, lstRow As Long, rCount As Long Dim sh As Worksheet Application.EnableEvents = False Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Application.DisplayAlerts = False Set sh = Sheets.Add(after:=Sheets(Sheets.Count)) Sheets(1).Activate Application.Selection.Copy sh.Cells(1, 1) rCount = sh.UsedRange.Rows.Count With Sheets("Таблица").ListObjects("Таблица1") lstRow = .DataBodyRange.Rows.Count For i = 1 To rCount .ListRows.Add Next i sh.UsedRange.Copy .ListRows(lstRow + 1).Range.Cells(1, 1).PasteSpecial xlValues End With sh.Delete Application.DisplayAlerts = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.ScreenUpdating = True End Sub
копирует и вставляет выделеные строки вниз таблицы. и при фитьтре
micholap_denis, не совсем понял из файла примера что - откуда должно копироваться. При выделении строк в Таблица1 и вставка ниже в Таблица1, верно?
Можно изменить макрос по вставке строк (добавить SpecialCells): [vba]
Код
Sub Дублировать() Dim iRow As Range, tRow, i As Range Set iRow = Selection With Sheets("Таблица").ListObjects("Таблица1") For Each i In iRow.SpecialCells(xlCellTypeVisible).Rows ' If i.EntireRow.Hidden = False Then Set tRow = .ListRows.Add i.Copy tRow.Range ' End If Next i End With End Sub
[/vba] Выделяете строки и в Таблице 1 и они вставляются ниже
Разобрался, код: [vba]
Код
Sub Дублированиестрок() Dim i, lstRow As Long, rCount As Long Dim sh As Worksheet Application.EnableEvents = False Application.Calculation = xlCalculationManual Application.ScreenUpdating = False Application.DisplayAlerts = False Set sh = Sheets.Add(after:=Sheets(Sheets.Count)) Sheets(1).Activate Application.Selection.Copy sh.Cells(1, 1) rCount = sh.UsedRange.Rows.Count With Sheets("Таблица").ListObjects("Таблица1") lstRow = .DataBodyRange.Rows.Count For i = 1 To rCount .ListRows.Add Next i sh.UsedRange.Copy .ListRows(lstRow + 1).Range.Cells(1, 1).PasteSpecial xlValues End With sh.Delete Application.DisplayAlerts = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.ScreenUpdating = True End Sub
micholap_denis, в дополнении к сообщению 7, еще можно реализовать так: [vba]
Код
Private Sub CommandButton1_Click() ' копирование строк по выбранному признаку Dim res(), pz&, j Application.ScreenUpdating = False признак = ComboBox1.Value Set Tbl1 = Me.ListObjects(1) Set Tbl2 = ThisWorkbook.Worksheets("Шаблоны").ListObjects(1) pz = 1 dx = Tbl2.DataBodyRange dx = Application.Transpose(Tbl2.DataBodyRange) LastRow = Sheets("Таблица").ListObjects("Таблица1").ListRows.Count col = Tbl2.ListColumns("признак").Index For i = 1 To UBound(dx, 2) If dx(col, i) = признак Then For j = 1 To UBound(dx, 1) ReDim Preserve res(1 To UBound(dx, 1), 1 To pz) res(j, pz) = dx(j, i) Next j pz = pz + 1 Sheets("Таблица").ListObjects("Таблица1").ListRows.Add End If Next Sheets("Таблица").ListObjects("Таблица1").ListRows(LastRow + 1).Range.Cells(1, 1).Resize(UBound(res, 2), UBound(res, 1)) = Application.Transpose(res) Application.ScreenUpdating = True End Sub
[/vba] без Erase
micholap_denis, в дополнении к сообщению 7, еще можно реализовать так: [vba]
Код
Private Sub CommandButton1_Click() ' копирование строк по выбранному признаку Dim res(), pz&, j Application.ScreenUpdating = False признак = ComboBox1.Value Set Tbl1 = Me.ListObjects(1) Set Tbl2 = ThisWorkbook.Worksheets("Шаблоны").ListObjects(1) pz = 1 dx = Tbl2.DataBodyRange dx = Application.Transpose(Tbl2.DataBodyRange) LastRow = Sheets("Таблица").ListObjects("Таблица1").ListRows.Count col = Tbl2.ListColumns("признак").Index For i = 1 To UBound(dx, 2) If dx(col, i) = признак Then For j = 1 To UBound(dx, 1) ReDim Preserve res(1 To UBound(dx, 1), 1 To pz) res(j, pz) = dx(j, i) Next j pz = pz + 1 Sheets("Таблица").ListObjects("Таблица1").ListRows.Add End If Next Sheets("Таблица").ListObjects("Таблица1").ListRows(LastRow + 1).Range.Cells(1, 1).Resize(UBound(res, 2), UBound(res, 1)) = Application.Transpose(res) Application.ScreenUpdating = True End Sub
micholap_denis, еще хотел заметить, что код из сообщения 14 работает с массивами до 255 символов (ограничение application.transpose) почитать можно тут: https://excelvba.ru/code/Transpose цитата: "Массив не может содержать элементов, длина которых превышает 255 знаков."
micholap_denis, еще хотел заметить, что код из сообщения 14 работает с массивами до 255 символов (ограничение application.transpose) почитать можно тут: https://excelvba.ru/code/Transpose цитата: "Массив не может содержать элементов, длина которых превышает 255 знаков."jun