Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.90/303: Рейтинг темы: голосов - 303, средняя оценка - 4.90
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 252

Макрос поиска и вывода строк, содержащих значение поиска

16.03.2012, 11:24. Показов 64058. Ответов 101
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Есть макрос для поиска значения из ячейки А1 по всему листу и копированием строк из всех листов, содержащих это значение.
Но есть и проблема: макрос поиска ищет только цифровые значения из указанной ячейки. Текстовые или смешанные не находит.
Если знаете как подправить, помогите плз!!!
Вот код:
Visual Basic
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
Sub SearchPN()
  Dim iCopi As Range
  Dim iPast As Range
  AR = Range("A1")   'значение для поиска
  SZ = 15
  PS = Cells(Rows.Count, 1).End(xlUp).Row
  Rows("15:" & PS).Delete Shift:=xlUp
  For I = 3 To 9
    IL = Cells(I, 5) 'номер листа
    KL = Cells(I, 6) 'номер столбца
    Cells(SZ, 2) = IL
    SZ = SZ + 1
    Set iCopi = Worksheets(IL).Range("A1:AD1")
    Set iPast = Worksheets("SEARCH").Range("A" & SZ)
    iCopi.Copy iPast
    SZ = SZ + 1
    PS = Sheets(IL).Cells(Rows.Count, KL).End(xlUp).Row
    For J = 2 To PS
      R = Val(Sheets(IL).Cells(J, KL))
      If Val(Sheets(IL).Cells(J, KL)) = AR Then
         Set iCopi = Worksheets(IL).Range("A" & J & ":AD" & J)
         Set iPast = Worksheets("SEARCH").Range("A" & SZ)
         iCopi.Copy iPast
         SZ = SZ + 1
      End If
    Next J
    SZ = SZ + 1
  Next I
End Sub
 
 
Sub Add_line()
    '
    ' Add_line Macro
    '
    ' Keyboard Shortcut: Ctrl+q
    '
    With ThisWorkbook.ActiveSheet
        Set iDiapazon = .UsedRange
        With iDiapazon
            nREnd = .Row + .Rows.Count - 1
            nCEnd = .Column + .Columns.Count - 1
        End With
        Set iDiapazon = Nothing
            
        If nREnd < 3 Then: MsgBox "Íå ïðîâåäåíî íè îäíîé îïåðàöèè.", vbInformation + vbOKOnly, "Ñîîáùåíèå ñèñòåìû": Exit Sub
            
'        MsgBox " - ñòðîêà " & nREnd & Chr(10) & " - ñòîëáåö " & nCEnd, vbInformation + vbOKOnly, "Êðàéíèå:"
        
        Rows(nREnd + 1).Insert Shift:=xlUp, CopyOrigin:=xlFormatFromLeftOrAbove
        
        Range(.Cells(nREnd, 1), .Cells(nREnd, nCEnd)).Copy
        Range(.Cells(nREnd + 1, 1), .Cells(nREnd + 1, 1)).PasteSpecial Paste:=xlPasteFormulas, Operation:=xlNone, _
                SkipBlanks:=False, Transpose:=False
 
    End With
End Sub
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2012, 11:24
Ответы с готовыми решениями:

Макрос поиска вводимого значение и вывода всей строки
Привет! Ломаю голову уже несколько часов... Помогите, пожалуйста, срочно нужно написать что-то такое: я ввожу слово, макрос мне ищет...

разработать консольное приложение для ввода с клавиатуры массива строк и поиска среди них строк, содержащих заданный строковый фрагмент.
Помогите пожалуйстааа!!! Не пойму как это сделать на C#. Контрольное задание Необходимо разработать консольное приложение для...

Вывод количества строк в файлах, содержащих заданные строки поиска
Создайте командный файл, выводящий количество строк в файлах, содержащие за- данные строки поиска (с помощью команды find с параметром...

101
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
04.09.2013, 13:50
Студворк — интернет-сервис помощи студентам
Вызывает сомнение необходимость такой процедуры вообще.
Т.е. у Вас нет единой базы, Вам не нужна лёгкая возможность сделать сводку/подсчёт/выборку по данным?
Любите сложности?
Почему бы не оставлять всё как есть/заводится на одном листе, а если нужен POLZUNOV - ставим фильтр по *POLZUNOV*.
Можно откинуть лишнее фильтром по дате или ещё по какому параметру.
Можно отобрать только нужное макросом с использованием того же фильтра или SQL.
Когда нужно например распечатать что-то по конкретному пароходу по ситуации на конкретный период.
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
04.09.2013, 14:32
Все не так. Есть файл, в который заносятся прибывающие на стоянку автомобили. У них есть свои атрибуты, которые заполняются по мере некоторых событий. Самое последнее событие - отправка, а до нее происходит распределение, опять же в зависимости от неких условий, на каком из судов поедет этот авто. Как правило составление списка происходит примерно на 2-3 парохода сразу. Сам файл постоянно пополняется новыми записями
и ориентироваться в какой-то момент сложно. Поэтому, я подумал, что после определения на каком судне пойдет авто, можно переносить эти строки по своим листам-пароходам. Тем самым уменьшаем от лишнего основной лист, а так же формируем список на суда. Фильтр в данном случае не совсем удобен. Всего не расскажешь. Но идея и заключается в том, чтобы облегчить этот труд. Расставил названия судов, нажал на капу и все разлетелось по местам. Более того, с этим файлом работают иностранцы, собственно от них это и идет, но оперативность оставляет желать лучшего. Особенно после отгрузки. Еще несколько дней на первом листе маячат уже отправленные авто. Нет, я не люблю сложности. Избавляюсь.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
04.09.2013, 14:40
Ну не знаю, какие проблемы...
Есть список машин - условно есть столбцы машина, дата и судно.
В любой момент фильтром или запросом отбираем в любом разрезе - "сегодня на судне", "сегодня нераспределённые", "всего на судне за неделю", "конретная машина за год была на судах" и т.д....
Я бы вообще заносимл всё в Access стандартно через формы, вывод отчётов стандартно репортами.
Но конечно нужно посидеть сделать. За зарплату, вероятно не нищенскую
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
04.09.2013, 14:54
Hugo121, да я бы тоже не против, но партнеры не идут на такие новшества. Привыкли и ни туда, ни сюда.
Это реалии. А ваши рассуждения весьма далеки от того, что и как происходит. Это не статистический файл, это движение. И он регулярно пополняется и после отгрузки очищается, им это удобно, а мы зависим от этого. Вот и пытаюсь хотя бы что-то получше сделать, без серьезных потрясений. З/п... маленькая з/п
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
05.09.2013, 08:49
Привет всем. В общем попробовал предложенный вариант. Не стал долго разбираться, что-то там не работает, может я чего не заменил, не знаю. Но то что делается до ошибки не совсем то. Переносит на вкладки все подряд, не разделяя на названия. Я выкладываю весь файл, обрезанный и вычищенный от лишних листов, они там не важны. А то под 4 мегабайта файл, много мне кажется для проверки. Так вот. Там есть и предложенный вариант обработки и мой. Там кнопки и одна подписана как "мой". Для проверки работы я сделал всего две вкладки. Оставил два названия. Сути не меняет, 2 их или 7. В общем, после работы моего макроса, придется заново присваивать названия в поле "Q", ибо у меня работает и с первого листа убирает ненужные строки.
Конечно, я использовал чьи-то наработки, подглядывал, но и сам тоже немного поучавствовал, кривой макрос, но работает как и задумал. Осталось только проверку сделать на фрагмент, типа, в ячейке стоит IVAN POLZUNOV 12/12/12, а искать и отбирать просто по POLZUNOV. В общем смотрите, поправьте, вносите если есть желание. улучшения. Заранее благодарен.
Вложения
Тип файла: xls YARD 2013-09-04 -Проба.xls (100.0 Кб, 40 просмотров)
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
05.09.2013, 10:52
Здравствуйте, borman13,

Мой макрос работает только в том случае, если заголовки столбцов одинаковы во всех таблицах.

У вас же заголовок "Code" есть только в первой таблице.

В общем, делать макрос без образца - неблагодарное дело .

С уважением,
Aksima
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
05.09.2013, 13:05
Извините, Aksima, я видимо это не учел. Обязательно попробую завтра. Сейчас вот еще озадачился
поиск найти по всей книге с фокусировкой на ячейке и подсвечиванием.. Ни у кого не завалялся. Нашел несколько видов, но в каждом есть что-то не то. Хотелось бы минимум ручной работы, чтобы листы перескакивали автоматом...
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
05.09.2013, 14:37
Т.е. сперва создаём трудности, затем преодолеваем?
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
06.09.2013, 09:44
Hugo121, почему бы и нет. Все есть опыт. И это лучше, чем ничего не делать. Вот появилось у меня желание что-то подобное сделать, пришлось и моск напрячь и движуху устроить...

Добавлено через 19 часов 2 минуты
В общем доделал свой вариант, может кому интересно будет и нужно... Что делает, распределяет строки по листам, названия которых, находятся в ячейках столбца Q. На листах записи добавляются, с первого листа удаляются. На первом листе остаются строки не попадающие на свои листы по причине неопределенности.
Visual Basic
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
42
43
44
45
46
47
48
49
50
51
Sub distrib()
Dim LastRow As Long, Rw As Long 'Объявили переменный последних строк для двух листов
Dim AllRows As Object, FirstCell As Object, FoundCell As Object
' Изменить буквы текста в диапазоне на прописные.
For Each x In Range("Q3:Q1000")
    x.Value = UCase(x.Value)
Next
    Application.ScreenUpdating = False
LastRow = Cells(Rows.Count, 3).End(xlUp).Row + 1 'Нашли номер последней строки на активном листе (там, где кнопка)
For t = 1 To 6   ' цикл общий по количеству пароходов
    m = "REGINA"
       If t = 2 Then
         m = "POLZUNOV"
       End If
       If t = 3 Then
         m = "LUKONIN"
       End If
       If t = 4 Then
         m = "SMILE"
       End If
       If t = 5 Then
         m = "FESCO"
       End If
       If t = 6 Then
         m = "UCHIURA"
       End If
   
    With Sheets(m)    'Применительно к Листам с именами пароходов
            Rw = .Cells(Rows.Count, 4).End(xlUp).Row + 1 'Нашли номер первой свободной строки на этом листе
            For i = 1 To LastRow 'Цикл со строки № 1 по последнюю заполненную (на активном листе)
                If Cells(i, 17) Like "*" & m & "*" Then 'проверили на название парохода
                Range(Cells(i, 1), Cells(i, 23)).Copy .Cells(Rw, 1) 'Дипазон (текущая строка, столбцы 1:23) копируем в первую свободную ячейку листа
                Rw = Rw + 1 'Увеличивем переменную-счётчик первой свободной строки листа
                End If
            Next
    End With
'***************** УДАЛЕНИЕ СТРОК С ПЕРВОГО ЛИСТА *******************
    Set FirstCell = Columns("Q").Find(what:="*" & m & "*", LookAt:=xlWhole)
    If FirstCell Is Nothing Then GoTo net ' если не найден пароход, то идем к следующему
        Set AllRows = Rows(FirstCell.Row)
        Set FoundCell = FirstCell
    Do
        Set FoundCell = Columns("Q").FindNext(After:=FoundCell)
        Set AllRows = Union(Rows(FoundCell.Row), AllRows)
        If FoundCell.Address = FirstCell.Address Then Exit Do
    Loop
    
    AllRows.Delete
net:
Next
End Sub
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
06.09.2013, 12:52
Хорошо.
Тогда такой вариант - из Вашего кода взял одну строку и принцип Union для удаления всего за раз.
Листы как и у Вас уже должны быть, хотя конечно можно и добавить их генерацию кодом.
Если строк по кораблю на перенос будет очень много (будет превышена длина строки в .Item(k) и соотв. диапазон не определится), то код нужно менять.
Например или делить эту строку на части и копировать/запоминать частями, или собирать номера строк в коллекцию и затем копировать по одной, как у Вас.
И соответственно сразу аналогично собирать union удаляемых строк.
Зато быстро - Ваш вариант у меня вообще всё подвесил и не заработал без коррекций, а мой живенько всё перенёс.
Но файл вообще глючный - хоть я его и почистил от лишних строк, он всё равно ведёт себя странно.

Visual Basic
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
42
43
44
45
46
Option Explicit
Option Compare Text
 
Sub distrib()
    Dim ships$, shipsa, a(), i&, k, rw&, copyrange As Range, delra As Range
 
    Application.ScreenUpdating = False
 
    ships = "POLZUNOV|REGINA"
    shipsa = Split(ships, "|")
 
    a = Sheets("list1").[a1].CurrentRegion.Columns(17).Value
    With CreateObject("Scripting.Dictionary")
        .comparemode = 1
        For i = 3 To UBound(a)
            For Each k In shipsa
                If a(i, 1) Like "*" & k & "*" Then
                    .Item(k) = .Item(k) & "," & i & ":" & i
                    Exit For
                End If
            Next
        Next
 
        For Each k In .keys
            k = UCase(k)
            If Sh_Exist(CStr(k)) Then
                With Sheets(k)
                    rw = .Cells(.Rows.Count, 4).End(xlUp).Row + 1    'Нашли номер первой свободной строки на этом листе
                End With
                Set copyrange = Range(Mid(.Item(k), 2))
                If delra Is Nothing Then Set delra = copyrange Else Set delra = Union(delra, copyrange)
                copyrange.Copy Sheets(k).Cells(rw, 1)
            End If
        Next
    End With
    If Not delra Is Nothing Then delra.EntireRow.Delete
 
    Application.ScreenUpdating = True
End Sub
 
Function Sh_Exist(sName As String) As Boolean
    Dim wsSh As Worksheet
    On Error Resume Next
    Set wsSh = Sheets(sName)
    Sh_Exist = Not wsSh Is Nothing
End Function
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
06.09.2013, 16:41
Hugo121, спасибо Вам огромное, в понедельник все проверю. Конечно, будет лучше, воспользуюсь Вашим вариантом.
По файлу... Эх-хе-хе.. .все очень трудно, это долго объяснять, но проблема в наших зарубежных друзьях, которые лет 10 гоняют этот файл, а есть еще один... там вашпе -полный алес, они из файла берут наши изменения и копируют их в свой такой же... А потом опять его нам присылают... И не соглашаются ни на что, только так...
Ладно, хватит о работе, удачных Вам выходных. Спасибо еще раз.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
06.09.2013, 17:16
Вероятно потому он такой глючный...
Вам нужно поймать момент когда там данных мало и скопировать ТОЛЬКО НУЖНЫЕ ДАННЫЕ и ФОРМАТ ячеек (чтоб шрифт не потерять) в новый чистый файл, а этот убить.
Ну или хотя бы скопировать только нужные строки - я так сделал, Ваш приложенный файл похудел до 33кб.
Там вероятно за годы накопилось столько всякого мусора... ScriptEditor вообще завешивает машину, не может открыть этот файл.
1
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
09.09.2013, 10:11
Hugo121, ну да, выдает ошибку 1004... А вообще, у меня вопрос, как вычистить файл от всякой ненужной дряни? Даже при том, что у меня по 500 строк и 5 листов, ну не должен он весить 4 метра... Что-то не то...
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
09.09.2013, 10:43
Я же уже написал.
Лучший способ - скопировать только нужные данные в новый чистый файл.
Немного лишнего веса я убрал удалив полностью все строки под данными - там были местами форматированные ячейки, их можно найти через Ctrl+End.
Нашёл что мешало отрыть в ScriptEditor'е - там было 3 Custom Views (не знаю как это на русском, никогда не пользовался).
Удалил - тоже файл стал чуть полегче.
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
09.09.2013, 12:27
Hugo121, спасибо, поковыряюсь.. Не могу скопировать, поскольку есть листы с чисто японскими делами, надо какую-нить катану сначала поставить, а то не нюхает иностранные слова. Англицкий еще куда ни шло. А если можно, подскажите, что там в коде поправить, чтобы Ваш вариант заработал?
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
09.09.2013, 12:42
Мой вариант на примере работает.
Что там иначе в рабочем файле - отсюда не видно.
Может быть [a1].CurrentRegion без данных?
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
09.09.2013, 13:02
У меня файл полный, все вкладки по именам+ японские, но я их в массивах не перечислял..
Дома нет файла.. На работе посмотрю. [a1].CurrentRegion .. .я вообще для определения заполненности
строк использую колонку D, поскольку это номер кузова и он всегда есть. Это самое стабильно-заполненное поле.
Грубо говоря, по нему я и ориентировался у себя в макросе.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
09.09.2013, 13:16
Можно так изменить:
Visual Basic
1
    a = Sheets("list1").UsedRange.Columns(17).Value
Но общем Вас ведь не интересует заполненность этого столбца - можно просто анализировать от первой заполненнй ячейки до последней заполненной конкретно по этому столбцу - пустые не нужны, они ведь остаются нераспределённые.
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
09.09.2013, 13:34
Hugo121, нет как раз-таки, ибо 17 колонка может иметь сколь угодно пустых ячеек, и не факт, что последняя существующая заполненной строка будет иметь не пустое значение 17 столбца... А вот колонка D, среди всех интересующих в данном деле вкладок, показательна и информативна на предмет количества заполненных строк.
0
6997 / 2895 / 555
Регистрация: 19.10.2012
Сообщений: 8,803
09.09.2013, 13:59
Да, но Вам ведь не нужны все заполненные строки - интересны только те из 17 столбца, где указано судно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.09.2013, 13:59
Помогаю со студенческими работами здесь

Макрос поиска и копирования строк, которые совпадают с искомым значением
Здравствуйте, Нужно сделать макрос, который будет искать значение в таблице и выводить строки которые совпали с ним на другой лист, но в...

Макрос для поиска заполненных строк в таблице и переноса их в другую книгу
Добрый день, хочу попросить помощи знающих, как написать подобный макрос. В общем - то дело в том, что есть две сводные таблицы, одна из...

Запрет вывода строк содержащих значение #Ошибка
Подскажите пожалуйста как в можно в запросе указать такое условие отбора, чтобы строка содержащая значение &quot;#Ошибка&quot; не...

Как составить рег.выражение для поиска строк, содержащих только буквы, цифры, точки, и подчеркивания
подскажите, пожалуста, как составить рег.выражение для поиска сток, содержащих только буквы, цифры, точки, и подчеркивания. (все что...

Как доработать макрос для копирования строк из файлов, содержащих определенное значение
Подскажите пожалуйста, следующее: есть макрос для копирования строк из файлов, содержащих определенное значение: Sub...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru