Страницы: 1
RSS
Преобразование файла из xls в xlsx - макрос
 
Добрый день, хочу записать макрос преобразования книги из 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 включает и расширение
Также не знаю как открыть только преобразованный и закрытый файл, во второй части макроса.
Поэтому прошу помощи =)
Изменено: g.tomilin - 05.02.2018 17:27:19
Что такое всё?
 
g.tomilin, гляньте тут и тут
Изменено: Jack Famous - 05.02.2018 12:24:12
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Но задача в том, что файлы могут открывать в разных директориях и иметь разные имена
каким способом планируете выбирать файлы?
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
тогда диалоговое окно по выбору файлов с последующим их открытием и пересохранением в нужное расширение.
Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.
 
Ігор Гончаренко,
Я использую надсройку в которой у меня коллекция макросов =)
Соотвественно файл открывается вручную а потом через надстройку с ним проводятся манипуляции в т.ч. преобразование формата.
Что такое всё?
 
Цитата
g.tomilin написал:
Соотвественно файл открывается вручную а потом через надстройку
Тады в надстройку код
Код
Sub qq()
    Dim oldFName$
    oldFName = ActiveWorkbook.FullName
    ActiveWorkbook.SaveAs oldFName & "x", 51
    Kill oldFName
End Sub
 
RAN,  только начинаю изучать vba, и у меня вопрос, я так понимаю представленный макрос просто добавляет к ActiveWorkbook.FullName ,букву "x" ?
Но цель не просто поменять расширение внешне, а преобразовать файл.

В т.ч. для этого макрорекодер указывает FileFormat:=xlOpenXMLWorkbook
Например при сохранении файла в формате Excel 97-2003 FileFormat:=xlExcel8
Что такое всё?
 
g.tomilin, вы изложили хотелку.
Я предложил код.
То, что предложенный код не соответствует вашим представлениям о "правильном коде", проблемы не мои.
F1 в помощь.
 
Цитата
g.tomilin написал:
цель не просто поменять расширение внешне, а преобразовать файл.
Внимательно посмотрите на код от RAN, а потом прочитайте это:
Цитата
These are the main file formats in Excel 2007-2010:
51 = xlOpenXMLWorkbook (without macro's in 2007-2010, xlsx)
 
RAN, =)) Спасибо, я же говорю только начинаю изучать. увидел 51 но даже не подумал что в ней зашифрован целый мир  :oops:

Осталось только закрыть и открыть книгу, т.к. у преобразованной книги остается режим совместимости
Пытался через Workbooks.Open Filename:=activebook.Path & activebook.Name
выдал ошибку 424

_Igor_61, а где можно помотреть весь перечень таких цифровых комбинаций для VBA?
Изменено: g.tomilin - 06.02.2018 09:16:03
Что такое всё?
 
Цитата
RAN написал:
F1 в помощь.
:)
 
Посмотреть наверное где-то в справке или в интернете. Я об этом от Юрия М. узнал в одной из тем:
Цитата
// константы форматов 2003
//  xlCSVWindows = 23;
//  xlDBF2 = 7;
//  xlDBF3 = 8;
//  xlDBF4 = 11;
//  xlDIF = 9;
//  xlExcel9795 = 43;
//  xlTextWindows = 20;
//  xlUnicodeText = 42;
//  xlWebArchive = 45;
//  xlXMLSpreadsheet = 46;
//  xlXMLData = 47;

// основные константы 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
 
RAN, нашел кодировки форматов, увидел возможные варианты причин ошибки, но к сожалению через ф1 не понять как закрыть и открыть книгу =)
Изменено: g.tomilin - 06.02.2018 10:19:19
Что такое всё?
 
_Igor_61, да я в справке просто 51 набрал и он выдал -
Скрытый текст
Что такое всё?
 
Есть ещё какие-нибудь предложения по вопросу? =)
Как закрыть а затем открыть книгу?
Что такое всё?
 
Цитата
_Igor_61 написал:
Посмотреть наверное где-то в справке или в интернете. Я об этом от Юрия М. узнал в одной из тем:
Тут.
Владимир
 
так:
workbook.close false
...
workbooks.open("полный путь к файлу")
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, проблема в том что путь как и имя файла неконстанта.
Этот макрос встроен в надстройку - я открываю любой файл и применяю в нему определенный набор изменений в т.ч. преобразование в 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 тоже спасибо, буду иметь в виду. Но в практике обычно открывается один файл с ним происходят преобразования, он анализируется, после уже открывается другой файл и т.д.
Возможно в будущем возникнет жделание группового одномоментного преобразования.

Всем спасибо (особоенно RAN, Ігор Гончаренко, Дмитрий Щербаков, )! Решение найдено.

ps Дмитрий Щербаков протестирую ваш код.

Дмитрий Щербаков, с if красивее и удобнее, спасибо =)
Изменено: g.tomilin - 07.02.2018 11:09:52
Что такое всё?
 
RAN,
подскажите пожалуйста что значит значек $ в
Код
Dim oldFName$
Что такое всё?
 
эквивалентно Dim OldName as String
есть у Basic такая возможность - указать тип переменной, используя последним символом в имени переменной предусмотренные для этого символы
читайте тут
Изменено: Ігор Гончаренко - 07.02.2018 13:06:19
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко,Спасибо за объяснение все понятно.
Это делается для краткости?
Что такое всё?
 
Именно.

PS
Цитата
g.tomilin написал:
добавил к коду
Не могли бы вы прокомментировать, что делают, и зачем сделаны добавки?
Изменено: RAN - 07.02.2018 18:53:47
 
RAN, не верно скопировал

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 то остается режим совместимости, поэтому нужно закрыьт и заново открыть преобразованную книгу.
Изменено: g.tomilin - 08.02.2018 09:38:01
Что такое всё?
Страницы: 1
Наверх