Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.83/35: Рейтинг темы: голосов - 35, средняя оценка - 4.83
16 / 4 / 0
Регистрация: 01.08.2011
Сообщений: 72

Организация циклической вставки данных

15.01.2013, 14:12. Показов 7941. Ответов 69
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Необходим макрос последовательного ввода данных в рабочую книгу из набора большого количества файлов, находящихся в 1 папке, например, с:\Baza и именуемые Файл1.xls, Файл2.xls и так далее. У всех у них один лист и называется одинаково "Лист1". Количество таких файлов конечно, но пока неизвестно. Необходимо последовательно в текущую открытую книгу на "Лист1" вставлять данные со столбца "А" по столбец "К" каждого из файлов последовательно, закрывая потом файл-источник. Возможно ли, чтобы макрос сам определял количество файлов-источников и формировал цикл? Процедура будет выполнятся многократно, поэтому нужен макрос. Процедуру обработки данных вставлю сам в нужное место.

Добавлено через 23 минуты
Забыл уточнить. Реализовать надо без использования буфера обмена.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.01.2013, 14:12
Ответы с готовыми решениями:

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

Организация работы программ циклической структуры
Написать программу, которая вычисляет факториал числа, введенного с клавиатуры. (Факториалом числа n называется произведение целых чисел ...

ОРГАНИЗАЦИЯ РАБОТЫ ПРОГРАММ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ
Вычислить значения функции y = 4x 3 – 2x 2 + 5 для значений х, измeняющихся от –3 до 1, с шагом 0,1.

69
16 / 4 / 0
Регистрация: 01.08.2011
Сообщений: 72
15.01.2013, 22:32  [ТС]
Студворк — интернет-сервис помощи студентам
Вручную все работает нормально и быстро - меня устраивает, только надо автоматизировать повторяющиеся процедуры.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
15.01.2013, 22:55
Код делает следующее:
  1. открывает файл в папке;
  2. копирует в нём столбцы "A:K" и вставляет на активный лист;
  3. закрывает файл;
  4. открывает следующий файл;
  5. копирует столбцы "A:K" и вставляет на активный лист, начиная с двенадцатого столбца;
  6. и т.д.
Для работы кода нужно подключить библиотеку в VBA: Tools - References... - Windows Script Host Object Model.
Кликните здесь для просмотра всего текста
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
Sub Procedure_1()
 
    'В константе "myPath" указываем путь папки, где находятся
        'книги Excel, из которых нужно взять данные.
    Const myPath As String = "C:\Users\User\Desktop\Папка"
    
    'С помощью "New" создаём объект "File System Object"
        'и даём ему имя "myFSO".
    Dim myFSO As New IWshRuntimeLibrary.FileSystemObject
    Dim myFolder As IWshRuntimeLibrary.Folder
    Dim myFile As IWshRuntimeLibrary.File
    Dim myActiveSheet As Excel.Worksheet
    Dim shSheet_1 As Excel.Worksheet
    Dim myLastColumn As Long
    
    'Отключаем всё, что может тормозить работу кода.
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    
    '1. С помощью переменной "myLastColumn" будет
        'определяться номер столбца на активном листе, в
        'который будут вставляться данные.
    'Пока задам число один.
    myLastColumn = 1
    
    '2. Даём имя "myActiveSheet" активному листу. Через это имя
        'будем обращаться к активному листу.
    Set myActiveSheet = ActiveSheet
    
    '3. Даём имя "myFolder" папке, где содержатся наши файлы.
    'Через это имя будем обращаться к папке.
    Set myFolder = myFSO.GetFolder(FolderPath:=myPath)
    
    '4. Просматриваем все файлы в папке.
    For Each myFile In myFolder.Files
        
        '4.1. Смотрим расширение файла.
        'LCase приводит все символы к строчному виду - маленькие буквы.
        'Просто иногда почему-то расширение то большими буквами, то маленькими.
        If LCase(myFile.Name) Like "*.xlsm" = False Then
            'Если у файла расширение не "xlsm", то
                'переходим к следующему файлу.
            GoTo metka
        End If
        
        '4.2. Открываем файл и даём первому листу имя "shSheet_1".
        'Через это имя можно обращаться к листу.
        Set shSheet_1 = Workbooks.Open(Filename:=myFile.Path).Worksheets(1)
        
        '4.3. Берём данные из файла и помещаем в активный лист.
        shSheet_1.Columns("A:K").Copy _
            myActiveSheet.Cells(1, myLastColumn)
 
        '4.4. Закрываем файл.
        shSheet_1.Parent.Close SaveChanges:=False
        
        '4.5. Определяю номер столбца на активном листе,
            'куда вставлять следующие данные.
        myLastColumn = myLastColumn + 11
        
metka:
 
    Next myFile
    
    'Включаем то, что отключали.
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub



Примечание

Использование команды Copy для копирования сразу всех столбцов "A:K" оказалось быстрее (намного быстрее), чем использование такой конструкции:
Visual Basic
1
myActiveSheet.Columns(i).Value = shSheet_1.Columns(j).Value
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
16.01.2013, 00:48
Скрипт, ты написал отличный код, вот только он, как я понимаю, добавляет строки очередной книги не под строками, взятыми из предыдущей книги, а сбоку, на следующих 11 столбцах. И это логично - если в книге уже есть миллион строк, то следующий миллион уже не поместится. Но ТС наверняка хочет иметь только 11 столбцов, чтобы производить над ними операции сортировки, поиска дубликатов и т.д.

Поэтому предлагаю также альтернативное решение с использованием БД 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
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
Option Explicit
 
Sub ExportToDAO()
    'Имя используемой базы данных
    Const db_name = "ExportHere"
    'Объявляем используемые в данной процедуре переменные.
    Dim fso As IWshRuntimeLibrary.FileSystemObject
    Dim fdr As IWshRuntimeLibrary.Folder
    Dim f As IWshRuntimeLibrary.File
    Dim wb As Excel.Workbook
    Dim wst As Excel.Worksheet
    Dim c As Excel.Range, rng As Excel.Range
    Dim db As DAO.Database
    Dim path_to_wb As String
    Dim path_to_db As String
    Dim query As String
    Dim i As Long, rows_count As Long
    'Получаем полный путь к данной книге.
    path_to_wb = ThisWorkbook.Path
    'Получаем полный путь к используемой базе данных,
    'при этом предполагается, что она лежит в той же
    'папке, в которой лежит данная книга.
    path_to_db = path_to_wb + "\" + db_name
    'Открываем базу данных.
    On Error GoTo OpenDbErr
        Set db = DAO.OpenDatabase(path_to_db)
    On Error GoTo 0
    'Создаем объект файловой системы.
    Set fso = New IWshRuntimeLibrary.FileSystemObject
    'Используем функцию GetFolder файловой системы для
    'получения ссылки на папку, в которой лежит данная книга.
    Set fdr = fso.GetFolder(path_to_wb)
    'Отключаем обновление экрана и обработку событий.
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    'Организуем цикл обработки файлов в папке.
    For Each f In fdr.Files
        'Если файл имеет расширение ".xlsm" или ".XLSM" - предполагаем, что он
        'представляет собой книгу Excel с поддержкой макросов, и соответственно...
        '(разумеется, не будем открывать сам "ExportLauncher"!)
        If LCase(f.Name) Like "*.xlsm" _
        And f.Name <> "ExportLauncher.xlsm" _
        And f.Name <> "~$ExportLauncher.xlsm" Then
            '...открываем данную книгу,
            On Error GoTo OpenWbErr
                Set wb = Application.Workbooks.Open(f.Path)
            On Error GoTo 0
            '...открываем первый лист данной книги,
            Set wst = wb.Worksheets(1)
            '...получаем кол-во строк в данной книге
            '(для определения используемого диапазона
            'применяется свойство UsedRange объекта Worksheet),
            rows_count = wst.UsedRange.Rows.Count
            'и в цикле просматриваем все строки данной книги, а
            'затем добавляем данные из этих строк в базу данных.
            For i = 1 To rows_count
                'Получаем ссылку на строку i, столбцы с 1-го ("A") по 11-й ("K").
                Set rng = wst.Range(wst.Cells(i, 1), wst.Cells(i, 11))
                'Проходим по ячейкам строки и заполняем SQL-запрос.
                query = "INSERT INTO ExportedData ( ColumnA, ColumnB, ColumnC, ColumnD, ColumnE, ColumnF, ColumnG, ColumnH, ColumnI, ColumnJ, ColumnK) VALUES ('"
                For Each c In rng
                    query = query & CStr(c) & "', '"
                Next c
                query = Left(query, Len(query) - 3) & ")"
                'Добавляем новую строку в базу данных.
                On Error GoTo QueryExecErr
                    db.Execute query
                On Error GoTo 0
            Next i
            'Закрываем книгу.
            wb.Close False
        End If
    Next f
    GoTo Ends
    
OpenDbErr:
    Debug.Print "Не удается открыть базу данных" & vbCrLf & path_to_db _
    & vbCrLf & "либо данная база данных не существует."
    Exit Sub
    
OpenWbErr:
    Debug.Print "Не удается открыть книгу" & vbCrLf & f.Path _
    & vbCrLf & "либо это не книга Excel, либо книга не существует."
    GoTo Ends
 
QueryExecErr:
    Debug.Print "Не удается выполнить запрос:" & vbCrLf & query & vbCrLf & "Проверьте правильность запроса"
    GoTo Ends
 
Ends:
    'Включаем обработку событий и обновление экрана.
    Application.EnableEvents = True
    Application.ScreenUpdating = True
    'Закрываем базу данных.
    db.Close
    Set db = Nothing
 
End Sub
Прикладываю тестовые файлы в приложении. Можете испытывать (макрос запускается через кнопку в файле ExportLauncher.xlsm).

С уважением,
Aksima
Вложения
Тип файла: rar UsingDAOandFSO.rar (58.4 Кб, 3 просмотров)
2
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
16.01.2013, 01:13
Цитата Сообщение от San8691 Посмотреть сообщение
массив содержит около миллиона строк по столбец "К". Таких файлов 150
Зачем вообще собирать такую массу данных в одном месте? Нельзя ли построить алгоритм обработки так: открыть первый файл - обсчитать - закрыть, открыть второй - обсчитать - закрыть и т.д. Тогда и копировать ничего не надо.
0
16 / 4 / 0
Регистрация: 01.08.2011
Сообщений: 72
16.01.2013, 07:47  [ТС]
Казанский, Ваши 2 строчки абсолютно точно выражают то, что мне надо. Именно этот скрипт меня и интересует. Только обсчет происходит в другом месте - в рабочей книге, где уже заранее заведены формулы и виден итог. Поэтому нужно последовательное копирование, то есть перебор данных. И вставлять их надо в расчетный файл в то же место, где были предыдущие данные.

Добавлено через 1 час 17 минут
Aksima, Правильно ли я понимаю, что в Вашем скрипте данные из файла-источника последовательно (построчно) наполняют рабочую книгу? с 1 по миллионную строку (если количество строк миллион)? с56 по 67 строка скрипта.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 08:28
Aksima,
Visual Basic
1
Set db = DAO.OpenDatabase(path_to_db)
DAO уже не используется в программировании. Вместо него используется ADO.



San8691, если данные нужно вставлять в одно и то же место на активном листе, то тогда такой код.
Код не использует буфер обмена.
Для работы кода нужно подключить библиотеку в VBA: Tools - References... - Windows Script Host Object Model.

Кликните здесь для просмотра всего текста
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
Sub Procedure_1()
 
    'В константе "myPath" указываем путь папки, где находятся
        'книги Excel, из которых нужно взять данные.
    Const myPath As String = "C:\Users\User\Desktop\Папка"
    
    'С помощью "New" создаём объект "File System Object"
        'и даём ему имя "myFSO".
    Dim myFSO As New IWshRuntimeLibrary.FileSystemObject
    Dim myFolder As IWshRuntimeLibrary.Folder
    Dim myFile As IWshRuntimeLibrary.File
    Dim myActiveSheet As Excel.Worksheet
    Dim shSheet_1 As Excel.Worksheet
    
    'Отключаем всё, что может тормозить работу кода.
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
    
    '1. Даём имя "myActiveSheet" активному листу. Через это имя
        'будем обращаться к активному листу.
    Set myActiveSheet = ActiveSheet
    
    '2. Даём имя "myFolder" папке, где содержатся наши файлы.
    'Через это имя будем обращаться к папке.
    Set myFolder = myFSO.GetFolder(FolderPath:=myPath)
    
    '3. Просматриваем все файлы в папке.
    For Each myFile In myFolder.Files
        
        '3.1. Смотрим расширение файла.
        'LCase приводит все символы к строчному виду - маленькие буквы.
        'Просто иногда почему-то расширение то большими буквами, то маленькими.
        If LCase(myFile.Name) Like "*.xlsm" = False Then
            'Если у файла расширение не "xlsm", то
                'переходим к следующему файлу.
            GoTo metka
        End If
        
        '3.2. Открываем файл и даём первому листу имя "shSheet_1".
        'Через это имя можно обращаться к листу.
        Set shSheet_1 = Workbooks.Open(Filename:=myFile.Path).Worksheets(1)
        
        '3.3. Берём данные из файла и помещаем в активный лист.
        shSheet_1.Columns("A:K").Copy myActiveSheet.Range("A1")
 
        '3.4. Закрываем файл.
        shSheet_1.Parent.Close SaveChanges:=False
        
metka:
 
    Next myFile
    
    'Включаем то, что отключали.
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub



San8691, если вы вставляемые данные обрабатываете с помощью формул или макросов, которые должны запускаться при каком-то событии (пример события - изменение данных на листе), то тогда нужно подумать о том, в какой части кода разместить это или может вообще удалить из кода это, если скорость работы кода останется прежней или не сильно будет отличаться:
Visual Basic
1
2
3
4
    'Отключение обработки событий.
    Application.EnableEvents = False
    'Отключение пересчёта формул.
    Application.Calculation = xlCalculationManual
1
16 / 4 / 0
Регистрация: 01.08.2011
Сообщений: 72
16.01.2013, 09:05  [ТС]
Скрипт, Ну вот и готовое решение. Большое спасибо. Правильно ли я понимаю, что то место, где я могу вставить блок обработки данных в рабочей книге (включая макросы) можно расположить условно говоря в 49 строке...или в 51? где правильнее?

Добавлено через 8 минут
По состоянию на 49 строку после закрытия файла-источника автоматически становится активной текущая книга или это не так?

Добавлено через 6 минут
Скрипт, Попробовал последний вариант скрипта. Все отлично работает, за исключением того, что первым открывается 2 файл, потом 3 и так далее. Последним открывается первый. Можно подправить?

Добавлено через 15 минут
Каков алгоритм перебирания файлов в папке-источнике данных? По названию? по размеру? может другой критерий? У меня 3 файла сейчас Файл1.xlsm Файл2.xlsm Файл3.xlsm первый самый большой. второй самый маленький. Похоже скрипт прогнал их по "весу" начиная с наименьшего.
0
 Аватар для Апострофф
9912 / 3933 / 743
Регистрация: 11.10.2011
Сообщений: 5,915
16.01.2013, 09:25
San8691, по какому принципу Вы определяете, какой файл первый, а какой последний?
У FSO на этот счёт может быть своё мнение (скорее всего по времени создания файла).

Добавлено через 14 минут
Вместо FSO здесь проще использовать Dir -
Visual Basic
1
2
3
4
5
6
Const myPath As String = "C:\Users\User\Desktop\Папка"
i=1
while dir(myPath & "\Файл" & i & ".xlsm")<>""
  'ваши действия с файлом myPath & "\Файл" & i & ".xlsm"
  i=i+1
wend
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 09:49
Код без использования библиотеки "Windows Script Host Object Model".
Код с использованием команды Dir.

San8691, обработку файла добавьте в код ниже, в пункт 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
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
Sub Procedure_1()
 
    'В константе "myPath" указываем путь папки, где находятся
        'книги Excel, из которых нужно взять данные.
    Const myPath As String = "C:\Users\User\Desktop\Папка"
    
    Dim shActiveSheet As Excel.Worksheet
    Dim shSheet_1 As Excel.Worksheet
    Dim myFile As String
    
    'Отключаем всё, что может тормозить работу кода.
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
 
    '1. Даём имя "shActiveSheet" активному листу. Через это имя
        'будем обращаться к активному листу.
    Set shActiveSheet = ActiveSheet
    
    '2. Для просмотра всех файлов в папке будем использовать
        'команду "Dir" - может она будет обрабатывать файлы
        'в алфавитном порядке.
    
    '2.1. Помещаем в переменную "myFile" имя первого нужного файла.
    myFile = Dir(myPath & "\*.xlsm")
    
    '2.2. Делаем цикл до тех пор, пока в переменной "myFile"
    'будет имя файла.
    Do While myFile <> ""
 
        '3. Открываем файл и даём первому листу имя "shSheet_1".
        'Через это имя можно обращаться к листу.
        Set shSheet_1 = Workbooks.Open(myPath & "\" & myFile).Worksheets(1)
 
        '4. Берём данные из файла и помещаем в активный лист.
        shSheet_1.Columns("A:K").Copy shActiveSheet.Range("A1")
 
        '5. Закрываем файл.
        shSheet_1.Parent.Close SaveChanges:=False
 
        '6. Здесь обработка данных в активной книге.
        'К активной книге нужно обращаться по имени "shActiveSheet".
        
        '7. Это взятие следующего имени файла с теми же
            'параметрами, что указаны в пункте 2.1.
        myFile = Dir
    
    Loop
    
    'Включаем то, что отключали.
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub



Примечание

Активная книга, куда копируются данные, должна быть сохранена.
Если активная книга новая книга, то Excel закрывает её при открытии обрабатываемого файла и из-за этого происходит ошибка.
1
 Аватар для Апострофф
9912 / 3933 / 743
Регистрация: 11.10.2011
Сообщений: 5,915
16.01.2013, 10:00
Цитата Сообщение от Скрипт Посмотреть сообщение
'2. Для просмотра всех файлов в папке будем использовать
'команду "Dir" - может она будет обрабатывать файлы
'в алфавитном порядке.
При указанном подходе вряд ли!?
Скорее всего принцип будет тот же (по дате создания).
Да и алфавитный порядок для ТС тоже не подойдёт, т.к. Файл10 получим раньше, чем Файл2.
Перебирать файлы придется по счетчику
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 10:03
Апострофф, я имел ввиду алфавитный порядок, который используется в сортировках, например, в Excel, в Windows.

Если код из сообщения #29 тоже будет брать файлы не в алфавитом порядке, то тогда нужно брать имена всех файлов, сортировать эти имена и уже обрабатывать файлы на основе этой сортировки.
0
 Аватар для Апострофф
9912 / 3933 / 743
Регистрация: 11.10.2011
Сообщений: 5,915
16.01.2013, 10:13
Скрипт, ещё раз повторю - ТС хочет не алфавитный порядок, а по номерам файлов, т.е. "Файл10" > "Файл2". Алфавитная сортировка имен этого не обеспечивает!
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 10:17
Апострофф, а какие есть ещё виды сортировок кроме Алфавитной. Я не программист и терминологию сортировок не знаю. Программа Excel как сортирует - как эта сортировка называется?
0
16 / 4 / 0
Регистрация: 01.08.2011
Сообщений: 72
16.01.2013, 10:44  [ТС]
Скрипт, и это все тоже работает, но перебор файлов происходит также - то есть скорее всего по дате создания, что меня вполне устроит. Это даже удобнее, поскольку могу обзывать их так, как мне удобнее. Дело за малым - впихнуть в этот скрипт метод обращения к файлу-источнику за данными, не открывая его, в целях экономии времени, если этот метод действительно даст такую экономию. Но, думаю, это будет отдельная тема.

Добавлено через 2 минуты
Господа, не спорьте. Меня вполне устроит выбор по дате создания файла, поскольку все равно предстоит работа по их переименованию и увеличению количества (так как сейчас в каждом по 3-4 листа).

Добавлено через 12 минут
Сейчас проверил на разных файлах разные комбинации. Действительно перебирает по дате создания, начиная с более ранней, что является для меня оптимальным. Всем Спасибо!
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
16.01.2013, 11:02
Aksima, Правильно ли я понимаю, что в Вашем скрипте данные из файла-источника последовательно (построчно) наполняют рабочую книгу? с 1 по миллионную строку (если количество строк миллион)? с56 по 67 строка скрипта.
Нет, неправильно понимаете. В моем скрипте данные из файлов-источников последовательно (построчно) наполняют не рабочую книгу, а базу данных ExportHere.accdb, и не с 1 по миллионую строку, а с n+1 по n+m строку, где n - количество строк в БД до экспорта, m - суммарное количество строк в файлах-источниках (другими словами, данные добавляются в конец таблицы в базе данных).

Цитата Сообщение от Скрипт Посмотреть сообщение
DAO уже не используется в программировании. Вместо него используется ADO.
А почему вы решили, что DAO уже не используется в программировании? И чем ADO лучше?

С уважением,
Aksima
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 11:28
Пункт 1

В связи с тем, что есть разные способы сортировки и "Проводник" в Windows может сортировать, используя один способ, а код, написанный на VBA, может использовать другой способ сортировки, то остаётся только один вариант, чтобы наверняка обработать файлы в нужной последовтельности, - нужно указывать в коде конкретные имена книг, т.е. то, что предложено в сообщении #28:
Организация циклической вставки данных

Использовать всё остальное - это рисковано.


Пункт 2

Цитата Сообщение от Aksima Посмотреть сообщение
А почему вы решили, что DAO уже не используется в программировании?
я в базах данных не разбираюсь, просто одно время читал в различных книгах.
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
16.01.2013, 11:29
Цитата Сообщение от San8691 Посмотреть сообщение
Необходим макрос последовательного ввода данных в рабочую книгу из набора большого количества файлов
Для этого файлы можно вообще не открывать
Ув. Aksima уже упомянул технологию БД - с ее помощью можно доставать данные из закрытых файлов Excel.
Однако в Excel уже есть встроенный механизм доступа к данным из закрытых файлов! И он работает даже без VBA - это формулы!
Откройте пустой лист рабочей книги (с макросами) и выполните макрос
Visual Basic
1
2
3
Sub Макрос1()
Range("A1:J10000").FormulaArray = "='D:\temp\[MyData1.xls]Лист1'!A1:J10000"
End Sub
(перед запуском, разумеется, вставьте свой путь к файлу и имя листа). Excel подтянет данные из закрытой книги в указанный диапазон. Для миллиона строк допишите по два нуля слева и справа. Поменяйте имя файла в строке и запустите макрос снова - получите данные из другой книги.
Более того. Многие формулы Excel работают с закрытыми книгами. Так что, может быть, и специальный лист для загрузки данных из других файлов не нужен. Просто подставляйте новый путь файла в формулы на расчетном листе с помощью Cells.Replace и сразу получайте результат. Правда, способ с доп. листом может оказаться эффективнее, потому что в этом случае обращение к закрытому файлу производится один раз, а в случае подстановки имени файла в расчетные формулы - много раз.
1
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 11:36
По поводу взятия книг в нужной последовательности.

Можно ещё попробовать обращаться прямо к проводнику Windows и брать из него книги в той последовательности, как книги там находятся.
0
16 / 4 / 0
Регистрация: 01.08.2011
Сообщений: 72
16.01.2013, 12:30  [ТС]
Казанский, Так, это уже намного интереснее. Как в таком случаем мне организовать последовательные перебор путей следования? Тупо все их прописать один за одним или есть более совершенные методы? Поскольку данные подразумевают наращивание со временем.Условно примем, что все фалйлы-источники идентичны в плане организации, имеют по 1 листу, данные не превышают определенный диапазон (столбцы). Различаются только названиями.
Cells.Replace - этого зверя можно загнать в цикл в плане прохода по файлам в определенной папке?

Добавлено через 26 минут
Казанский, В сообщении #29 есть скрипт. Там файлы последовательно перебираются. Так может быть строки с 31 по 39 заменить записью обращения к текущему файлу (поскольку мы уже на нем, то есть путь до него пройден, но он еще не открыт) с выборкой нужного диапазона? Логично? Как тогда будет выглядеть синтаксис? Тогда, возможно и путь писать не надо...

Добавлено через 7 минут
Думаю, проще организовать перебор путей следования в цикле - всего несколько строк получится - думаю - это самое простое и быстрое решение.
0
5472 / 1150 / 50
Регистрация: 15.09.2012
Сообщений: 3,578
16.01.2013, 12:54
Вот такой вариант того, что предложено в сообщении #37 (без использования Replace):
Организация циклической вставки данных

Кликните здесь для просмотра всего текста
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
Sub Procedure_1()
 
    'В константе "myPath" указываем путь папки, где находятся
        'книги Excel, из которых нужно взять данные.
    Const myPath As String = "C:\Users\User\Desktop\Папка"
    
    Dim shActiveSheet As Excel.Worksheet
    Dim myFile As String
    
    'Отключаем всё, что может тормозить работу кода.
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    Application.Calculation = xlCalculationManual
 
    '1. Даём имя "shActiveSheet" активному листу. Через это имя
        'будем обращаться к активному листу.
    Set shActiveSheet = ActiveSheet
    
    '2. Для просмотра всех файлов в папке будем использовать
        'команду "Dir".
    
    '2.1. Помещаем в переменную "myFile" имя первого нужного файла.
    myFile = Dir(myPath & "\*.xlsm")
    
    '2.2. Делаем цикл до тех пор, пока в переменной "myFile"
        'будет имя файла. Файлы берутся в последовательности
        'по дате создания (но это нигде не написано - узнали опытным путём).
    Do While myFile <> ""
 
        '3. Берём данные из файла и помещаем в активный лист.
        shActiveSheet.Range("A1:K1048576").FormulaArray = _
            "='" & myPath & "\[" & myFile & "]Лист1'!A1:K1048576"
        
        '4. Здесь обработка данных в активной книге.
        'К активной книге нужно обращаться по имени "shActiveSheet".
        
        '5. Это взятие следующего имени файла с теми же
            'параметрами, что указаны в пункте 2.1.
        myFile = Dir
    
    Loop
    
    'Включаем то, что отключали.
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    Application.Calculation = xlCalculationAutomatic
    
End Sub
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.01.2013, 12:54

ОРГАНИЗАЦИЯ РАБОТЫ ПРОГРАММ ЦИКЛИЧЕСКОЙ СТРУКТУРЫ
В ЭВМ поступают результаты соревнований по плаванию для трех спортсменов. Выбрать и напечатать лучший результат. Решить задачу для ...

Организация работы программ циклической структуры
Сберегательная касса начисляет 2% годовых (т. е. через год вклад увеличивается на 2% без участия вкладчика). Какой станет сумма (в руб.),...

Макрос сбора и вставки данных
Здравствуйте! Помогите пожалуйста с задачей. В течение всего дня мне в отдельную папку (C:\test) скидывают файлы с таблицей EXCEL(в...

Универсальная функция вставки данных в БД
Добрый вечер! В базе данных находится множество таблиц с различной структурой (уникальный идентефикатор id имеется у всех таблиц)....

Ошибка вставки данных в бд access
Бд access. Соединение настроено, все компоненты на форме есть. Другие запросы выполняются. А этот нет. //Вставка значений в...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru