Макрос 2003 в 2007 как откорректировать
Модератор: Naeel Maqsudov
И был у меня вот такой вот замечательный макрос.
И перешла контора на офис 2007 покупной.
И перестал работать мой замечательный макрос.....
Помогите пожалуйста исправить.
===================================
' Макрос собирает на лист "Сборник" со всех листов "Готовый лист" всех файлов, которые находятся в текущей диретории
Sub sborka()
Dim iFileName$, iPath$
Dim TxtFile As Workbook
Dim OrigWB As Workbook
Set OrigWB = ActiveWorkbook ' Книга в которую будем все собирать
iPath = ThisWorkbook.Path & "\"
iFileName = Dir(iPath & "*.xls")
Set fs = Application.FileSearch
With fs
.LookIn = iPath
.Filename = "*.xls*"
If .Execute(SortBy:=msoSortByFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
For i = 1 To .FoundFiles.Count
If .FoundFiles(i) <> iPath & iFileName Then
Workbooks.Open Filename:=.FoundFiles(i)
Set TxtFile = ActiveWorkbook
lastrow = OrigWB.Worksheets("Сборник").Cells.SpecialCells(xlLastCell).Row
' Сборник - это лист того файла куда собираем все
TxtFile.Worksheets("Готовый лист").Range("A1:AK3000").Copy Destination:=OrigWB.Sheets("Сборник").Cells(lastrow + 1, 1)
' "Готовый лист" - одинаковое название листа во всех файлах "A1:C5" - область которую копируем
Application.DisplayAlerts = False
ActiveWindow.Close
Application.DisplayAlerts = True
End If
Next i
Else
MsgBox "There were no files found."
End If
End With
End Sub
=================================================
Ругается как минимум на Set fs = Application.FileSearch
Что еще не понравится я не знаю...
И перешла контора на офис 2007 покупной.
И перестал работать мой замечательный макрос.....
Помогите пожалуйста исправить.
===================================
' Макрос собирает на лист "Сборник" со всех листов "Готовый лист" всех файлов, которые находятся в текущей диретории
Sub sborka()
Dim iFileName$, iPath$
Dim TxtFile As Workbook
Dim OrigWB As Workbook
Set OrigWB = ActiveWorkbook ' Книга в которую будем все собирать
iPath = ThisWorkbook.Path & "\"
iFileName = Dir(iPath & "*.xls")
Set fs = Application.FileSearch
With fs
.LookIn = iPath
.Filename = "*.xls*"
If .Execute(SortBy:=msoSortByFileName, _
SortOrder:=msoSortOrderAscending) > 0 Then
For i = 1 To .FoundFiles.Count
If .FoundFiles(i) <> iPath & iFileName Then
Workbooks.Open Filename:=.FoundFiles(i)
Set TxtFile = ActiveWorkbook
lastrow = OrigWB.Worksheets("Сборник").Cells.SpecialCells(xlLastCell).Row
' Сборник - это лист того файла куда собираем все
TxtFile.Worksheets("Готовый лист").Range("A1:AK3000").Copy Destination:=OrigWB.Sheets("Сборник").Cells(lastrow + 1, 1)
' "Готовый лист" - одинаковое название листа во всех файлах "A1:C5" - область которую копируем
Application.DisplayAlerts = False
ActiveWindow.Close
Application.DisplayAlerts = True
End If
Next i
Else
MsgBox "There were no files found."
End If
End With
End Sub
=================================================
Ругается как минимум на Set fs = Application.FileSearch
Что еще не понравится я не знаю...
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
Значит нет больше объекта FileSearch )) Думай, чем заменить поиск файлов.
На заказ: VBA, Excel mc-black@yandex.ru
- mc-black
- Сообщения: 250
- Зарегистрирован: 08 май 2008, 16:09
- Откуда: Россия, Нижний Новгород
- Контактная информация:
У меня нет под рукой Office 2007, посмотри объектную модель или в браузере объектов по FileSearch. Может просто переподчинили объект в другое место или заменили чем-то другим похожим. А также в справке по VBA, там обычно указывают изменения новой версии по сравнению с предыдущими.
На заказ: VBA, Excel mc-black@yandex.ru
В Excel 2007 метод FileSearch отключен разработчиками Microsoft.
Для поиска, открытия и обработки файлов, например, в текущей директории, можно использовать, например, такую конструкцию:
Если требуется, добавьте проверку: "не открыт ли текущий файл". И обратите внимание, что в Excel 2007 могут быть и другие расширения. Если нужно обрабатывать все, то можно в строке формирования имени файла "*.xls" заменить на "*.xls*".
Для поиска, открытия и обработки файлов, например, в текущей директории, можно использовать, например, такую конструкцию:
Код: Выделить всё
Dim iPath As String, iFileName As String, TxtFile As Workbook
iPath = CurDir & Application.PathSeparator
iFileName = Dir(iPath & "*.xls")
Do While iFileName <> ""
If iFileName <> ThisWorkbook.Name Then
Set TxtFile = Workbooks.Open(Filename:=iPath & iFileName)
'
'...
'
End If
iFileName = Dir
Loop
Спасибо, SAS888
Ваш вариант работает отлично!
Правда, как выяснилось опытным путем, он у меня почему-то
обрабатывает файлы в
C:\Documents and Settings\Username\Мои документы\
В принципе не беда, но хотелось бы понять - может значение для переменной пути в какой-то момент равно системному пути винды или Excel?
Ваш вариант работает отлично!
Правда, как выяснилось опытным путем, он у меня почему-то
обрабатывает файлы в
C:\Documents and Settings\Username\Мои документы\
В принципе не беда, но хотелось бы понять - может значение для переменной пути в какой-то момент равно системному пути винды или Excel?
Чтобы не "париться", замените CurDir на ThisWorkbook.Path
Испытал работающий макрос в "полевых", а не "лабораторных" условиях.
Интересная штука получается. У меня все файлы (и куда собираем и откуда собираем) в office 2003 с расширением xls. Собираю в среде Office 2007. Все работает нормально, пока количество строк в собираемом файле не достигает критической отметки (в моем случае 63 000). Это предел, поскольку следующая итерация будет пытаться впихнуть более 3 тыс, потому винда и выдает ошибки вроде "несовпадения диапазонов исходника и назначения". Решаю, что нужно файл-назначение с макросом сохранить сперва как XLSX, точнее XLSM, и тогда должно сработать. Но теперь уже макрос при запуске ругается на Subscript out of range. Ну видимо это потому что в макросе iFileName = Dir(iPath & "*.xls") а у нас один файл (результирующий) XLSM.
Наверно можно все файлы - исходники конвертануть чем-то пакетно в xlsm, в макросе вместо xls написать iFileName = Dir(iPath & "*.xlsm"), и все заработает.
Но может есть более красивое решение? Дело в том, что каждый раз собираемые файлы приходят от людей, работающих в 2003 офисе. И их видимо придется сперва конвертировать чем-то. Если других вариантов нет, то конечно буду искать конвертер (причем xls2xlsM, именно xlsM - вы не знаете чем можно конвертнуть пакетно?).
Интересная штука получается. У меня все файлы (и куда собираем и откуда собираем) в office 2003 с расширением xls. Собираю в среде Office 2007. Все работает нормально, пока количество строк в собираемом файле не достигает критической отметки (в моем случае 63 000). Это предел, поскольку следующая итерация будет пытаться впихнуть более 3 тыс, потому винда и выдает ошибки вроде "несовпадения диапазонов исходника и назначения". Решаю, что нужно файл-назначение с макросом сохранить сперва как XLSX, точнее XLSM, и тогда должно сработать. Но теперь уже макрос при запуске ругается на Subscript out of range. Ну видимо это потому что в макросе iFileName = Dir(iPath & "*.xls") а у нас один файл (результирующий) XLSM.
Наверно можно все файлы - исходники конвертануть чем-то пакетно в xlsm, в макросе вместо xls написать iFileName = Dir(iPath & "*.xlsm"), и все заработает.
Но может есть более красивое решение? Дело в том, что каждый раз собираемые файлы приходят от людей, работающих в 2003 офисе. И их видимо придется сперва конвертировать чем-то. Если других вариантов нет, то конечно буду искать конвертер (причем xls2xlsM, именно xlsM - вы не знаете чем можно конвертнуть пакетно?).
Не знаю правильно ли я понял, но попробуйте этоhttp://www.softinterface.com/Convert-XL ... t-XLSM.htmvadim245 писал(а):именно xlsM - вы не знаете чем можно конвертнуть пакетно?).
Или это
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вот здесь тоже есть кое что...
Здесь можно поискать тоже
Не знаю поможет или нет.
Для нас нет непреодолимых трудностей, есть только трудности, которые нам лень преодолевать
))

А что, замена "*.xls" на "*.xls*", которую я предвидел в самом начале, в строке кода iFileName = Dir(iPath & "*.xls") не помогает?в макросе iFileName = Dir(iPath & "*.xls") а у нас один файл (результирующий) XLSM.