Копирование строк по условию из существующего набора данных в отдельную таблицу с помощью кода VBA Excel. Определение числа строк в исходной таблице.
Условие задачи
Есть исходная таблица (набор данных) со списком файлов, расположенных в двух папках. Необходимо строки таблицы, содержащие слово «Изображения», скопировать в новую таблицу, расположенную ниже исходного набора данных, через одну пустую строку. В результате должно получиться, как на изображении ниже:
Решение задачи
Код VBA Excel для копирования строк исходного набора данных по условию в отдельную таблицу:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Sub KopirovaniyeStrok() Dim s As String, n As Long, m As Long, i As Long ‘Задаем условие поиска s = «Изображения» ‘Определяем номер последней строки исходной таблицы n = Range(«A2»).CurrentRegion.Rows.Count ‘Задаем номер первой строки новой таблицы m = n + 2 For i = 2 To n ‘Проверяем условие If Cells(i, 1) = s Then ‘Копируем строку, удовлетворяющую условию, в новую таблицу Cells(i, 1).Resize(1, 3).Copy Cells(m, 1) m = m + 1 End If Next End Sub |
При желании, можно добавить в эту процедуру еще одну переменную и автоматическое определение количества столбцов:
Dim c As Long c = Range(«A2»).CurrentRegion.Columns.Count |
Тогда выражение копирования примет следующий вид:
Cells(i, 1).Resize(1, c).Copy Cells(m, 1) |
paha83 Пользователь Сообщений: 12 |
Доброго времени суток уважаемые форумчане! Задача. С помощью VBA: Спасибо! Прикрепленные файлы
|
CAHO Пользователь Сообщений: 2183 |
Пункт 3 и 4 противоречат друг другу. Или я не так понял. Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. |
paha83 Пользователь Сообщений: 12 |
Приветствую, САНО! |
kakaccc Пользователь Сообщений: 5 |
#4 22.09.2015 15:38:18 paha83
, если еще актуально:
Здесь первые 3 пункта. Прикрепленные файлы
Изменено: kakaccc — 22.09.2015 18:11:32 |
||
kakaccc Пользователь Сообщений: 5 |
#5 23.09.2015 15:35:13 Для 5 пункта:
Хотя, по-моему, без макроса будет даже проще. Пока он настроен так, что его надо запустить на каждом листе, который будет затем защищен. Прикрепленные файлы
|
||
paha83 Пользователь Сообщений: 12 |
Доброго времени суток, kakaccc! Большое спасибо за ответ и помощь. Еще раз спасибо!!! |
rSkrin Пользователь Сообщений: 3 |
Добрый день! |
kakaccc Пользователь Сообщений: 5 |
#8 27.02.2016 17:38:57
Немного громоздкий макрос получился. Изменено: kakaccc — 28.02.2016 02:18:56 |
||
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#9 27.02.2016 18:36:24 kakaccc, чем по-Вашему будут отличаться результаты, если блок:
записать так:
Я сам — дурнее всякого примера! … |
||||
TheBestOfTheBest Пользователь Сообщений: 2366 Excel 2010 +PLEX +SaveToDB +PowerQuery |
Файл должен находиться в папке c:1. На таблице ПКМ-Обновить. Прикрепленные файлы
Неизлечимых болезней нет, есть неизлечимые люди. |
kakaccc Пользователь Сообщений: 5 |
KuklP, потому что я нуб в vba Спасибо! Буду теперь знать и использовать эту функцию. |
rSkrin Пользователь Сообщений: 3 |
Спасибо друзья! Но есть вопрос. Уважаемый kakaccc, правильно ли я понял про «таблица должна начинаться с ячейки А1»- т.е. начало всей таблицы, в том числе и шапки. |
rSkrin Пользователь Сообщений: 3 |
Вопрос отменяю. Чуть подправил, проверил работу, все отлично!!! Спасибо. |
KuklP Пользователь Сообщений: 14868 E-mail и реквизиты в профиле. |
#14 28.02.2016 13:55:14
Да, это destination.
можно записать буквально:
в этом слуячае родительский объект вычисляется 3 раза вместо одного в предыдущем примере. Я сам — дурнее всякого примера! … |
||||||
kakaccc Пользователь Сообщений: 5 |
KuklP, все, раз это destination, то вопросов нет. Более менее разобрался. Буду теперь пользоваться. Красиво и лаконично получилось. Спасибо за объяснение! rSkrin, да, вся таблица должна начинаться с А1 (шапка в вашемслучае). Можно сделать независимо от находжения таблицы, используя свойство CurrentRegion, например. Но тогда перед запуском макроса надо будет выделять какую-нибудь ячейку из таблицы. Первоначально я так и записал макрос. Не знал как для вас проще будет. Если хотите, можно так сделать. |
0mega Пользователь Сообщений: 170 |
#16 06.11.2022 11:54:18 KuklP
, здравствуйте
почему команда начинается с точки
Какое у них отличие ? |
||||
MikeVol Пользователь Сообщений: 230 Ученик |
#17 06.11.2022 12:29:09 0mega, Думаю если вы прочтёте справку то возможно поймёте что к чему. почему команда начинается с точки |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
Option Explicit ' Обязательное объявление переменных Option Compare Text ' отсутствие чувствительности к регистру при сравнении символов Sub Raspredelenie_po_listam() Const FirstRow& = 7 ' Константа - первая строка данных ниже шапки на всех листах Dim i&, j&, LastRow&, LastRowTarget&, ShName, Sh_Target As Worksheet, Prefix$, FormulaRC$, A Application.ScreenUpdating = False ' Временное отключение обновления экрана в Excel For Each ShName In Array("Лист2", "Лист3", "Лист4") ' Цикл по 3 листам с результатами для очистки старых данных With Sheets(ShName) ' Работа с объектом Sheet через символ "." LastRowTarget = .Cells(.Rows.Count, "Z").End(xlUp).Row ' Определение последней заполненной строки по столбцу Z If LastRowTarget < FirstRow Then LastRowTarget = FirstRow ' последняя заполненная строка не должна быть меньше FirstRow (=7) .Rows(FirstRow & ":" & LastRowTarget).Clear ' Удаление строк со старыми данными при новом распределении End With Next ShName With Лист1 ' Работа с объектом Лист1 (программное имя объекта) через символ "." LastRow = .Cells(.Rows.Count, "Z").End(xlUp).Row ' Определение последней заполненной строки по столбцу Z Prefix = "=" & Лист1.Name & "!R" ' Первая часть ссылочных формул A = .Range(.Cells(1, 1), .Cells(LastRow, 15)).Value ' Формируем массив для проверки условий For i = FirstRow To LastRow ' Цикл по строкам анализируемого листа A(i, 8) = Trim(A(i, 8)) ' удаление пробелов спереди и сзади в элементах 8-го столбца массива A(i, 15) = Trim(A(i, 15)) If A(i, 8) = "ЗБС" Or A(i, 8) = "ВНС" Then ' Комплекс условий 1 Set Sh_Target = Лист2 ' Объектная ссылка на лист цель. ElseIf (A(i, 8) = "Конс" Or A(i, 8) = "Раск") And A(i, 15) = "Я" Then ' Комплекс условий 2 Set Sh_Target = Лист3 ' Объектная ссылка на лист цель. Else ' если не выполняется ни 1-ый ни 2-ой комлекс условий Set Sh_Target = Лист4 ' Объектная ссылка на лист цель. End If .Range(.Cells(i, 1), .Cells(i, "AU")).Copy ' копирование i-той строки (по AU,для последующей вставки форматов) FormulaRC = Prefix & Format(i) & "C" ' 2-я часть ссылочной формулы With Sh_Target ' Работа с объектом листом-целью, куда копируем форматы, через символ "." LastRowTarget = .Cells(.Rows.Count, "Z").End(xlUp).Row + 1 ' Определение последней пустой строки по столбцу Z If LastRowTarget < FirstRow Then LastRowTarget = FirstRow .Cells(LastRowTarget, 1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False ' вставка скопированных форматов .Rows(LastRowTarget).RowHeight = Лист1.Rows(i).RowHeight ' Выравнивание высоты строки по исходной .Range(.Cells(LastRowTarget, 1), .Cells(LastRowTarget, "AU")).FormulaR1C1 = FormulaRC ' заполнение целевого диапазона ссылочными формулами End With Next i End With Set Sh_Target = Nothing ' Очистка памяти от объектных ссылок End Sub |
копирование строк с условием |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Sub Программа()
Dim shSrc As Worksheet, arrSrc()
Dim shRes As Worksheet, arrRes(), r As Long
Dim strFN_src As String
Dim lr As Long, i As Long
‘1. Юзер выбирает файл-источник.
strFN_src = GetFilePath
If strFN_src = «» Then Exit Sub
‘2. Отключение монитора, чтобы ускорить работу макроса и чтобы меньше мигало.
Application.ScreenUpdating = False
‘3. Присваивание листу-результату имени «shRes». Затем через это имя удобно обращаться к листу в коде.
Set shRes = ActiveSheet
‘4. Открытие файла-источника.
‘ Листу «свод» присваивается имя «shSrc».
‘ ReadOnly:=True — нам нужно открыть только для чтения. Это может чем-нибудь упростить макрос.
Set shSrc = Workbooks.Open(Filename:=strFN_src, ReadOnly:=True).Worksheets(«свод»)
‘5. Копирование некоторых данных из листа-источника в массив. С массивом быстрее работать, чем с эксель-ячейками.
‘ На листе не должно быть скрытых строк, иначе некоторые строки могут быть не учтены.
lr = shSrc.Cells(shSrc.Rows.Count, «A»).End(xlUp).Row
arrSrc() = shSrc.Range(«A1:C» & lr).Value
‘6. Создание ячеек в массиве-результате. Сначала в него запишутся данные, а затем он
‘ будет вставлен на эксель-лист. Это ускорит работу макроса.
‘ Строк создаётся максимально возможное кол-во, т.к. заранее не известно, сколько будет строк с данными.
ReDim arrRes(1 To UBound(arrSrc, 1), 1 To 3)
‘7. Копирование данных из листа-источника в массив-результат.
For i = 5 To UBound(arrSrc, 1)
If (arrSrc(i, 1) = 1) And (arrSrc(i, 3) = «ВСЕГО») Then
r = r + 1
arrRes(r, 1) = arrSrc(i, 1)
arrRes(r, 2) = arrSrc(i, 2)
arrRes(r, 3) = shSrc.Cells(i, «P»).Value
End If
Next i
‘8. Закрытие файла-источника.
shSrc.Parent.Close SaveChanges:=False
‘9. Действия, если не было найдено нужных строк.
If r = 0 Then
Application.ScreenUpdating = True
MsgBox «В файле-источнике нет нужных данных.», vbExclamation
Exit Sub
End If
’10. Вставка данных на лист-результат.
shRes.Range(«A3»).Resize(r, UBound(arrRes, 2)).Value = arrRes()
’11. Включение монитора.
Application.ScreenUpdating = True
’12. Сообщение, чтобы было понятно, что программа завершила работу.
MsgBox «Готово.», vbInformation
End Sub
Private Function GetFilePath() As String
Const sTitle As String = «Выберите файл КДРО»
Const sInitialPath As String = «c:»
Const sFilterDescription As String = «Книги Excel»
Const sFilterExtention As String = «*.xls*»
With Application.FileDialog(msoFileDialogOpen)
.ButtonName = «Выбрать»: .Title = sTitle: .InitialFileName = sInitialPath
.Filters.Clear: .Filters.Add sFilterDescription, sFilterExtention
If .Show = 0 Then Exit Function
GetFilePath = .SelectedItems(1)
End With
End Function
[свернуть]
Как скопировать строки из нескольких листов на основе критериев на новый лист?
Предположим, у вас есть книга с тремя листами, которые имеют такое же форматирование, как показано на скриншоте ниже. Теперь вы хотите скопировать все строки из этих листов, столбец C которых содержит текст «Завершено», в новый лист. Как можно быстро и легко решить эту проблему, не копируя и не вставляя их вручную?
Скопируйте строки из нескольких листов на основе критериев в новый лист с кодом VBA
Скопируйте строки из нескольких листов на основе критериев в новый лист с кодом VBA
Следующий код VBA может помочь вам скопировать определенные строки со всех листов в книге на основе определенного условия в новый лист. Пожалуйста, сделайте так:
1. Удерживайте ALT + F11 , чтобы открыть Microsoft Visual Basic для приложений окно.
2. Нажмите Вставить > Модулии вставьте следующий код в окно модуля.
Код VBA: копирование строк с нескольких листов на основе критериев на новый лист
Public Sub CopyRows_ValuesAndNumberFormats()
Dim xWs As Worksheet
Dim xCWs As Worksheet
Dim xRg As Range
Dim xStrName As String
Dim xRStr As String
Dim xRRg As Range
Dim xC As Integer
On Error Resume Next
Application.DisplayAlerts = False
xStr = "Kutools for Excel"
xRStr = "Completed"
Set xCWs = ActiveWorkbook.Worksheets.Item(xStr)
If Not xCWs Is Nothing Then
xCWs.Delete
End If
Set xCWs = ActiveWorkbook.Worksheets.Add
xCWs.Name = xStr
xC = 1
For Each xWs In ActiveWorkbook.Worksheets
If xWs.Name <> xStr Then
Set xRg = xWs.Range("C:C")
Set xRg = Intersect(xRg, xWs.UsedRange)
For Each xRRg In xRg
If xRRg.Value = xRStr Then
xRRg.EntireRow.Copy
xCWs.Cells(xC, 1).PasteSpecial xlPasteValuesAndNumberFormats
xC = xC + 1
End If
Next xRRg
End If
Next xWs
Application.DisplayAlerts = True
End Sub
Внимание: В приведенном выше коде:
- Текст «Заполненная» в этом xRStr = «Завершено» сценарий указывает конкретное условие, на основе которого вы хотите скопировать строки;
- C: C В этом Установите xRg = xWs.Range («C: C») скрипт указывает конкретный столбец, в котором находится условие.
3, Затем нажмите F5 ключ для запуска этого кода, и все строки с определенным условием были скопированы и вставлены в новый рабочий лист с именем Kutools for Excel в текущей рабочей книге. Смотрите скриншот:
Более относительные статьи с данными для извлечения или копирования:
- Копирование данных на другой лист с помощью расширенного фильтра в Excel
- Обычно мы можем быстро применить функцию расширенного фильтра для извлечения данных из необработанных данных на том же листе. Но иногда, когда вы пытаетесь скопировать отфильтрованный результат на другой рабочий лист, вы получаете следующее предупреждающее сообщение. В таком случае, как бы вы могли справиться с этой задачей в Excel?
- Копировать строки на новый лист на основе критериев столбца в Excel
- Например, есть таблица покупки фруктов, и теперь вам нужно скопировать записи на новый лист на основе указанных фруктов, как это легко сделать в Excel? Здесь я расскажу о нескольких методах копирования строк на новый лист на основе критериев столбца в Excel.
- Копировать строки, если столбец содержит определенный текст / значение в Excel
- Предположим, вы хотите найти ячейки, содержащие определенный текст или значение в столбце, а затем скопировать всю строку, в которой находится найденная ячейка, как вы можете с этим справиться? Здесь я представлю несколько методов, чтобы определить, содержит ли столбец определенный текст или значение, а затем скопировать всю строку в Excel.
Лучшие инструменты для работы в офисе
Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%
- Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон…
- Объединить ячейки / строки / столбцы и хранение данных; Разделить содержимое ячеек; Объедините повторяющиеся строки и сумму / среднее значение… Предотвращение дублирования ячеек; Сравнить диапазоны…
- Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
- Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
- Избранные и быстро вставляйте формулы, Диапазоны, диаграммы и изображения; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
- Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии…
- Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
- Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF…
- Группировка сводной таблицы по номер недели, день недели и другое … Показать разблокированные, заблокированные ячейки разными цветами; Выделите ячейки, у которых есть формула / имя…
Вкладка Office — предоставляет интерфейс с вкладками в Office и значительно упрощает вашу работу
- Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
- Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
- Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!
Комментарии (2)
Оценок пока нет. Оцените первым!
Sub Yana_Zhilak() Dim LastRow As Long, Rw As Long 'Объявили переменный послдедних строк для двух слистов LastRow = Cells(Rows.Count, 1).End(xlUp).Row 'Нашли номер последней строки на активном листе (там, где кнопка) With Sheets("Лист2") 'Применительно к Лист2 Rw = .Cells(Rows.Count, 1).End(xlUp).Row + 1 'Нашли номер первой свободной строки на этом листе Range(.Cells(4, 1), .Cells(Rw + 1, 5)).ClearContents 'Очистили ПОЛНОСТЬЮ диапазон на втором листе Rw = 7 'Указали, что первая свободная строка =7 For i = 7 To LastRow 'Цикл со строки № 7 по последнюю заполненную (на активном листе) If Cells(i, 8) = "ЗБС" Then 'Если ячейка столбца 8 текущей строки = "ЗБС", то Range(Cells(i, 1), Cells(i, 44)).Copy .Cells(Rw, 1) 'Дипазон (текущая строка, столбцы 1:44) копируем в первую свободную ячейку второго листа Rw = Rw + 1 'Увеличивем переменную-счётчик первой свободной строки второго листа End If Next End With End Sub
Всем доброго времени суток. Пытаюсь написать макрос на VBA для Excel для переноса строки из таблицы на одном листе на другой при вводе в определенный столбец определенных данных. Написал обработчик события:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim table1 As ListObject, table2 As ListObject, table3 As ListObject
Set table1 = Application.ThisWorkbook.Worksheets("Имя листа").ListObjects("Таблица1")
Set table2 = Application.ThisWorkbook.Worksheets("Имя листа").ListObjects("Таблица2")
Set table3 = Application.ThisWorkbook.Worksheets("Имя листа").ListObjects("Таблица3")
If Target.Count > 1 Then
Exit Sub
End If
If Application.Intersect(Target, table1.ListColumns(2)) Then
If Target.Value = "Îòâàë" Then
removeFailed (Target.EntireRow)
End If
Exit Sub
ElseIf Application.Intersect(Target, table2.ListColumns(2).Range) Then
If Target.Value = "Условие" Then
removeFailed (Target.EntireRow)
End If
Exit Sub
ElseIf Application.Intersect(Target, table1.ListColumns(2).Range) Then
If Target.Value = "Условие" Then
removeFailed (Target.EntireRow)
End If
Exit Sub
Else
Exit Sub
End If
End Sub
и саму функцию, которая осуществляет перенос:
Function removeFailed(targetRow As Range)
Dim l
targetRow.Select
Selection.Copy
Application.ThisWorkbook.Worksheets("Имя листа назначения").Select
l = Application.ThisWorkbook.Worksheets("Имя листа назначения").ListObjects("Таблица назначения").Range.End(xlDown)
Rows(l & ":" & l).Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
Application.ThisWorkbook.Worksheets("Имя листа").Select
targetRow.Delete
End Function
При выполнении вылетает ошибка «Type Missmatch». Подскажите пожалуйста советом, что я сделал неверно и как исправить все так, чтобы скрипт выполнял необходимые действия. Заранее большое спасибо!