Форум программистов, компьютерный форум, киберфорум
Microsoft Access
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329

Множественный поиск значений из Access в книге Excel

18.02.2015, 14:31. Показов 1843. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть файл Excel с данными сгруппированными по строкам.
Необходим поиск ячеек в этом файле по двум значениям, которые берутся с формы Access.
Возможно что будут несколько совпадений. Поэтому в итоге нужно будет в отдельной форме вывести номера строк (с указанием этих найденных данных), где эти значения встречаются.
В этой форме должна быть возможность выбора нужного номера строки, чтобы затем выполнить команду вставки значений в ячейки именно этой строки.

Сравнение идет по таким данным
Poisk1 = ((Forms!Данные.Сумма_долга) + (Forms!Данные.Сумма_процентов))
Poisk2 = Forms!Данные.краткое_наименование

Наверно нужно организовать цикл присвоения переменным номеров строк пока находятся нужные совпадения и использовать FindNext...
Начало моего кода

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
Option Compare Database
Option Explicit
 
Dim app As Object
Dim Workbooks As Object
 
Dim strPathExcel As String
Dim xlWbk As Object
Dim ns
Dim xlApp As Object
Public Rowss As Integer, Rowss2 As Integer
 
Const MyFile = "P:\дела\ДЕЛА 2015 ОПОСД.xls"
Const l = "Сводная таблица_2015г" 'l = "Лист1" 'можно просто цифрой номер листа указывать
 
Sub Delo_v_Excel_Poisk_2()
Dim sRowNumber
Dim Poisk1, Poisk2
 
Set xlApp = CreateObject("Excel.Application.14") 'создаем объект Excel, чтобы можно было работать с его методами и свойствами
strPathExcel = MyFile
Set xlWbk = xlApp.Workbooks.Open(strPathExcel)
 
Poisk1 = Forms!Данные![Краткое наименование]
Poisk2 = ((Forms!Данные.Сумма_долга) + (Forms!Данные.Сумма_процентов))
 
sRowNumber=xlWbk.Worksheets(l).Cells.Find(What:=Poisk1, LookAt:=xlWhole).Row
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.02.2015, 14:31
Ответы с готовыми решениями:

Множественный поиск в excel. как сделать?
как сделать регулярными выражениями чтобы искал то или это типа оля|Маша|надя. имею в виду не перебором по строкам плюс регэксп а...

Доступ к книге Excel из VBA Access
Моя задача. Создать БД в Access, там же написать макрос что бы заполнить её данными из Excel`евских файлов. Создал структуру БД,...

поиск по книге excel в delphi
Други, подскажите как реализовать поиск ячейки по всей книге excel в delphi? Сломал ноги. Не могу найти...

10
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.02.2015, 15:52
Я бы сделал запрос на лист екселя с всеми нужными условиями. Это было бы быстрее, проще и понятней
SQL
1
2
3
4
SELECT *
FROM [Сводная таблица_2015г$] IN 'P:елаЕЛА 2015 ОПОСД.xls'[Excel 8.0;IMEX=2;hdr=YES;]
WHERE [Поле Наименования]=Forms!Данные![Краткое наименование]
AND [Поле суммы]=nz(Forms!Данные.Сумма_долга),0) + nz(Forms!Данные.Сумма_процентов),0)
1
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329
18.02.2015, 20:17  [ТС]
mobile, не знал что можно запросы в обратном порядке - из excel в access делать )
1) Но мне надо будет внести значения, а значит открыть файл. Файл используют другие пользователи, поэтому у меня сделана проверка на открытие файла другими пользователями...
2) А если всё таки через цикл - то есть пока находятся искомые значения перемененная например "F" получает каждый раз добавление к себе в виде цифры F1, F2, F3 и каждой из них присваивается номер строки, где найдены искомые значения?
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
18.02.2015, 20:25
Цитата Сообщение от intersk Посмотреть сообщение
не знал что можно запросы в обратном порядке - из excel в access делать
Не понял. Судя по тексту процедуры, она как раз выполняется в аксе с обращением к листу екселя. Разве не так?

Циклы, как и вообще весь ВБА, не должны быть, если есть возможность запроса. Ну, разве в особых, исключительных случаях, когда можно применять Seek, или когда сложность поиска превосходит возможности разработчика запроса, или в ситуациях с явно ненормализованными данными.
Запрос эффективней. Зачем что-то еще придумывать.
1
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329
19.02.2015, 08:41  [ТС]
mobile, ) просто я как бы всегда брал данные из акса и передавал их в excel, а тут получается что надо взять данные из excel и сравнить их с теми что в аксе )
есть ещё два "теоретических варианта" поиска
1) работает в самом excel/ Приспособить его для Access у меня не получается
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
Option Compare Database
Option Explicit
 
Dim app As Object
Dim Workbooks As Object
 
Dim strPathExcel As String
Dim xlWbk As Object
Dim ns
Dim xlApp As Object
Public Rowss As Integer, Rowss2 As Integer
 
Const MyFile = "P:\Судебные дела\СУДЕБНЫЕ ДЕЛА 2015 ОПОСД.xls"
Const l = "Сводная таблица_2015г" 'l = "Лист1" 'можно просто цифрой номер листа указывать
 
Sub Poisk_strok()
 
Dim F1, F2
Dim txt, КоличествоСтрок%
 
F1 = Forms!Данные!Краткое_наименование
 
    txt = Trim(F1): If Len(txt) = 0 Then Exit Sub    ' если текст не введён
    КоличествоСтрок% = ПоискСтрокПоУсловию(txt)
    If КоличествоСтрок% > 0 Then
        MsgBox "Найдено строк: " & КоличествоСтрок%
    Else
        MsgBox "подходящих строк не надено! "
    End If
End Sub
 
Function ПоискСтрокПоУсловию(ByVal ТекстДляПоиска As String, Optional HideOnly As Boolean) As Long
    ' функция получает в качестве параметра ТекстДляПоиска (можно использовать символы * и ?)
    ' Если HideOnly = TRUE, то строки, содержащие в ячейках ТекстДляПоиска, скрываются,
    ' иначе (HideOnly = FALSE - по умолчанию) - удаляются
    ' Функция возвращает количество удалённых строк
    Dim ra As Range, delra As Range
    
Set xlApp = CreateObject("Excel.Application.14") 'создаем объект Excel, чтобы можно было работать с его методами и свойствами
strPathExcel = MyFile
Set xlWbk = xlApp.Workbooks.Open(strPathExcel)
    
xlApp.Visible = True 'запускаем приложение Excel
xlApp.ScreenUpdating = False    ' отключаем обновление экрана
 
    ' перебираем все строки в используемом диапазоне листа
    For Each ra In ActiveSheet.UsedRange.Rows
        ' если в строке найден искомый текст
        If Not ra.Find(ТекстДляПоиска, , xlValues, xlPart) Is Nothing Then
            ' добавляем строку в диапазон для удаления
            If delra Is Nothing Then Set delra = ra Else Set delra = Union(delra, ra)
        End If
    Next
    On Error Resume Next: ПоискСтрокПоУсловию = delra.Areas.Count ' количество найденных строк
    
    If Not delra Is Nothing Then    ' если подходящие строки найдены - сообщение с их номером
        For Each ro In delra.EntireRow: MsgBox ro.Row: Next
    End If
End Function
2) вы когда предлагали вариант ранее, сможете подредактировать?
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
Sub Delo_v_Excel_Poisk_1()
 
Call StatusBarYes
 
Set xlApp = CreateObject("Excel.Application.14") 'создаем объект Excel, чтобы можно было работать с его методами и свойствами
'l = "Лист1" 'можно просто цифрой номер листа указывать
strPathExcel = MyFile
Set xlWbk = xlApp.Workbooks.Open(strPathExcel)
 
Dim S, r, db As DAO.Database, rst As DAO.Recordset
Dim stroka, adr1
 
Set db = CurrentDb
S = "select * from [Лист1$] in '" & MyFile & "'[Excel 12.0; HDR=True;]" 'В предположении что первая строка имя столбца
 
Set rst = db.OpenRecordset(S)
 
r = Range("A1") = Forms!Данные![Краткое наименование] & Range("F3") = (Forms!Данные!Сумма_долга + Forms!Данные!Сумма_процентов)
 
rst.FindFirst r
If rst.NoMatch Then
    MsgBox "Совпадений не найдено"
    Exit Sub
End If
 
stroka = rst.AbsolutePosition + 1 & vbCrLf
'Если совпадения есть, находим их
Do While True
  rst.FindNext r
  If Not rst.NoMatch Then 'Собираем строку сообщения
     stroka = stroka & rst.AbsolutePosition + 1 & vbCrLf
  End If
Loop
 
MsgBox "Значения найдены в строках " & vbCrLf & stroka
xlApp.Visible = True 'запускаем приложение Excel, можно сдвинуть вниз
 
Set app = Nothing 'уничтожаем переменную с объектом
Set xlApp = Nothing
Set xlWbk = Nothing
Set adr1 = Nothing
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.02.2015, 10:33
intersk, чтобы нам понять задачу, Вы сделайте вот что:
1. покажите фактический лист екселя с настоящими данными. Если там что-то секретное, но не относящееся к поиску, забейте эти ячейки мусором
2. покажите фактический вид поискового числа, ну не знаю, что там может быть - 13,27 или 13.27 (точка или запятая), может там есть еще что-то. Короче возможный фактический поисковый шаблон
3. на листе екселя выделите цветом строки и ячейки, которые удовлетворяют поисковому шаблону из п.2 и объясните по каким критериям Вы посчитали их соответствующими этому шаблону.

Анализируя этот лист екселя вместе с поисковым шаблоном, возможно удастся предложить решение

Добавлено через 2 минуты
Ну и конечно этот лист екселя нужен не в виде скрина. Должна быть книга екселя на которой можно потренироваться
0
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329
19.02.2015, 10:57  [ТС]
mobile, база и книга excel, путь к книге надо будет изменить в зависимости от того куда вы его поместите

посик будет идти по всему листу - что искать - 1) краткое наименование и 2) сумма долга с процентами (значение берется из формы данные по каждому делу, т.е. записи)
Вложения
Тип файла: zip База и Excel.zip (253.6 Кб, 4 просмотров)
0
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329
19.02.2015, 11:08  [ТС]
mobile, правильная "пара"
Вложения
Тип файла: zip База_Excel_2.zip (233.6 Кб, 4 просмотров)
0
Эксперт MS Access
26826 / 14506 / 3192
Регистрация: 28.04.2012
Сообщений: 15,782
19.02.2015, 18:45
Цитата Сообщение от intersk Посмотреть сообщение
mobile, правильная "пара"
Я НИЧЕГО не понял в этой раскраске. При всей ее привлекательности

Я же просил Вас
Цитата Сообщение от mobile Посмотреть сообщение
1. покажите фактический лист екселя с настоящими данными. Если там что-то секретное, но не относящееся к поиску, забейте эти ячейки мусором
2. покажите фактический вид поискового числа, ну не знаю, что там может быть - 13,27 или 13.27 (точка или запятая), может там есть еще что-то. Короче возможный фактический поисковый шаблон
3. на листе екселя выделите цветом строки и ячейки, которые удовлетворяют поисковому шаблону из п.2 и объясните по каким критериям Вы посчитали их соответствующими этому шаблону.
Сделано только 1 из 3. Почему такая раскраска не описано. Где искать - неизвестно. Что искать - непонятно. По какому принципу считать, что поиск верный/неверный - не знаю.

Я же абсолютно не знаю, что Вы будете искать и где в форме будете забивать поисковый шаблон. Да еще такой надо выбрать, чтобы он точно был на приложенном листе. Иначе как узнать, что поиск верный? И где искать шаблон - во всех полях или только в определенных. А может в определенных строках. Ниче не понятно.
0
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329
19.02.2015, 21:19  [ТС]
mobile, извините за недопонимание. Мой технический язык не силен.
Если нажать Главная форма - кнопка Данные - кнопка Печать - кнопка Excel (иск), то пойдет заполнение файла Excel и он откроется. (Только надо заменить в коде VBA пути к файлу Excel на те, которые будут у вас.) Код импорта данных из акса в эксел рабочий, я им пользуюсь.
В моей базе всего две тестовых записи (это видно по таблице и форме Данные), можно занести их обе в файл Excel, а потом попробовать определить номер строки в которую они внесены например по двум критериям - краткое наименование и сумма долга (это моё как бы техзадание)
(Цвет - это для разных пользователей свой цвет, с файлом работают несколько человек. При вставке строк пропадали границы, поэтому в другой теме и спрашивал про форматирование ячеек)
0
114 / 4 / 0
Регистрация: 07.09.2014
Сообщений: 329
19.02.2015, 21:37  [ТС]
mobile, дополнение к предыдущему посту.
Я пересобрал архив и изменил пути файлов. Надо поместить папку с базой и книгой на диск с.
Обратите внимание на модули которые работают с Excel:
Excel_Isk_Tabl (рабочий)
Excel_Zayv_Delo_Tabl (черновик)
Excel_Zayv_Delo_Tabl_2 (черновик из работающего макроса Excel)
Просто значения в форме Данные (по отдельным записям) заполняются не все сразу, а постепенно. И чтобы каждый раз не искать в файле Ecxel начально внесенную строку с частичными данными, а просто дозаполнить вновь внесенными данными и нужно определить номер строки этой начально введенной частично заполненной записи.
Вложения
Тип файла: zip База_Excel_2.zip (255.5 Кб, 4 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.02.2015, 21:37
Помогаю со студенческими работами здесь

Как организовать поиск в другой книге или в этой же книге, поиск по слову на определенных листах
Всем привет!) Как организовать поиск в другой книге или в этой же книге, поиск по слову на определенных листах? Например слово...

Поиск в книге, по названию листа другой. Excel
Добрый день, столкнулся с такой проблемой, не знаю как осуществить поиск по названию листа, объясню: Есть книга "Сводный", в...

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

Поиск значения в закрытой книге и выведение значений строки
Добрый день. Помогите пожалуйста. Есть Ecxel файл с набором данных который расположен в сети. Нужно сделать форму запроса, в которой,...

Поиск быстрого способа передачи значений Excel-массив-Excel
Всем доброго дня! Не судите строго, так как я только начинаю изучать VB. Пишу программу для автоматической обработки прайсов Excel. ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru