Страница: 1 |
Страница: 1 |
Вопрос: Консолидация
Добавлено: 26.05.06 14:44
Автор вопроса: SvetlanaL | ICQ: 229-356-346
Я консолидирую несколько книг с несколькими листами. Прописываю пути и мена все жёстко. Хотелось бы универсальности. Помогите!!!
Так выглядит фрагмент рабочего макроса.
Worksheets("0503121").Range("d14").Consolidate Sources:=Array( _
"'C:\SVOD\[filial1.xls]0503121'!R14C4:R32C6", "'C:\svod\[filial2.xls]0503121'!R14C4:R32C6", "'C:\svod\[filial3.xls]0503121'!R14C4:R32C6" _...
Как передать имена и пути через параметр?
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Незнайка
Вопросов: 7
Ответов: 188
Профиль | | #1
Добавлено: 26.05.06 15:55
Формируй свою строку:
Из текстовой переменной.
А вот как получить в переменную решать тебе (есть наверное не меньше 1001 способа). Например:
1. Перебирай все файлы в заданной папочке
2. Заполни нужными именами файлов и диапазонов обычный .txt файлик и бери оттуда.
3. На любом листике книги создай в столбце список файлов и перебирай его.
Вот собственно так...
Номер ответа: 2
Автор ответа:
SvetlanaL
ICQ: 229-356-346
Вопросов: 8
Ответов: 20
Профиль | | #2
Добавлено: 27.05.06 21:21
Это понятно. У меня проблема с синтаксисом.
Номер ответа: 3
Автор ответа:
Незнайка
Вопросов: 7
Ответов: 188
Профиль | | #3
Добавлено: 28.05.06 11:03
Что именно ты незнаешь как сделать?
Номер ответа: 4
Автор ответа:
SvetlanaL
ICQ: 229-356-346
Вопросов: 8
Ответов: 20
Профиль | | #4
Добавлено: 28.05.06 14:42
Например, я получила в параметр путь и имена файлов C:\SVOD\filial1.xls,C:\SVOD\filial2.xls... ,
отдельно имена листов 0503121, 0503127...
В прежнем варианте:
"'C:\SVOD\[filial1.xls]0503121'!R14C4:R32C6", "'C:\svod\[filial2.xls]0503121'!R14C4:R32C6", "'C:\svod\[filial3.xls]0503121'!R14C4:R32C6" _...
Как записать то же самое, но через параметр?
Номер ответа: 5
Автор ответа:
Незнайка
Вопросов: 7
Ответов: 188
Профиль | | #5
Добавлено: 28.05.06 16:49
Вот что нужно сделать:
Подключи библиотеки (Tools\References):
1. Microsoft ActiveX Data Objects 2.5 Library
2. Microsoft Scripting Runtime
Первая нужна для определения имен листов в файле, не открывая при этом сам файл (чтобы работало быстрее).
Вторая нужна для перебора файлов в заданном каталоге.
Дальше создай стандартный модуль и скопируй код:
Dim mFileSystemObject As FileSystemObject, mFolder As Folder, mFiles As Files, mFile As File
Dim mConnection As ADODB.Connection, mRecordset As ADODB.Recordset, mConnectionString As String
Dim mPath As String, StrokaKonsolidasia As String
Set mFileSystemObject = New FileSystemObject
Set mConnection = New ADODB.Connection
mPath = "C:\SVOD" 'указанный в вопросе каталог с исходными файлами
Set mFolder = mFileSystemObject.GetFolder(mPath)
Set mFiles = mFolder.Files
For Each mFile In mFiles
mConnectionString = "RIVER={Microsoft Excel Driver (*.xls)};ReadOnly=1BQ=" & mFile.Path
mConnection.Open mConnectionString
Set mRecordset = mConnection.OpenSchema(adSchemaTables)
Do Until mRecordset.EOF
If mRecordset!TABLE_TYPE = "SYSTEM TABLE" Then
If Len(StrokaKonsolidasia) > 0 Then
StrokaKonsolidasia = StrokaKonsolidasia & "," & _
"'" & mFile.ParentFolder & "\[" & mFile.Name & "]" & _
Left$(mRecordset!TABLE_NAME, Len(mRecordset!TABLE_NAME) - 1) & _
"'!R14C4:R32C6" 'указанный в вопросе диапазон
Else
StrokaKonsolidasia = StrokaKonsolidasia & _
"'" & mFile.ParentFolder & "\[" & mFile.Name & "]" & _
Left$(mRecordset!TABLE_NAME, Len(mRecordset!TABLE_NAME) - 1) & _
"'!R14C4:R32C6" 'указанный в вопросе диапазон
End If
End If
mRecordset.MoveNext
Loop
mRecordset.Close
mConnection.Close
Next mFile
Set mRecordset = Nothing
Set mConnection = Nothing
Set mFileSystemObject = Nothing
'выводится на любой активный лист, любой активной книги, начиная с выделенной ячейки
Selection.Consolidate Sources:=Split(StrokaKonsolidasia, ",", Function:=xlSum
End Sub
Всё. Пользуйся.
Номер ответа: 6
Автор ответа:
SvetlanaL
ICQ: 229-356-346
Вопросов: 8
Ответов: 20
Профиль | | #6
Добавлено: 29.05.06 08:11
Спасибо за помощь.
Номер ответа: 7
Автор ответа:
Fever
Вопросов: 60
Ответов: 808
Профиль | | #7
Добавлено: 31.05.06 16:44
Ну ни фига себе НЕЗНАЙКА!
Номер ответа: 8
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #8
Добавлено: 22.11.06 10:02
Народ! у меня немного другая ситуация, но в принципе похожая. Но вот в чем проблема: данный код не работает, если в указанной папке находятся файлы, которые excel в принципе открыть не может и вот на первом же таком файле он спотыкается. Как сделать, чтобы код
For Each mFile In mFiles
....
выполнялся только для файлов XLS (а совсем хорошо, если для txt)?
Номер ответа: 9
Автор ответа:
LonerWanderer
Вопросов: 18
Ответов: 66
Профиль | | #9
Добавлено: 22.11.06 10:28
Вопрос снимаю. Нашел в хелпе вот такой небольшой код. С небольшими переделками модно прикрутить и сюда.
Set fs = Application.FileSearch
With fs
.LookIn = "C:\My Documents"
.FileName = "cmd*"
If .Execute(SortBy:=msoSortbyFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
MsgBox "There were " & .FoundFiles.Count & _
" file(s) found."
For i = 1 To .FoundFiles.Count
MsgBox .FoundFiles(i)
Next i
Else
MsgBox "There were no files found."
End If
End With