Страница: 1 |
|
Вопрос: Выборка из неопределённого количества xsl файлов
|
Добавлено: 05.06.06 15:05
|
|
Автор вопроса: roman.dorosh | ICQ: 98700332
|
Доброго дня!
Подскажите как реализовать:
Есть каталог, в который каждый день складываются файлы "zdDDMMYY.xls" (1 файл в день). Необходимо создать месячные отчёты на основании данных из этих суточных файлов.
Имея за плечами 3-х дневный опыт в VBA решил сделать так:
1. Считаем количество файлов в каталоге, указаном в ThisWorkbook.Worksheets("conf").Range("A1") (к примеру "C:\TEMP"), где месяц равен ThisWorkbook.Worksheets("UNITS").Range("D1"), и год
ThisWorkbook.Worksheets("UNITS").Range("E1"). В этих ячейках указываем MM, YY для периода выборки.
2. Динамически создаём связи в месячном отчёте к найденым именам файлов и получаем таблицу из (i = количество найденых файлов) ячеек
Вопрос:
1. Оптимально ли это решение
2. Если да, то как в выражении
"='" + .FoundFiles(i) + "'!AC6"
указать ещё и лист для связи
________
With Application.FileSearch
.NewSearch
.LookIn = ThisWorkbook.Worksheets("conf").Range("A1")
.SearchSubFolders = False
.Filename = "zd??" + ThisWorkbook.Worksheets("UNITS").Range("D1") + ThisWorkbook.Worksheets("UNITS").Range("E1")
.MatchAllWordForms = False
.FileType = msoFileTypeAllFiles
If .Execute() > 0 Then
MsgBox "За указанный период найдено " & .FoundFiles.Count & _
" файлов."
For i = 1 To .FoundFiles.Count
ThisWorkbook.Worksheets("UNITS").Cells(2, i + 1) = i
ThisWorkbook.Worksheets("UNITS").Cells(3, i + 1) = "='" + .FoundFiles(i) + "'!AC6"
Next i
Else
MsgBox "Нет Данных!"
End If
End With
________
Заранее спасибо,
Роман Дорош
Ответить
|
Номер ответа: 1 Автор ответа: Незнайка
Вопросов: 7 Ответов: 188
|
Профиль | | #1
|
Добавлено: 05.06.06 20:15
|
Вообщем так...как я понял:
1. В каталоге храняться файлы
2. Их количество всегда разное (заранее неизвестно)
3. Имена файлов имеют четкую маску (типа дата)
Нужно сделать:
1. Необходимо выбирать файлы за некий период
2. Из определенных листов , в определенных диазазонах необходимо брать данные и производить их агрегирование в заданном (выбранном Вами) файле
Что я не понял из вопроса:
1. Все ли листы файлов в каталоге должны обрабатываться и если не все - то по какому принципу выбираются значимые листы?
2. Всегда ли диапазон задан четко
"'!AC6"
или он тоже может быть плавающим? Если плавающим то по какому принципу должен определяться значимый диапазон?
3. О большом ли диапазоне идет речь? То есть если в файлах на нескольких листах нужно 10-15 ячеек, то будем использовать один метод, еже ли диапазон большой - то будем действовать по другому.
4. Какого рода агрегирование данных предполагается (сумммирование, разность, произведение)
Предложение:
1. Желательно на мыло выслать образец типичного файла исходника (которых типа много) и файл с итоговой (нарисованной пусть даже вручную) итоговой формой - типа что должно быть на выходе.
А пока (при таких Ваших данных) ничего путного и именно конкретного посоветовать не могу.
Ответить
|
Номер ответа: 3 Автор ответа: Незнайка
Вопросов: 7 Ответов: 188
|
Профиль | | #3
|
Добавлено: 06.06.06 11:39
|
Sub СводкаДанных()
'Подключи библиотеку к своему проекту (в окне редактора VBA Меню: Tools \ References):
'Microsoft Scripting Runtime
Dim mFileSystemObject As FileSystemObject, mFolder As Folder, mFiles As Files, mFile As File
Dim ИсходныйКаталог As String, ДатаНачало As Date, ДатаКонец As Date, ДатаФайла As Date
Dim Столбец As Long, Строка As Long
'объявляем объект для работы с файлами
Set mFileSystemObject = New FileSystemObject
'подтверждение начала процедуры
If MsgBox(Prompt:="Вы уверены, что необходимо выполнить агрегацию данных?" & vbCr _
& "Отменить действие будет невозможно!", Buttons:=vbQuestion + vbYesNoCancel + vbDefaultButton2) <> vbYes Then Exit Sub
'задаем каталог, где лежат файлы
ИсходныйКаталог = "C:\Исходный"
'задаем период
ДатаНачало = CDate("01.01.2006"
ДатаКонец = CDate("31.12.2006"
'с какого столбца и стороки начинать вывод
Столбец = 2: Строка = 2
'проверка наличия каталога
If mFileSystemObject.FolderExists(ИсходныйКаталог) = False Then MsgBox "Исходного каталога " & ИсходныйКаталог & " не существует!": Exit Sub
'получаем ссылку на каталог
Set mFolder = mFileSystemObject.GetFolder(ИсходныйКаталог)
'получаем ссылку на файлы каталога
Set mFiles = mFolder.Files
'бежим по всем файлам в каталоге
For Each mFile In mFiles
'получаем дату файла из названия
ДатаФайла = CDate( Mid$(mFile. Name, 3, 2) & "." & Mid$(mFile. Name, 5, 2) & "." & Mid$(mFile. Name, 7, 2))
'проверяем - находится ли в заданном периоде
If ДатаФайла >= ДатаНачало And ДатаФайла <= ДатаКонец Then
'пишем дату файла из которого взяли данные
'выводится на активный лист
Cells(Строка - 1, Столбец) = ДатаФайла
'пишем само значчение из указанного Вами диапазона "AC6" с "Лист1"
'выводится на активный лист
Cells(Строка, Столбец) = _
ExecuteExcel4Macro(" '" & mFile.ParentFolder & "\[" & mFile.Name & "]" & "Лист1" & "'!" & _
Range("AC6" .Address(, , xlR1C1))
'Если необходимо, здесь можно написать свои вычисления:
'Например получить данные не только из ячейки "AC6", но из других ячеек.
'ВАЖНО!!! ExecuteExcel4Macro возьмет только значение из одной ячейки -
'Бесполезно задавать диапазон из двух и более ячеек.
'Если необходим диапазон используй ExecuteExcel4Macro в цикле. Но учти метод ExecuteExcel4Macro - МЕДЛЕННЫЙ!!!
'Но когда ячеек менее 500 - то медлительность практически не ощущается!
Столбец = Столбец + 1
End If
Next mFile
End Sub
Ответить
|
Страница: 1 |
Поиск по форуму