Макрос 2003 в 2007 как откорректировать

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

И был у меня вот такой вот замечательный макрос.
И перешла контора на офис 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
vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

Сурово :-)
Аватара пользователя
mc-black
Сообщения: 250
Зарегистрирован: 08 май 2008, 16:09
Откуда: Россия, Нижний Новгород
Контактная информация:

У меня нет под рукой Office 2007, посмотри объектную модель или в браузере объектов по FileSearch. Может просто переподчинили объект в другое место или заменили чем-то другим похожим. А также в справке по VBA, там обычно указывают изменения новой версии по сравнению с предыдущими.
На заказ: VBA, Excel mc-black@yandex.ru
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

В Excel 2007 метод FileSearch отключен разработчиками Microsoft.
Для поиска, открытия и обработки файлов, например, в текущей директории, можно использовать, например, такую конструкцию:

Код: Выделить всё

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
Если требуется, добавьте проверку: "не открыт ли текущий файл". И обратите внимание, что в Excel 2007 могут быть и другие расширения. Если нужно обрабатывать все, то можно в строке формирования имени файла "*.xls" заменить на "*.xls*".
vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

Спасибо, SAS888
Ваш вариант работает отлично!
Правда, как выяснилось опытным путем, он у меня почему-то
обрабатывает файлы в
C:\Documents and Settings\Username\Мои документы\
В принципе не беда, но хотелось бы понять - может значение для переменной пути в какой-то момент равно системному пути винды или Excel?
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

Чтобы не "париться", замените CurDir на ThisWorkbook.Path
vadim245
Сообщения: 100
Зарегистрирован: 11 май 2007, 15:46

Испытал работающий макрос в "полевых", а не "лабораторных" условиях.
Интересная штука получается. У меня все файлы (и куда собираем и откуда собираем) в 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 - вы не знаете чем можно конвертнуть пакетно?).
Аватара пользователя
Mint86
Сообщения: 127
Зарегистрирован: 04 мар 2008, 11:47

vadim245 писал(а):именно xlsM - вы не знаете чем можно конвертнуть пакетно?).
Не знаю правильно ли я понял, но попробуйте этоhttp://www.softinterface.com/Convert-XL ... t-XLSM.htm

Или это
--------------------------------------------------------------------------------
Добавлено сообщение
--------------------------------------------------------------------------------
Вот здесь тоже есть кое что...
Здесь можно поискать тоже
Не знаю поможет или нет.
Для нас нет непреодолимых трудностей, есть только трудности, которые нам лень преодолевать :)))
SAS888
Сообщения: 156
Зарегистрирован: 16 янв 2008, 08:28

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