Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/40: Рейтинг темы: голосов - 40, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
1

Поиск в книге, по названию листа другой. Excel

19.03.2015, 05:27. Показов 7547. Ответов 19
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день, столкнулся с такой проблемой, не знаю как осуществить поиск по названию листа, объясню:

Есть книга "Сводный", в ней 70 ЛИСТОВ, в каждом листе по 31 строки. В этой же папке находится 31 книга (названы по порядку) соответственно в каждой из них по 70 СТРОК, и мне необходимо, чтобы:

1) Книга "1" открылась
2) Книга "Сводный" копировал название листа
3) Книга "1" ищет строку, копирует
4) Книга "Сводный" ищет строку "1" (соответвенно по названию книги), вставляет
5) Переход на следующий лист
6) Действия 2,3,4 повторяется пока не закончится листы
7) Книга "2" открылась
8) И снова тот же цикл

То есть обычным копированием массива тут не обойдешься, потому что нужно постоянно перепрыгивать с листа на лист, я написал то, что у меня получилось сделать, а именно цикл открытия книг по номеру, осталось понять как копировать данные используя поиск строки по названию листа.
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
Sub report ()
X=1
Y=1
WbPath=ThisWorkbook.Path & "\"
 
'Цикл присваивания названия книг по порядку
 
For i=2 To 31
Xi=xi+1
WbName=xi
On Error Resume Next
Workbooks.Open(wbPath &wbName)
If Err=0 Then
 
'Вот здесь должен быть цикл поиска по названию листа, копировании строки, и переход на следующий лист
 
Else: y=y+1
End If
Next i
MsgBox "Пропущено " & y & " документов."
 
'Закрываем все книги кроме той, из которой запущен макрос
 
Dim wb as workbook
For Each wb in Workbooks
If not wb is ThisWorkbook Then
If wb.windows(1).Visible Then wb.close
End If
Next wb
End Sub
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.03.2015, 05:27
Ответы с готовыми решениями:

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

При создании нового листа произвести проверку на существование вводимого имени листа в текущей книге EXCEL
При создании нового листа, произвести проверку на существование вводимого имени листа в текущей...

Поиск по названию листа
Как можно осуществить поиск по номеру страницы?

Сохранение конкретного листа файла в другой книге
Здравствуйте, Подскажите, пожалуйста, как можно сделать сохранение определенного листа файла в...

19
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
19.03.2015, 08:36 2
Выложите файл пример. Я не очень понял, что именно нужно копировать.
0
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
19.03.2015, 10:31  [ТС] 3
Оу, это проблемно, сижу через яблокофон...

Попробую объяснить еще шире:
Книга "Сводный" в ней 70 листов с названием машин вида А 111 АА 11 (значения условны)
В каждом листе в столбце А номер дня по порядку от 1 до 31

В этой же папке тридцать одна книга, соответственно по дням месяца, открывая книгу в ней списком эти 70 машин с масивом данных на одном листе.

Тоесть задача программы собрать данные из 31 книги, рассортировать их по листам, чтобы выбрав вкладку машины, можно было видить результат за каждый день.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
19.03.2015, 11:10 4
Схематично так - открываем в цикле каждую книгу (1 раз), собираем данные в словарь или массив.
Затем открываем сводный файл и всё собранное раскладываем по местам.
Или другой вариант - все данные тянем формулами, т.к. заранее известны все координаты данных - имя файла, имя листа, диапазон. Эти формулы можно прописать макросом, затем заменить на вытянутые значения.

Если видеть файлы - возможно эти подходы не годятся, но есть похожие задачи, которые решались именно так.
0
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
19.03.2015, 11:31  [ТС] 5
В том то и дело, что формулами не получится, потому что машины могут добавлятся, удаляться, плюс эти отчеты формируются в хаотичном порядке, поэтому нужен именно поиск строки.

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

Суть кода ведь в том чтобы оптимизировать, конечно если для каждого листа написать код , с уже фиксированными значениями , было бы не эффективно, но более легче, но если добавлять машины нужно и код редактировать, а пользователи женщины от 40 плохо владеющие ПК
0
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
19.03.2015, 11:41 6
Создал у себя 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
Sub add()
    Dim con As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim path As String
    Dim i As Integer, j As Integer, k As Integer
    
    path = ThisWorkbook.path & "\"
    For i = 1 To 31
        con.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & path & i & ".xls; Extended Properties=""Excel 8.0;HDR=No;IMEX=1""")
        rst.Open ("select * from [Лист1$]"), con
        For j = 0 To 69
            With ThisWorkbook.Sheets(rst.Fields(0).Value)
                For k = 1 To rst.Fields.Count - 1
                    .Cells(i, k + 1).Value = rst.Fields(k).Value
                Next k
            End With
            rst.MoveNext
        Next j
        
        rst.Close
        
        con.Close
    Next i
End Sub
Нужно подключить библиотеку ADO.
0
6922 / 2832 / 543
Регистрация: 19.10.2012
Сообщений: 8,645
19.03.2015, 11:43 7
Думаю без примера файлов дела не будет.
А буфер обмена конечно можно обрабатывать, но это не нужно, и излишне сложно для этой задачи.
0
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
19.03.2015, 12:00 8
Немного переделал. На случай, если в файлах меньше 70 строк.

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 add()
    Dim con As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim path As String
    Dim i As Integer, j As Integer, k As Integer
    
    path = ThisWorkbook.path & "\"
    For i = 1 To 31
        con.Open ("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & path & i & ".xls; Extended Properties=""Excel 8.0;HDR=No;IMEX=1""")
        rst.Open ("select * from [Лист1$]"), con
        
        Do While Not rst.EOF
            With ThisWorkbook.Sheets(rst.Fields(0).Value)
                For k = 1 To rst.Fields.Count - 1
                    .Cells(i, k + 1).Value = rst.Fields(k).Value
                Next k
            End With
            rst.MoveNext
        Loop
        
        rst.Close
        
        con.Close
    Next i
End Sub
Добавлено через 2 минуты
Microsoft ActiveX Data Objects 2,8 Library

Вот эту библиотеку подключал.
0
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
19.03.2015, 14:10  [ТС] 9
Значения условны, для наглядности, в моём случае машин 70, данных гораздо больше, документ "1" можно раскопировать и переименовать, структура листа одинаковая, разница лишь в данных и порядке.
Гос. номер и название листов в Сводной книге одинаковые.

Каждый день приходит файл Excel со списком ВСЕХ машин, бедная 40 летняя женщина открывает Книгу "Сводный" и каждый день в ручную копирует информацию для каждой машины, это всё крайне медленно а начальству удобно смотреть прогресс по каждой машине отдельно. Я ей решил помочь и две таблицы упростил в 1 кнопку, а вот эту задачу не понимаю как сделать. Точнее сделать то можно, написать для каждой машины свой алгоритм, но это крайне неэффективно, вы же понимаете
Вложения
Тип файла: xlsx 1.xlsx (9.1 Кб, 22 просмотров)
Тип файла: xlsx Сводный.xlsx (13.7 Кб, 21 просмотров)
0
15146 / 6419 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
19.03.2015, 14:54 10
Другой вариант, макрос в книгу Сводный.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
Sub bb()
Dim i&, j&, c As Range, wb As Workbook
On Error Resume Next
Application.ScreenUpdating = False
For i = 1 To 31
  Set wb = Workbooks.Open(ThisWorkbook.Path & "\" & i & ".xlsx")
  If Err Then
    Err.Clear
  Else
    For j = 1 To ThisWorkbook.Worksheets.Count
      Set c = wb.Worksheets(1).Columns(2).Find(ThisWorkbook.Worksheets(j).Name, , xlValues, xlWhole)
      If Not c Is Nothing Then
        c.Offset(, 1).Resize(, 4).Copy ThisWorkbook.Worksheets(j).Cells(i + 1, 2)
      End If
    Next
    wb.Close 0
  End If
Next
Application.ScreenUpdating = True
End Sub
0
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
19.03.2015, 23:38 11
Лучший ответ Сообщение было отмечено Krool как решение

Решение

Переделал под структуру из примера.
Работает без открытия книг.

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
Sub test()
    Dim con As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    Dim i As Integer, j As Integer
    For i = 1 To 31
        On Error Resume Next
        con.Open ("Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & ThisWorkbook.path & "\" & i & ".xlsx; Extended Properties=""Excel 12.0;HDR=Yes;IMEX=1""")
        If Err = 0 Then
            rst.Open ("select * from [Ежедневный отчет$]"), con
            Do While Not rst.EOF
                With ThisWorkbook.Sheets(rst.Fields(1).Value)
                    For j = 2 To rst.Fields.Count - 1
                        .Cells(i + 1, j).Value = rst.Fields(j).Value
                    Next j
                End With
                rst.MoveNext
            Loop
            rst.Close
            con.Close
          Else
            Err = 0
        End If
    Next i
End Sub
1
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
20.03.2015, 08:56  [ТС] 12
Казанский, спасибо, ваш вариант более менее справляется, еще до работать, подскажите а как чтобы он выделил всю строку, а не пару ячеек для копирования?

Vovchikvsb подключил библиотеку, на цикле if err=0 then пропускает , я правильно понимаю что код в инет просится? Или меня просто сбили с толку слова конект и провайдер?
0
Модератор
Эксперт MS Access
11962 / 4830 / 779
Регистрация: 07.08.2010
Сообщений: 14,147
Записей в блоге: 4
20.03.2015, 10:56 13
циклом по книгам сформировать текстовик(для скорости)

номер книгиГос. НомерПробег началоПробег конецКилометражСмена (часов)
1Машина 11542
2Машина 3514915
3Машина 2514915
     
31     

открыть текстовик екселем

далее обычные фильтры и сводные
0
15146 / 6419 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
20.03.2015, 10:58 14
Цитата Сообщение от Krool Посмотреть сообщение
как чтобы он выделил всю строку, а не пару ячеек для копирования?
Сейчас копируются 4 ячейки справа от найденного гос. номера: 13 строка
c.Offset(, 1).Resize(, 4).Copy ...
Всю строку копировать не получится, т.к. по условию первые два столбца в файлах разные.
0
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
20.03.2015, 11:54  [ТС] 15
Vovchikvsb, огромное человеческое спасибо!!! Немного разобрался в вашем коде, нашел пару моментов почему выдавало ошибку, всё дело в типе данных, и некоторых внутренних оссобенностей таблицы, подкорректировал и всё работает именно так как должно! Спасибо!
0
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
20.03.2015, 20:09 16
Цитата Сообщение от Krool Посмотреть сообщение
Vovchikvsb, огромное человеческое спасибо!!!
Не за что.

Цитата Сообщение от Krool Посмотреть сообщение
я правильно понимаю что код в инет просится? Или меня просто сбили с толку слова конект и провайдер?
Не в инет. Это подключение к файлу. Просто я подумал, что лучше не открывать книги, а подключиться к ним.
0
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
20.03.2015, 20:25  [ТС] 17
Цитата Сообщение от Vovchikvsb Посмотреть сообщение
Не за что.



Не в инет. Это подключение к файлу. Просто я подумал, что лучше не открывать книги, а подключиться к ним.
Vovchikvsb, подскажи, а как изменить эту строку чтобы он именно открывал, у меня проблема что он не копирует данные если они не открыты, как только добавил строку открытия он работает как надо. С теми простыми примерами хорошо работает без открытия, но в моем варианте почему то сбой.

И подскажи где можно изучить работу с этой библиотекой? Книжку , самоучитель
0
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
20.03.2015, 21:17 18
Цитата Сообщение от Krool Посмотреть сообщение
подскажи, а как изменить эту строку чтобы он именно открывал
Если нужно открыть книгу в эксель, то это код Казанский.

Цитата Сообщение от Krool Посмотреть сообщение
С теми простыми примерами хорошо работает без открытия, но в моем варианте почему то сбой
Выложите один файл именно вашего варианта. Возможно нужно изменить настройки подключения.

Цитата Сообщение от Krool Посмотреть сообщение
И подскажи где можно изучить работу с этой библиотекой? Книжку , самоучитель
Сейчас поищу что-нибудь подходящее. Сам в поисковике искал.
0
0 / 0 / 0
Регистрация: 19.03.2015
Сообщений: 16
20.03.2015, 21:30  [ТС] 19
Да впринципе код чутка добавил и всё нормально, просто хочу понять как 6 строка работает, какие атрибуты за что отвечают
0
466 / 123 / 61
Регистрация: 04.03.2015
Сообщений: 325
20.03.2015, 21:50 20
На форуме не нашел литературы на эту тему, а сторонние ссылки вроде запрещены((
0
20.03.2015, 21:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.03.2015, 21:50
Помогаю со студенческими работами здесь

Создание листа в рабочей книге Excel
Мне надо экспортировать данные из запроса в один экселевский файл, причём каждую запись на новый...

Очистить содержимое определённого листа в книге Excel
Доброго, форумчане! не как не могу средствами vbs очистить содержимое определенного листа в excel ...

Работа с Excel. Создание листа в книге по шаблону
Доброго времени суток. Прошу помочь с вопросом: Есть некоторая книга Ecxel из 2-х листов (а и b) с...

Как узнать Item листа в книге Excel
есть большая книга (листов больше 1000) Не ругайте - так удобнее мне для своих целей Name листов...


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

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