Добрый день, хочу записать макрос преобразования книги из xls в xlsx. Для того, чтобы изменения во время преобразования вступили в силу и можно было пользоваться всеми возможностями excel предалагает закрыть и заново открыть файл в автоматическом порядке
Вот что записал макрорекодер:
Код
Sub Преобразование()
ActiveWorkbook.SaveAs Filename:= "С:\test.xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False ' 1-й этап - сохранение файла в формате xlsx
Workbooks.Open Filename:= "С:\test.xlsx" ' 2-й этап открытие преобразованного файла
End Sub
Но проблема в том, что файлы могут открывать в разных директориях и иметь разные имена. Макрос запускается из надстройки, т.е. вначале открывается файл с ним производятся манипуляции в т.ч. преобразование формата.
Пытался использовать ACTIVEBOOK.PATH & ACTIVEBOOK.NAME но файл сохраняется с расширением xls, т.к. видимо name включает и расширение Также не знаю как открыть только преобразованный и закрытый файл, во второй части макроса. Поэтому прошу помощи =)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
тогда диалоговое окно по выбору файлов с последующим их открытием и пересохранением в нужное расширение.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок. А в том, чтобы писать программы, работающие при любом количестве ошибок.
Ігор Гончаренко, Я использую надсройку в которой у меня коллекция макросов =) Соотвественно файл открывается вручную а потом через надстройку с ним проводятся манипуляции в т.ч. преобразование формата.
RAN, только начинаю изучать vba, и у меня вопрос, я так понимаю представленный макрос просто добавляет к ActiveWorkbook.FullName ,букву "x" ? Но цель не просто поменять расширение внешне, а преобразовать файл.
В т.ч. для этого макрорекодер указывает FileFormat:=xlOpenXMLWorkbook Например при сохранении файла в формате Excel 97-2003 FileFormat:=xlExcel8
g.tomilin, вы изложили хотелку. Я предложил код. То, что предложенный код не соответствует вашим представлениям о "правильном коде", проблемы не мои. F1 в помощь.
RAN, =)) Спасибо, я же говорю только начинаю изучать. увидел 51 но даже не подумал что в ней зашифрован целый мир
Осталось только закрыть и открыть книгу, т.к. у преобразованной книги остается режим совместимости Пытался через Workbooks.Open Filename:=activebook.Path & activebook.Name выдал ошибку 424
_Igor_61, а где можно помотреть весь перечень таких цифровых комбинаций для VBA?
// основные константы 2007 // These are the main file formats in Excel 2007-2010: // 51 = xlOpenXMLWorkbook (without macro's in 2007-2010, xlsx) // 52 = xlOpenXMLWorkbookMacroEnabled (with or without macro's in 2007-2010, xlsm) // 50 = xlExcel12 (Excel Binary Workbook in 2007-2010 with or without macro's, xlsb) // 56 = xlExcel8 (97-2003 format in Excel 2007-2010, xls)
// 57 = PDF // 60 = xlOpenDocumentSpreadsheet OpenDocument Spreadsheet
Ігор Гончаренко, проблема в том что путь как и имя файла неконстанта. Этот макрос встроен в надстройку - я открываю любой файл и применяю в нему определенный набор изменений в т.ч. преобразование в xlsx. Соответственно нужно что-то вроде open recent file Т.е. происходит сохранение/преобразование затем требуется заново открыть файл - по процедуре close затем open.
g.tomilin написал: путь как и имя файла неконстанта
ну да, ну да. И Вы вообще не знаете куда сохраняли и как назвали файл? А как же Вы тогда кодом его сохраняете, позвольте узнать? Не думаю, что все это происходит при помощи двух неизвестных. Скорее всего это какие-то переменные, которые никто не мешает использовать не только для сохранения, но и для открытия. Чтобы не гадать и не рассказывать, что именно Вы не понимаете в этом процессе - приложите нормальный и реальный код сохранения. И по опыту: чтобы убрать режим совместимости необходимо, чтобы были закрыты ВСЕ файла с расширением xls. Если хоть один будет открыт - режим совместимости будет активен.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Sub SaveAndOpen()
Dim sfn As String, sp As String
'получаем путь к папке активной книги
sp = ActiveWorkbook.Path
'добавляем слеш в конце папки, если его нет
If Right(sp, 1) <> Application.PathSeparator Then
sp = sp & Application.PathSeparator
End If
'запоминаем имя активной книги
sfn = ActiveWorkbook.Name
'если книга не в формате xlsx
If ActiveWorkbook.FileFormat <> 51 Then
sfn = sfn & "x"
ActiveWorkbook.SaveAs sp & sfn, 51
Application.Workbooks.Open sp & sfn, False
End If
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Дмитрий Щербаков, Спасибо за наводку =))) Я только учюсь поэтому ещё мозг не так работает.
Вот код, может конечно не идеальный но работает. добавил к коду
Код
Private Sub CommandButton1_Click()
Dim oldFName$
Dim newFName As String
Dim PathCurrentBook As String
oldFName = ActiveWorkbook.FullName
newFName = oldFName & "x"
PathCurrentBook = ActiveWorkbook.Path
ActiveWorkbook.SaveAs oldFName & "x", 51
Kill oldFName
ActiveWorkbook.Close
Workbooks.Open Filename:=newFName
End Sub
По поводу множества открытых xls тоже спасибо, буду иметь в виду. Но в практике обычно открывается один файл с ним происходят преобразования, он анализируется, после уже открывается другой файл и т.д. Возможно в будущем возникнет жделание группового одномоментного преобразования.
эквивалентно Dim OldName as String есть у Basic такая возможность - указать тип переменной, используя последним символом в имени переменной предусмотренные для этого символы читайте тут
Private Sub CommandButton1_Click() Dim oldFName$ Dim newFName As String- содержит путь в новому файл чтобы потом его открыть Dim PathCurrentBook As String - забыл что FullName содержит ещё и путь поэтому добавлял переменную oldFName = ActiveWorkbook.FullName newFName = oldFName & "x" - записываем новое имя путь PathCurrentBook = ActiveWorkbook.Path - аналогично вышеуказанной ошибке ActiveWorkbook.SaveAs oldFName & "x", 51 Kill oldFName ActiveWorkbook.Close - это для закрытия книги, как я писал для того чтобы снять режим совместимости Workbooks.Open Filename:=newFName- ну и открыть собственно новый файл End Sub
Т.е. если просто пересохранить файл в xlsx то остается режим совместимости, поэтому нужно закрыьт и заново открыть преобразованную книгу.