Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
Excel

VBA макрос по поиску и записи значений

28.06.2018, 11:04. Показов 2074. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите написать макрос: В рабочей книге "Шаблончик" в столбце А есть значения (пример: 21806544252) их около 15 штук и все они разбросаны по столбцу А (максимум до 2000 строки), как можно найти ячейки с таким же значением во втором открытом файле "Сводный реестр обработанных закупок 2018" и записать в рабочую книгу (ниже на 2 ячейки от искомого) число которое стоит правее на 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
Sub Макрос1()
Application.ScreenUpdating = False
Dim Wb1 As Workbook
Dim Wb2 As Workbook
 
Dim Cl As Range
Set Wb1 = Workbooks("Сводный реестр обработанных закупок 2018.xlsm")
Set Wb2 = ActiveWorkbook
On Error Resume Next
With Wb1.Worksheets("Лист1")
    lRow = .Cells.SpecialCells(xlLastCell).Row
     
   Dim rngX As Range
   Dim i As Integer
   Set rngX = .Range("A1:A" & lRow)
    For i = 3 To 52 Step 3
        Set rngX = Union(rngX, .Range("A1:A" & lRow).Offset(, i))
    Next i
    Dim tmp
    For Each Cl In rngX.Cells
        tmp = Cl.Offset(, 2).Value
        Wb2.Worksheets("Лист1").Cells.Find(Cl.Value, LookAt:=xlWhole).Offset(1, 0) = tmp
    Next
    Application.ScreenUpdating = True
End With
Вложения
Тип файла: xlsx Шаблончик.xlsx (24.6 Кб, 20 просмотров)
Тип файла: xlsx Сводный реестр обработанных закупок 2018.xlsx (69.1 Кб, 20 просмотров)
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
28.06.2018, 11:04
Ответы с готовыми решениями:

Макрос по поиску и переносу значений между файлами excel
Всем привет! Дали задание по работе с большим массивом данных..Гугление особого ничего не дало.. Прошу помочь.. Есть два Excel-файла:...

Excel VBA макрос, добавляющий записи к таблице через Inputbox
Всем привет! Помогите пожалуйста написать такой макрос в Excel VBA : Создать макрос, создающий и заполняющий 5 записями таблицу на...

Макрос на VBA, заносит в базу на Access случайно сгенерированные записи
Я Access владею на начальном уровне. Надо быстро решить задачу, а у меня нет времени на изучение, не успеваю. Помогите, пожалуйста! Или...

15
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
28.06.2018, 12:33
Вариант с использованием словаря и для дальнейшей обработки ТЗ:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub pr()
    a = ActiveSheet.UsedRange
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            For j = 1 To UBound(a, 2) Step 3
                If Not IsEmpty(a(i, j)) And IsNumeric(a(i, j)) Then .Item(a(i, j)) = .Item(a(i, j)) + 1
            Next
        Next
        Sheets.Add
        Cells(1).Resize(.Count, 2) = Application.Transpose(Array(.keys, .items))
    End With
End Sub
Запускать с файла "Сводный реестр...
0
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
28.06.2018, 13:39  [ТС]
Спасибо за наводку, попробую воспользоваться вашим вариантом, правда тот код что вы привели не верно отрабатывает.
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
28.06.2018, 15:00
Цитата Сообщение от Pavelkzn Посмотреть сообщение
код что вы привели не верно отрабатывает.
А вы проверяли на этих данных?
0
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
29.06.2018, 09:39  [ТС]
Да, к каждому номеру должен присваиваться рядом стоящий номер,а вместо него записывается всем "1"
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
29.06.2018, 11:05
А если 2 одинаковых номера в базе?
0
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
29.06.2018, 11:35  [ТС]
Двух одинаковых номеров в базе быть не может, все номера индивидуальны, поэтому первым блином у меня был поиск по ячейке в базе и дальнейшая запись значения в шаблон.

Добавлено через 6 минут
Вот есть пример кода который работает. но слишком медленно перебирает значения, может поможете его ускорить?
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
Sub Макрос1()
Application.ScreenUpdating = False
Dim Wb1 As Workbook
Dim Wb2 As Workbook
 
Dim Cl As Range
Set Wb1 = Workbooks("Сводный реестр обработанных закупок 2018.xlsx")
Set Wb2 = ActiveWorkbook
On Error Resume Next
With Wb1.Worksheets("Лист1")
    lRow = .Cells.SpecialCells(xlLastCell).Row
     
   Dim rngX As Range
   Dim i As Integer
   Set rngX = .Range("A1:A" & lRow)
    For i = 3 To 52 Step 3
        Set rngX = Union(rngX, .Range("A1:A" & lRow).Offset(, i))
    Next i
    Dim tmp
    For Each Cl In rngX.Cells
        tmp = Cl.Offset(, 2).Value
        Wb2.Worksheets("Лист1").Cells.Find(Cl.Value, LookAt:=xlWhole).Offset(2, 1) = tmp
    Next
    Application.ScreenUpdating = True
End With
End Sub
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
29.06.2018, 12:10
Цитата Сообщение от Pavelkzn Посмотреть сообщение
Двух одинаковых номеров в базе быть не может
- а база это где? Ибо есть два одинаковых номера...
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
29.06.2018, 12:31
Вот в представленном примере по два номера:

106581356 2
106604870 2
106596882 2
106607492 2
106601693 2
106607469 2
106603850 2
106601744 2
106607454 2
106607396 2
106609351 2

Добавлено через 2 минуты
Подкорректировал:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub pr()
    a = ActiveSheet.UsedRange
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            For j = 1 To UBound(a, 2) Step 3
                If Not IsEmpty(a(i, j)) And IsNumeric(a(i, j)) Then .Item(a(i, j)) = a(i, j + 2) '.Item(a(i, j)) + 1
            Next
        Next
        Sheets.Add
        Cells(1).Resize(.Count, 2) = Application.Transpose(Array(.keys, .items))
    End With
End Sub
0
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
29.06.2018, 13:04  [ТС]
Мы друг друга не поняли, я имел ввиду следующий код: из файла "Шаблончик" Лист1 берем номер к примеру "106607413" (в данном случае это номер в ячейке А2 и ищем его в файле "Сводный реестр извещений" найден он в ячейке D30, после того как номер найден необходимо записать значение что находиться на 2 ячейки правее от номера, то есть ячейка F30 "0" и записать этот номер в файл "Шаблончик" на 2 ячейки ниже и на 1 ячейку правее от номера который был взят для поиска (ячейка для записи будет B4).
Вот 2 новых файла с написанным макросом. который покажет принцип его работы. загвоздка в том, что файл "Сводный реестр обработанных закупок огромный (более 10000 строк) соответственно макрос написанный мною в нем просто очень долго перебирает поиском, я прошу помощи его оптимизировать или сделать аналогичный который бы не тормозил.
https://cloud.mail.ru/public/EVQD/QCLQFM7Ce
https://cloud.mail.ru/public/FM6R/5TwZxhc8L

Добавлено через 1 минуту
Цитата Сообщение от Hugo121 Посмотреть сообщение
- а база это где? Ибо есть два одинаковых номера...
под словом "база" подразумевается файл "Сводный реестр обработанных закупок"
0
6998 / 2896 / 555
Регистрация: 19.10.2012
Сообщений: 8,804
29.06.2018, 13:37
Так как раз в реестре и полно дублей.
0
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
29.06.2018, 13:43  [ТС]
Я с вами согласен, это моя ошибка при формировании примера я случайно их задвоил, но суть макроса не считать дубли, а записывать значение которое стоит рядом с искомым номером, именно поэтому я загрузил 2 новых файла, в файле "Шаблончик" присутствует макрос, который наглядно показывает то к чему я стремлюсь (только он это выполняет перебором).
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
29.06.2018, 20:14
Лучший ответ Сообщение было отмечено Pavelkzn как решение

Решение

Попробуй такой вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub pr()
    Dim Sh1 As Worksheet, Sh2 As Worksheet, i&, j&
    Set Sh1 = Workbooks("Сводный реестр обработанных закупок 2018.xlsx").Worksheets("Лист1")
    Set Sh2 = ActiveSheet
    a = Sh1.UsedRange
    b = Sh2.UsedRange.Columns(1)
    With CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(a)
            For j = 1 To UBound(a, 2) Step 3
                If Not IsEmpty(a(i, j)) And IsNumeric(a(i, j)) Then .Item(a(i, j)) = a(i, j + 2) '.Item(a(i, j)) + 1
            Next
        Next
        For i = 1 To UBound(b)
            If InStr(1, b(i, 1), "№") <> 0 Then
                Sh2.Cells(i + 2, 1) = .Item(b(i + 1, 1))
            End If
        Next
    End With
End Sub
1
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
02.07.2018, 10:19  [ТС]
То что нужно, спасибо, я реально неделю в книге сидел и голову ломал!

Добавлено через 1 час 12 минут
Я так полагаю что данный код работает только с числовыми значениями, а как можно его поправить чтобы он все значения искал? (бывают просто номера такого плана "106556916-1" или "ZO6556916", где присутствуют текстовые символы)
0
3218 / 967 / 223
Регистрация: 29.05.2010
Сообщений: 2,087
02.07.2018, 11:38
Лучший ответ Сообщение было отмечено Pavelkzn как решение

Решение

Цитата Сообщение от Pavelkzn Посмотреть сообщение
бывают просто номера такого плана "106556916-1" или "ZO6556916", где присутствуют текстовые символы)
Замени 10 строку на:
Visual Basic
1
If Not IsEmpty(a(i, j))  Then .Item(a(i, j)) = a(i, j + 2)
и будет счастье с текстовыми и числовыми полями.
1
0 / 0 / 0
Регистрация: 28.06.2018
Сообщений: 9
02.07.2018, 13:06  [ТС]
Прелестно!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.07.2018, 13:06
Помогаю со студенческими работами здесь

Макрос в VBA Outlook для периодической записи непрочитанных сообщений в БД Access
Есть база данных на Access которая содержит следующие поля в указанных форматах: DateReceipt : Дата/время Mail_by : Текстовый ...

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

Макрос по поиску дубликатов в книгах
Есть макрос, который ищет одинаковые ячейки (сравнивает две книги &quot;Книга1&quot; и &quot;Книга2&quot;). Вот тело макроса ...

Макрос по поиску листов в книге Exсel
Может кто сталкивался с макросом для поиска листов в книге? а то тут пришел файл и около 200 листов, теперь блуждаю по несколько секунд в...

Макрос по поиску чисел в Worde и выводу их количества
Необходим макрос по поиску чисел в word файле! макрос создается через vb в worde 2007! нашел пример с пробелами, но не смог его...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru