Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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
________

Заранее спасибо,
Роман Дорош

Ответить

  Ответы Всего ответов: 5  

Номер ответа: 1
Автор ответа:
 Незнайка



Вопросов: 7
Ответов: 188
 Профиль | | #1 Добавлено: 05.06.06 20:15
Вообщем так...как я понял:

1. В каталоге храняться файлы
2. Их количество всегда разное (заранее неизвестно)
3. Имена файлов имеют четкую маску (типа дата)

Нужно сделать:

1. Необходимо выбирать файлы за некий период
2. Из определенных листов , в определенных диазазонах необходимо брать данные и производить их агрегирование в заданном (выбранном Вами) файле

Что я не понял из вопроса:

1. Все ли листы файлов в каталоге должны обрабатываться и если не все - то по какому принципу выбираются значимые листы?
2. Всегда ли диапазон задан четко
"'!AC6"

или он тоже может быть плавающим? Если плавающим то по какому принципу должен определяться значимый диапазон?
3. О большом ли диапазоне идет речь? То есть если в файлах на нескольких листах нужно 10-15 ячеек, то будем использовать один метод, еже ли диапазон большой - то будем действовать по другому.
4. Какого рода агрегирование данных предполагается (сумммирование, разность, произведение)

Предложение:
1. Желательно на мыло выслать образец типичного файла исходника (которых типа много) и файл с итоговой (нарисованной пусть даже вручную) итоговой формой - типа что должно быть на выходе.

А пока (при таких Ваших данных) ничего путного и именно конкретного посоветовать не могу.

Ответить

Номер ответа: 2
Автор ответа:
 roman.dorosh



ICQ: 98700332 

Вопросов: 2
Ответов: 5
 Профиль | | #2 Добавлено: 06.06.06 10:00
Уточнения:
1. Только первый лист ("Лист1";)
указать лист в выражении
ThisWorkbook.Worksheets("UNITS";).Cells(3, i + 1).Value = "='" + .FoundFiles(i) + "'!AC6"
у меня не вышло, в приведённом примере приходится при обновлении указывать лист для каждого внешнего файла.
Такое выражение не работает (а хотелось бы):
ThisWorkbook.Worksheets("UNITS";).Cells(3, i + 1).Value = "='" + .FoundFiles(i) + "Лист1'!AC6"

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

3. фрагментированый диапазон по 10-15 ячеек в фрагменте. Все ячейки в одном поле (столбце).
В процессе написания пришла мысль - может копировать весь столбец из суточных файлов на скытый лист месячного а потом уже разбирать данные...

4. Суммирование.

Спасибо за помощь и прошу прощения за орфографию (родной украинский)

Ответить

Номер ответа: 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

Ответить

Номер ответа: 4
Автор ответа:
 roman.dorosh



ICQ: 98700332 

Вопросов: 2
Ответов: 5
 Профиль | | #4 Добавлено: 06.06.06 12:46
Хм, работает :)
теперь буду разбираться кАк оно работает.
Большое спасибо за практически готовое решение!

Подскажите пожалуйста полезную документацию, справочники по даной тематике

Спасибо ещё раз!

С уважением, Роман.


Ответить

Номер ответа: 5
Автор ответа:
 Незнайка



Вопросов: 7
Ответов: 188
 Профиль | | #5 Добавлено: 06.06.06 13:17
Ну много сайтов по VB, на них и разделы по VBA есть. Думаю....Яндекс.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам