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

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

16.03.2012, 11:24. Показов 65255. Ответов 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
0 / 0 / 1
Регистрация: 20.08.2012
Сообщений: 8
20.08.2012, 23:00
Студворк — интернет-сервис помощи студентам
100 кб ограничение
Вложения
Тип файла: rar VOSTOK-PARTS_Price_19.06.12.rar (39.5 Кб, 72 просмотров)
0
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 3
27.01.2013, 02:52
Помогите пожалуйста!

Ест макрос, который берет данные с разных листов и ставит на первый лист. Дело в том, что сейчас он берет данные из конкретных ячеек, а мне нужно чтобы он искал ячейки с текстом и брал значения из соседних ячеек. Сейчас берутся 4 значения, мне нужно чтобы 3 последних брались следуюшим образом:
2. Искал слово "Количество" и брал значение в правой соседней ячейке
3. Искал слово "Статус" и брал значение из нижней ячейки
4. Искал слово "Дата" и брал из правой ячейки
Если слова нет на странице, то ничего не ставит и переходит дальше

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim sheet As Worksheet
    Dim cell As Range
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Range(Cells(3, 1), Cells(LastRow + 1, 10)).ClearContents
    LastRow = 2
    With ActiveWorkbook
        For i = 4 To Sheets.Count
            Set cell = Sheets(i).Cells(1, 2)
            Cells(LastRow + 1, 1) = Sheets(i).Cells(1, 2)
            ActiveSheet.Hyperlinks.Add Anchor:=Cells(LastRow + 1, 1), Address:="", SubAddress:="'" & Sheets(i).Name & "'" & "!A1"
            Cells(LastRow + 1, 2) = Sheets(i).Cells(2, 2)
            Cells(LastRow + 1, 3) = Sheets(i).Cells(26, 3)
            Cells(LastRow + 1, 4) = Sheets(i).Name
            LastRow = LastRow + 1
      Next
   End With
End Sub
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
27.01.2013, 08:25
Alex II, выложите книгу Excel с примерными данными.
0
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 3
27.01.2013, 16:40
Выкладываю пример. Табличка толко создается, поэтому там я отразил только главные строчки и суть первый и второй листы они вспомогательные, с ними ничего не надо делать. На лист "список" выводятся данные со всех остальных листов. В данный момент с первого выводятся правильно, а с других нет, так как строки не совпадают (на каком то листе болше строк, на какомто меньше)
Вложения
Тип файла: xls Otchjot.xls (68.5 Кб, 72 просмотров)
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
27.01.2013, 18:19
Попробуйте
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub SheetList()
    Dim i As Integer
    Dim sheet As Worksheet
    Dim cell As Range
    Dim LastRow As Long
    LastRow = Cells(Rows.Count, 1).End(xlUp).Row
    Range(Cells(3, 1), Cells(LastRow + 1, 10)).ClearContents
    LastRow = 3
    For i = ActiveSheet.Index + 1 To Worksheets.Count
        With Worksheets(i)
            Cells(LastRow, 1) = .Cells(1, 2)
            ActiveSheet.Hyperlinks.Add Anchor:=Cells(LastRow, 1), Address:="", SubAddress:="'" & .Name & "'!A1"
            Set cell = .Columns(1).Find(Cells(1, 2).Value, , xlValues, xlWhole)
            If Not cell Is Nothing Then Cells(LastRow, 2) = cell.Offset(, 1)
            Set cell = .Columns(1).Find(Cells(1, 3).Value, , xlValues, xlWhole)
            If Not cell Is Nothing Then Cells(LastRow, 3) = cell.Offset(1)
            Set cell = .Columns(1).Find(Cells(1, 4).Value, , xlValues, xlWhole)
            If Not cell Is Nothing Then Cells(LastRow, 4) = cell.Offset(, 1)
            LastRow = LastRow + 1
        End With
    Next
End Sub
1
0 / 0 / 0
Регистрация: 27.01.2013
Сообщений: 3
27.01.2013, 21:10
Большое спасибо! работает

Добавлено через 2 часа 45 минут
Уточню еще для интереса, а как записать, если нузчно искать например не толко в 1ой колонке (.Columns(1)), а в 1, 2 и 3 например?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
27.01.2013, 21:13
.Range("A:C")
1
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 5
01.08.2013, 14:59
Здравствуйте, помогите мне пожалуйста составить похожий макрос, который будет искать несколько значений (например коды стран: RU, US и тд) и при нахождении скопирует всю строчку на новый лист.
0
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
01.08.2013, 15:55
Советую, для скорости, кинуть на форум лист-пример. Веселее (быстрее) будет.
1
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
01.08.2013, 17:28
Я рядом делал с точностью наоборот - при ненахождении, да ещё в нескольких файлах.
Бесконечная работа макроса при объемах больше 100 000 строк

Добавлено через 2 минуты
Хотя тут задача попроще - но алгоритм похож. Сперва загоняем коды в словарь (хотя если их мало, то можно цикл в цикле перебирать массив, без словаря), затем при проходе по основным данным сразу проверяем по словарю и копируем (или пропускаем).
1
4377 / 661 / 36
Регистрация: 17.01.2010
Сообщений: 2,134
01.08.2013, 17:34
To Hugo121, Здравствуйте! Я что-то очень подозреваю, что там AdvancedFilter будет аж-аж... Будет файл - можно будет что-то думать...
0
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 5
12.08.2013, 13:46
Спасибо что откликнулись на мою просьбу, я долго отсутствовал поэтому выкладываю пример файла так поздно.
Нужно, чтоб макрос в выполнил поиск в столбце "F" (количество строк не фиксированное, н-р сегодня 10 поступлений, а завтра 30) по указанным критериям (коды стран, я их сам пропишу все) и случае нахождения копировал всю строку на новый лист.
Вложения
Тип файла: xls example.xls (21.0 Кб, 50 просмотров)
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
12.08.2013, 16:16
Здравствуйте, zontique,

Попробуйте такой вариант:

Кликните здесь для просмотра всего текста
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
Sub FilterByCodeZontique()
    Dim rng As Range, c As Range, sToFind() As String
    Dim i As Long, n As Long, k As Long, f As Boolean
    Dim rFst As Long, rLst As Long
    Const codesToFind = "RU EN" 'Óêàæèòå íóæíûå êîäû ÷åðåç ïðîáåë.
    sToFind = Split(codesToFind)
    Application.ScreenUpdating = False
    With ActiveWorkbook
        n = .Sheets.Count
        With .Sheets("Report 1")
            With .UsedRange
                With .Find("Code")
                    k = .Column
                    rFst = .Row + 1
                End With
                rLst = .Row + .Rows.Count - 1
            End With
            Set rng = .Range(.Cells(rFst, k), .Cells(rLst, k))
            .Copy After:=ActiveWorkbook.Sheets(n)
        End With
        With .Sheets(n + 1)
            .Range(rng.Address).EntireRow.Delete
            For Each c In rng
                f = False
                For i = 0 To UBound(sToFind)
                    If c Like "*" & sToFind(i) & "*" Then
                        f = True
                        Exit For
                    End If
                Next i
                If f Then
                    c.EntireRow.Copy .Rows(rFst)
                    rFst = rFst + 1
                End If
            Next c
        End With
    End With
    Application.ScreenUpdating = True
End Sub

С уважением,
Aksima
1
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 5
13.08.2013, 09:14
Здравствуйте, Aksima

Спасибо большое, всё работает.
0
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 5
02.09.2013, 13:20
Здравствуйте еще раз, у меня опять к вам просьба, можно ли немного изменить макрос, чтоб он искал по 5-6му символу в ячейке? (например swift - CTBAAU2S)
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
02.09.2013, 16:10
zontique, если нужно, чтобы макрос искал искомую подстроку в 5-м и 6-м символах в ячейке, то ничего менять не надо.
Если нужно, чтобы макрос искал искомую подстроку ТОЛЬКО в 5-м и 6-м символах в ячейке, то замените строку 26 кода:
Visual Basic
1
If c Like "*" & sToFind(i) & "*" Then
на следующее:
Visual Basic
1
If c Like "????" & sToFind(i) & "*" Then
С уважением,
Aksima
1
0 / 0 / 0
Регистрация: 01.08.2013
Сообщений: 5
03.09.2013, 08:20
Aksima, спасибо, всё работает.
0
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
04.09.2013, 07:49
Здравствуйте!
В этой ветке нашел то, о чем начал размышлять совсем недавно. Есть очень похожая задача. На одном листе проверяется столбец на содержание в ячейках некоторых значений, не точное совпадение, а совпадение с заданными значениями, например, в ячейке стоит IVAN POLZUNOV 12/08/13, а проверяем на POLZUNOV. Таких значений около 7-8. При нахождении, копируем, а лучше перемещаем, всю строку на лист POLZUNOV , и т.д. по значению, добавляя к существующим уже строкам, т.е. листы с названиями по значениям поиска уже существуют. С исходного листа строки эти удаляем, если через копирование делали. Все остальные строки на исходном листе остаются без изменений. И вот еще момент, после запуска макроса, сначала создается копия документа с тем же именем с припиской "копия".
Извините, я сам еще не пытался это реализовать, поскольку давненько подобным не занимался, но желание сделать это есть. Пока думал и искал информацию, нашел Ваш форум и эту ветку. Буду рад помощи.
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
04.09.2013, 11:35
Здравствуйте, borman13,
Поскольку вы не приложили образца, с которым можно было бы экспериментировать, то сделал программу на основании примера от zontique.
Соответственно, были сделаны следующие допущения:
1) Название листа, в котором нужно проверить столбец на содержание некоторых значений - Report 1
2) Анализируемый столбец должен иметь заголовок Code

Код программы приводится ниже:

Кликните здесь для просмотра всего текста
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
Sub FilterByCodeBorman()
    Dim wsh As Worksheet
    Dim rng As Range, c As Range, sToFind() As String
    Dim i As Long, n As Long, k As Long, f As Boolean
    Dim rFst As Long, rLst As Long
    Const codesToFind = "POLZUNOV OVCHINNIKOV" 'Укажите нужные фамилии через пробел.
    sToFind = Split(codesToFind)
    Application.ScreenUpdating = False
    With ActiveWorkbook.Sheets
        'Получаем ссылку на анализируемый столбец.
        With .Item("Report 1")
            With .UsedRange
                With .Find("Code")
                    k = .Column
                    rFst = .Row + 1
                End With
                rLst = .Row + .Rows.Count - 1
            End With
            Set rng = .Range(.Cells(rFst, k), .Cells(rLst, k))
        End With
        'Смотрим, есть ли листы с нужными фамилиями.
        'Если листов нет - то копируем данные в новые листы.
        'Если есть - то копируем данные в имеющиеся листы.
        For i = 0 To UBound(sToFind)
            On Error Resume Next
            Set wsh = .Item(sToFind(i))
            On Error GoTo 0
            If wsh Is Nothing Then
                .Item("Report 1").Copy After:=.Item(.Count)
                .Item(.Count).Name = sToFind(i)
            Else
                rng.EntireRow.Copy wsh.Rows(wsh.UsedRange.Row + wsh.UsedRange.Rows.Count)
                Set wsh = Nothing
            End If
        Next i
        'В анализируемом столбце убираем строки, в которых обнаружены
        'искомые фамилии.
        For k = rng.Cells.Count To 1 Step -1
            Set c = rng.Cells(k)
            f = False
            For i = 0 To UBound(sToFind)
                If c Like "*" & sToFind(i) & "*" Then
                    f = True
                    Exit For
                End If
            Next i
            If f Then
                c.EntireRow.Delete
            End If
        Next k
        'Анализируем столбцы в листах с данными по фамилиям - в них,
        'наоборот, удаляем строки, в которых не обнаружено искомой
        'фамилии.
        For i = 0 To UBound(sToFind)
            With .Item(sToFind(i))
                With .UsedRange
                    With .Find("Code")
                        k = .Column
                        rFst = .Row + 1
                    End With
                    rLst = .Row + .Rows.Count - 1
                End With
                Set rng = .Range(.Cells(rFst, k), .Cells(rLst, k))
            End With
            For k = rng.Cells.Count To 1 Step -1
                Set c = rng.Cells(k)
                If Not c Like "*" & sToFind(i) & "*" Then c.EntireRow.Delete
            Next k
        Next i
    End With
    Application.ScreenUpdating = True
End Sub


С уважением,
Aksima
1
0 / 0 / 0
Регистрация: 04.09.2013
Сообщений: 12
04.09.2013, 12:29
Aksima, спасибо. Я сегодня немного повозился, сделал по другому, но работает.
Единственно, что еще не сделал что бы искала в ячейке только фамилию среди др. текста и не сделал сохранение копии. Завтра на работе буду, тоже выложу свой вариант, но сразу скажу, что он дилетантски сделан наспех, используя некоторые чужие наработки. А с этим вариантом завтра попробую поработать на файле. Еще раз спасибо.

Добавлено через 8 минут
Да и еще. Я понимаю, что не дал образец. Завтра дам. Дело в том, что исходным является один лист. В него вносятся все данные, а потом по кнопке, раскидываются по своим листам. Т.е. в остальных листах идет только добавление записей, строк. А удаляется в основном листе. На нем остаются те данные, которые еще не определены по фамилиям... . Кстати это пароходы Их пока 7. А вот груза (строки) много и он раскидывается по ним, но сначала как бы не определен на какое судно, поэтому лежит на первом. Но все равно спасибо, мне тут есть чему поучиться, да вспомнить некоторые вещи... Благодарю.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.09.2013, 12:29

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru