Копирование строк по условию из существующего набора данных в отдельную таблицу с помощью кода 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 Пользователь Сообщений: 229 Ученик |
#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
[свернуть]