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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте!
Есть макрос для поиска значения из ячейки А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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
16.03.2012, 11:24
Ответы с готовыми решениями:

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

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

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

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

101
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
12.09.2013, 18:32 61
Author24 — интернет-сервис помощи студентам
добрый день ! прошу помощи. очень нужен подобный макрос поиска только попроще , прочитал всю тему но собрать не могу (((( помогите пожалуйста!

есть первый лист в книге на нем колонка со значениями нужно каждое значение поискать во всех листах этой же книге и если значение есть то его удалить из первого листа если нет тогда оставить и искать следующее значение . в итоге должны остаться на первом листе только уникальные значения которых нет на остальных листах книги . заранее огромное спасибо за помощь
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
12.09.2013, 19:58 62
"поискать во всех листах этой же книге" и по всему листу? Или всёж не по всему, а только по одному столбцу?
0
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
13.09.2013, 00:41 63
Нужное значение с первого листа поискать по всем остальным листам этой же книги
0
Заблокирован
13.09.2013, 07:49 64
Цитата Сообщение от soulthiefer22 Посмотреть сообщение
есть первый лист в книге на нем колонка со значениями
Мало конкретики, поэтому вместо некой колонки использовал текущее выделение -
Visual Basic
1
2
3
4
5
6
7
8
9
10
Sub Ìàêðîñ1()
Dim rn As Range, ws As Worksheet
For Each rn In Selection
  For Each ws In Worksheets
    If ws.Name <> rn.Parent.Name Then
      If Not ws.Cells.Find(rn) Is Nothing Then rn.ClearContents
    End If
  Next ws
Next rn
End Sub
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
13.09.2013, 09:43 65
Допустим на самом деле файл такой - стандартно 3 листа, на первом список для удаления 10000 строк, на двух других в определённом столбце по 10 значений, слитно с A1 вниз.
Будем использовать макрос уважаемого Апострофф'а? Ну можно конечно...
0
Заблокирован
13.09.2013, 13:40 66
6-ю строку лучше записать так-
Visual Basic
1
If Not ws.Cells.Find(rn) Is Nothing Then rn.ClearContents: EXIT FOR
Никчему искать пустое значение на остальных листах.
0
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
13.09.2013, 21:30 67
спасибо огромное !
Иногда макрос выдает ошибку ( ругается на end if) и приходится нажимать на "continue". причину ошибки я не понял (
я немного изменил действие и убрал удаление данных из ячейки и просто копирую в ячейку справа. так же добавил менно перебор по всем ячейкам (здесь тоже подскажите пожалуйста может как то можно оптимизировать ?) .
и все таки как удалять именно строку полностью если есть такая же запись на любом другом листе?

пример файла прикрепил чтобы было более наглядно. макрос уже в нем . у файла на самом деле расширение *.xslm но загрузить такой на форму не получается ( поэтому я его упаковал в архив или если просто скачать прикрепленный эксель файл то нужно поменять расширение с xslx на xslm
Вложения
Тип файла: rar 111.rar (26.8 Кб, 41 просмотров)
Тип файла: xlsx 111.xlsx (36.5 Кб, 39 просмотров)
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
14.09.2013, 02:03 68
Сколько обычно данных? Судя по примеру - больше похоже на то, что я в Макрос поиска и вывода строк, содержащих значение поиска
описал...
На таких данных я бы сперва собрал со всех листов данные в словарь, затем быстренько пробежался по данным первого листа - а там уже смотря что нужно по задаче: удалять одним способом, ставить метки другим, красить третьим...
Только я не понял - зачем нужно было портить красивый код? Ну изменили бы Selection на [a1].currentregion и всё.
А нет - ещё для ускорения область поиска можно было ограничить вторым столбцом usedrange.

Например вот под пример - где-то в 30-40 раз быстрее так метки ставить:

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
Sub tt()
    Dim tm!: tm = Timer
    Dim a(), t&, c, i&
    Dim ws As Worksheet
 
    t = ActiveSheet.Index
    With CreateObject("scripting.dictionary")
        .comparemode = 1
        For Each ws In Worksheets
            If ws.Index <> t Then
                a = ws.UsedRange.Columns(2).Value
                For Each c In a: .Item(c) = 0&: Next
            End If
        Next ws
        a = Worksheets(t).UsedRange.Columns(1).Value
        ReDim b(1 To UBound(a), 1 To 1)
        For i = 1 To UBound(a)
            If .exists(a(i, 1)) Then b(i, 1) = 1
        Next
 
    End With
    Worksheets(t).UsedRange.Columns(1).Offset(, 3).Value = b
 
    Debug.Print Timer - tm
End Sub
1
0 / 0 / 0
Регистрация: 12.09.2013
Сообщений: 4
16.09.2013, 14:48 69
Hugo121
спасибо огромное работает на ура без ошибок и за долю секунды !!!!!

если Вам не сложно можете прокомментировать каждую строчку макроса , мне очень интересно разобраться где что делается ! можно в личку чтоб не плодить тему !

еще раз огромнейшее Вам спасибо!!!
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
16.09.2013, 16:21 70
В личку нельзя.
Чуть позже сделаю.

Добавлено через 31 минуту
Изменил пару букв - этот вариант надёжнее.

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
Option Explicit
 
Sub tt() 'название роли не играет. Лишь бы компилятор не ругался :)
    Dim tm!: tm = Timer    'это будем скорость мерить, на работу кода не влияет :)
'объявляем переменные
    Dim a(), t&, c, i&    'массив, пара целочисленных Long и variant для цикла for each
    Dim ws As Worksheet    'это будет рабочий лист
 
    t = ActiveSheet.Index    'запоминаем на каком листе запускали код
    With CreateObject("scripting.dictionary")    'используем словарь
        .comparemode = 1    'сравнение без учёта регистра - по факту не актуально, но там ведь есть пву-00805-16/13, кто знает... :)
        For Each ws In Worksheets    'перебор всех рабочих листов книги (не диаграмм, не макросов или диалогов!)
            If ws.Index <> t Then    'если лист не сводный
'взяли в массив второй столбец использованной области очередного листа
'тут конечно можно набрать лишнего внизу... но лениво вычислять последнюю строку :)
                a = ws.UsedRange.Columns(2).Value
                'цикл по массиву, запоминаем в словаре значения (уникальные)
                For Each c In a: .Item(c) = 0&: Next
            End If
        Next ws    'следующий рабочий лист
 
        'взяли в массив второй столбец использованной области сводного листа
        'тут конечно тоже можно набрать лишнего внизу... но лениво вычислять последнюю строку :)
        a = Sheets(t).UsedRange.Columns(1).Value
 
        'объявляем аналогичный пустой массив
        ReDim b(1 To UBound(a), 1 To 1)
 
        'перебор проверяемого массива
        For i = 1 To UBound(a)
            'если значение есть в словаре - ставим метку в массив
            If .exists(a(i, 1)) Then b(i, 1) = 1
        Next
 
    End With    'закрыли/убили словарь - больше не нужен
 
    'выгружаем результат работы (по сдвигу на 3 столбца правее)
    Sheets(t).UsedRange.Columns(1).Offset(, 3).Value = b
    'если в UsedRange будут пустые строки (под данными или между ними) - там тоже будут метки.
    'ну это можно отсечь проверкой на пустоту - в примере это лишнее
 
    Debug.Print Timer - tm    'выводим в debug window время работы - можно посмотреть, если интересно
End Sub
Добавлено через 2 минуты
Этот вариант будет быстрым тогда, когда на проверяемом листе данных много, на остальных мало.
Если наоборот - тогда быстрее будет вариант Апострофф'a.
1
alexsisvl
24.09.2013, 14:01 71
Добрый день уважаемые форумчане, нужна ваша помощь. Есть лист на котором в первом столбце перечислены номера изделий в последующих столбцах параметры данных изделий, номер изделия может повторятся несколько раз так как параметры фиксируются многократно.
Задача подсчитать средние значения каждого параметра для каждого изделия. Размер массива 27000 строк на 850 столбцов. Заранее благодаре за помощь.
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
24.09.2013, 22:04 72
Можно сделать, проверил - такой массив в память лезет
Но некогда...
1
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 252
02.12.2013, 11:03  [ТС] 73
Здравствуйте!
столкнулся с проблемой - макрос перестал работать... Причем почему-то не работает макрос поиска по номенклатуре, а макрос поиска по сер.номерам работает также. Различий между ними нет:
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
Sub SearchPN()
  Sheets("SEARCH").Select
  Dim iCopi As Range
  Dim iPast As Range
  Dim ar As String
  ar = CStr(Range("A1"))   'значение для поиска
  sz = 15
  PS = Cells(Rows.Count, 1).End(xlUp).Row
  Rows("15:" & PS).Delete Shift:=xlUp
  For i = 4 To 9
    iL = Cells(i, 31) 'номер листа
    KL = Cells(i, 32) 'номер столбца
    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 CStr(Sheets(iL).Cells(j, KL)) Like 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

и поиск по серийнику:
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
Sub SearchSN()
  Sheets("SEARCH").Select
  Dim iCopi As Range
  Dim iPast As Range
  Dim ar As String
  ar = CStr(Range("A1"))   'значение для поиска
  sz = 15
  PS = Cells(Rows.Count, 1).End(xlUp).Row
  Rows("15:" & PS).Delete Shift:=xlUp
  For i = 4 To 9
    iL = Cells(i, 35) 'номер листа
    KL = Cells(i, 36) 'номер столбца
    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 CStr(Sheets(iL).Cells(j, KL)) Like 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
Вобщем. макрос поиска по номенклатуре выдает Overflow (Error 6) .
Почему один макрос работает, а второй нет? поиск идет по разным столбцам, количество строчек в массивах одно и тоже, количество листов - тоже одинаково. Что тут не верно?

Помогите плз подправить...
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.12.2013, 11:31 74
Если два одинаковых кода на одинаковых диапазонах работают по разному - значит причина не в кодах, а в данных.
Другое дело что можно этот код изменить, чтоб одинаково обрабатывал любые данные.
Но голой overflow маловато - нужно было бы знать где именно и на каких данных.
1
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 252
02.12.2013, 12:43  [ТС] 75
при "дебаге" высвечивает вот эту строчку R = Val(Sheets(iL).Cells(j, KL))
данные для поиска одинаковые: один код ищет по столбцу С, другой по столбцу Е. И так на 3х разных листах.
Я попробывал удалить строки на одном из листов и макрос поиска по номенклатуре начал опять работать исправно.
не справляется с объемом почему-то.. сток всего около 1000. и поиск по серийному номеру обрабатывает их идеально.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.12.2013, 12:49 76
R случайно не Integer где-нибудь, а число в Sheets(iL).Cells(j, KL) не превышает ли предел?
1
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 252
02.12.2013, 13:04  [ТС] 77
ну судя по всему превышает... только понять не могу где именно. И почему одном макросе превышает, а в другом в все в порядке...
а почему Вы считает что в Sheets(iL).Cells(j, KL) задается предел? Это же параметры, которые дают указывают где искать: смотреть массив с 4 по 9 строчку в 31 и 32 столбцах, а именно в 31 столбце листы для поиска, в 32 - указан столбец в котором надо искать.. Причем листы задаются не числами, а названием.

Или я не понял Вашего вопроса...?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.12.2013, 13:07 78
Если где-то R объявлена как Integer, то... вот например погоняйте:
Visual Basic
1
2
3
4
Sub rr()
Dim x ' As Integer
x = Val("123456789123")
End Sub
Достаточно уже
Visual Basic
1
2
3
4
Sub rr()
Dim x  As Integer
x = Val("33000")
End Sub
1
12 / 12 / 4
Регистрация: 16.03.2012
Сообщений: 252
02.12.2013, 13:59  [ТС] 79
спасибо!
заменил Val на цифры и все заработало!
но...ещё один вопрос: сейчас попробывал ставить и VAL("1") и VAL("1212") - все равно ищет и выдает все значения. Т.е. от этого не зависит?
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
02.12.2013, 14:16 80
Ктож знает что Вы там ищите, и зачем вообще задаёте значение R (оно никак в этом коде ведь не используется. Может где-то позже?)...
0
02.12.2013, 14:16
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.12.2013, 14:16
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru