Vba excel сохранение файла в формате

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#1

05.02.2018 12:20:04

Добрый день, хочу записать макрос преобразования книги из 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.tomilin05.02.2018 17:27:19

Что такое всё?

 

Jack Famous

Пользователь

Сообщений: 10848
Регистрация: 07.11.2014

OS: Win 8.1 Корп. x64 | Excel 2016 x64: | Browser: Chrome

Изменено: Jack Famous05.02.2018 12:24:12

Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#3

05.02.2018 12:43:22

Цитата
Но задача в том, что файлы могут открывать в разных директориях и иметь разные имена

каким способом планируете выбирать файлы?

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Alemox

Пользователь

Сообщений: 2183
Регистрация: 25.02.2013

тогда диалоговое окно по выбору файлов с последующим их открытием и пересохранением в нужное расширение.

Мастерство программиста не в том, чтобы писать программы, работающие без ошибок.
А в том, чтобы писать программы, работающие при любом количестве ошибок.

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Ігор Гончаренко,
Я использую надсройку в которой у меня коллекция макросов =)
Соотвественно файл открывается вручную а потом через надстройку с ним проводятся манипуляции в т.ч. преобразование формата.

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#6

05.02.2018 17:20:22

Цитата
g.tomilin написал:
Соотвественно файл открывается вручную а потом через надстройку

Тады в надстройку код

Код
Sub qq()
    Dim oldFName$
    oldFName = ActiveWorkbook.FullName
    ActiveWorkbook.SaveAs oldFName & "x", 51
    Kill oldFName
End Sub
 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

RAN,  только начинаю изучать vba, и у меня вопрос, я так понимаю представленный макрос просто добавляет к ActiveWorkbook.FullName ,букву «x» ?
Но цель не просто поменять расширение внешне, а преобразовать файл.

В т.ч. для этого макрорекодер указывает FileFormat:=xlOpenXMLWorkbook
Например при сохранении файла в формате Excel 97-2003 FileFormat:=xlExcel8

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

g.tomilin, вы изложили хотелку.
Я предложил код.
То, что предложенный код не соответствует вашим представлениям о «правильном коде», проблемы не мои.
F1 в помощь.

 

_Igor_61

Пользователь

Сообщений: 3007
Регистрация: 18.07.2016

#9

06.02.2018 07:45:29

Цитата
g.tomilin написал:
цель не просто поменять расширение внешне, а преобразовать файл.

Внимательно посмотрите на код от RAN, а потом прочитайте это:

Цитата
These are the main file formats in Excel 2007-2010:
51 = xlOpenXMLWorkbook (without macro’s in 2007-2010, xlsx)
 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

RAN, =)) Спасибо, я же говорю только начинаю изучать. увидел 51 но даже не подумал что в ней зашифрован целый мир  :oops:

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

_Igor_61, а где можно помотреть весь перечень таких цифровых комбинаций для VBA?

Изменено: g.tomilin06.02.2018 09:16:03

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#11

06.02.2018 09:02:58

Цитата
RAN написал:
F1 в помощь.

:)

 

_Igor_61

Пользователь

Сообщений: 3007
Регистрация: 18.07.2016

#12

06.02.2018 09:35:31

Посмотреть наверное где-то в справке или в интернете. Я об этом от Юрия М. узнал в одной из тем:

Цитата
// константы форматов 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

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

RAN, нашел кодировки форматов, увидел возможные варианты причин ошибки, но к сожалению через ф1 не понять как закрыть и открыть книгу =)

Изменено: g.tomilin06.02.2018 10:19:19

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#14

06.02.2018 10:21:34

_Igor_61, да я в справке просто 51 набрал и он выдал —

Скрытый текст

Что такое всё?

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Есть ещё какие-нибудь предложения по вопросу? =)
Как закрыть а затем открыть книгу?

 

sokol92

Пользователь

Сообщений: 4445
Регистрация: 10.09.2017

#16

06.02.2018 17:31:04

Цитата
_Igor_61 написал:
Посмотреть наверное где-то в справке или в интернете. Я об этом от Юрия М. узнал в одной из тем:

Тут

.

Владимир

 

так:
workbook.close false

workbooks.open(«полный путь к файлу»)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Ігор Гончаренко, проблема в том что путь как и имя файла неконстанта.
Этот макрос встроен в надстройку — я открываю любой файл и применяю в нему определенный набор изменений в т.ч. преобразование в xlsx.
Соответственно нужно что-то вроде open recent file
Т.е. происходит сохранение/преобразование затем требуется заново открыть файл — по процедуре close затем open.

 

Дмитрий Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#19

07.02.2018 09:27:20

Цитата
g.tomilin написал:
путь как и имя файла неконстанта

ну да, ну да. И Вы вообще не знаете куда сохраняли и как назвали файл? А как же Вы тогда кодом его сохраняете, позвольте узнать? Не думаю, что все это происходит при помощи двух неизвестных. Скорее всего это какие-то переменные, которые никто не мешает использовать не только для сохранения, но и для открытия.
Чтобы не гадать и не рассказывать, что именно Вы не понимаете в этом процессе — приложите нормальный и реальный код сохранения.
И по опыту: чтобы убрать режим совместимости необходимо, чтобы были закрыты ВСЕ файла с расширением xls. Если хоть один будет открыт — режим совместимости будет активен.

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

Дмитрий Щербаков

Пользователь

Сообщений: 14182
Регистрация: 15.09.2012

Профессиональная разработка приложений для MS Office

#20

07.02.2018 09:39:38

Вот, накидал код — должен работать:

Код
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

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы…

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#21

07.02.2018 09:51:40

Дмитрий Щербаков,
Спасибо за наводку =))) Я только учюсь поэтому ещё мозг не так работает.

Вот код, может конечно не идеальный но работает. добавил к коду

Код
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.tomilin07.02.2018 11:09:52

Что такое всё?

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#22

07.02.2018 11:28:36

RAN,
подскажите пожалуйста что значит значек $ в

Код
Dim oldFName$

Что такое всё?

 

эквивалентно Dim OldName as String
есть у Basic такая возможность — указать тип переменной, используя последним символом в имени переменной предусмотренные для этого символы
читайте

тут

Изменено: Ігор Гончаренко07.02.2018 13:06:19

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

Ігор Гончаренко,Спасибо за объяснение все понятно.
Это делается для краткости?

 

RAN

Пользователь

Сообщений: 7091
Регистрация: 21.12.2012

#25

07.02.2018 18:47:35

Именно.

PS

Цитата
g.tomilin написал:
добавил к коду

Не могли бы вы прокомментировать, что делают, и зачем сделаны добавки?

Изменено: RAN07.02.2018 18:53:47

 

g.tomilin

Пользователь

Сообщений: 36
Регистрация: 16.12.2016

#26

08.02.2018 09:15:57

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.tomilin08.02.2018 09:38:01

Что такое всё?

Данный макрос позволяет быстро (одним нажатием кнопки) пересохранить текущий файл Excel в другом формате.

Например, вы работаете с книгой Excel в формате Excel 97-2003 (расширение XLS), и вам понадобилось преобразовать этот файл в формат «двоичная книга Excel» (расширение XLSB)

Для чего это нужно? К примеру, файлы в формате XLSB занимают намного меньше места на диске, и не будут открываться в Excel 2007 и новее в режиме совместимости (еслои вам вдруг перестало хватать 65 тысяч строк)

Поместите этот макрос в любую из подключенных надстроек Excel (или в личную книгу макросов Personal.xlsb), и назначьте этот макрос кнопке на панели быстрого вызова:

Sub СохранениеВФорматеXLSB()
    On Error Resume Next: Err.Clear
 
    ' макрос работает только в Excel 2007 (и более новых версиях)
    If Val(Application.Version) < 12 Then Exit Sub
 
    ' получаем полный путь к текущему файлу Excel
   oldName$ = ActiveWorkbook.FullName
 
    ' выход, если файл уже в нужном формате (XLSB)
   If UCase$(oldName$) Like "*.XLSB" Then Exit Sub
 
    ' формируем новое имя файла (меняем расширение)
   newName$ = Left(oldName$, InStrRev(oldName$, ".")) & "xlsb"
 
    ' сохраняем файл под новым именем в формате XLSB
   ActiveWorkbook.SaveAs newName$, xlExcel12
 
    ' удаляем прежний файл (в старом формате)
   If Err = 0 Then Kill oldName$
End Sub


Аналогично, если преобразовывать текущий файл в формат XLSX (не поддерживающий макросы), можно быстро и надёжно избавиться от всех макросов, имеющихся в файле:

Sub УдалениеМакросовИзКнигиEXCEL()
    On Error Resume Next: Err.Clear
 
    ' макрос работает только в Excel 2007 (и более новых версиях)
    If Val(Application.Version) < 12 Then Exit Sub
 
    ' получаем полный путь к текущему файлу Excel
   oldName$ = ActiveWorkbook.FullName
 
    ' выход, если файл уже в нужном формате (XLSX)
   If UCase$(oldName$) Like "*.XLSX" Then Exit Sub
 
    ' формируем новое имя файла (меняем расширение)
   newName$ = Left(oldName$, InStrRev(oldName$, ".")) & "xlsx"
 
    ' сохраняем файл под новым именем в формате XLSX
   ActiveWorkbook.SaveAs newName$, xlExcel12
 
    ' удаляем прежний файл (в старом формате)
   If Err = 0 Then Kill oldName$
End Sub

Сохранение в PDF книги Excel, группы листов, одного листа или отдельного диапазона с помощью кода VBA. Метод ExportAsFixedFormat. Примеры экспорта.

Метод ExportAsFixedFormat

Метод ExportAsFixedFormat сохраняет рабочую книгу Excel или выбранную группу листов этой книги в один PDF-файл. Чтобы экспортировать каждый лист в отдельный файл, необходимо применить метод ExportAsFixedFormat к каждому сохраняемому листу.

Синтаксис

Expression.ExportAsFixedFormat (Type, FileName, Quality, IncludeDocProperties, IgnorePrintAreas, From, To, OpenAfterPublish, FixedFormatExtClassPtr)

Expression – это выражение, представляющее объект Workbook, Worksheet или Range.

Параметры

Единственный обязательный параметр – Type, остальные можно не указывать – в этом случае будут применены значения по умолчанию.

Параметр Описание
Type Задает формат файла для экспорта книги или листа:
xlTypePDF(0) – сохранение в файл PDF;
xlTypeXPS(1) – сохранение в файл XPS*.
FileName Задает имя файла. При указании полного пути, файл будет сохранен в указанную папку, при указании только имени – в папку по умолчанию (в Excel 2016 – «Документы»). Если имя не задано (по умолчанию), файл будет сохранен с именем экспортируемой книги.
Quality Задает качество сохраняемых электронных таблиц:
xlQualityMinimum(1) – минимальное качество;
xlQualityStandard(0) – стандартное качество (по умолчанию).
IncludeDocProperties Включение свойств документа Excel в PDF:
True(1) – включить;
False(0) – не включать;
мне не удалось обнаружить разницу и значение по умолчанию.
IgnorePrintAreas Указывает VBA, следует ли игнорировать области печати, заданные на листах файла Excel:
True(1) – игнорировать области печати;
False(0) – не игнорировать области печати (по умолчанию).
From** Задает номер листа книги Excel, с которого начинается экспорт. По умолчанию сохранение в PDF начинается с первого листа книги.
To** Задает номер листа книги Excel, на котором заканчивается экспорт. По умолчанию сохранение в PDF заканчивается на последнем листе книги.
OpenAfterPublish Указывает VBA на необходимость открыть созданный файл PDF средством просмотра:
True(1) – открыть файл PDF для просмотра;
False(0) – не открывать файл PDF для просмотра (по умолчанию).
FixedFormatExtClassPtr Указатель на класс FixedFormatExt (игнорируем этот параметр).

* XPS – это редко использующийся фиксированный формат файлов, разработанный Microsoft, который похож на PDF, но основан на языке XML.
** Применимо только к книге (Workbook.ExportAsFixedFormat), при экспорте листа (Worksheet.ExportAsFixedFormat) указание параметров From и/или To приведет к ошибке.

Сохранение в PDF книги Excel

Экспорт всей книги

Sub Primer1()

    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile1.pdf», OpenAfterPublish:=True

End Sub

Если вы указываете путь к файлу, он должен существовать, иначе VBA сохранит файл с именем и в папку по умолчанию («ИмяКниги.pdf» в папку «Документы»).

Экспорт части книги

Этот способ позволяет сохранить в PDF группу листов, расположенных подряд:

Sub Primer2()

    ThisWorkbook.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile2.pdf», _

    From:=2, To:=4, OpenAfterPublish:=True

End Sub

Сохранение в PDF рабочих листов

Экспорт одного листа

Sub Primer3()

    ActiveSheet.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile3.pdf», OpenAfterPublish:=True

End Sub

Экспорт диапазона

Sub Primer2()

    Лист4.Range(«A1:F6»).ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile4.pdf», OpenAfterPublish:=True

End Sub

Если экспортируемый диапазон расположен на активном листе, имя листа указывать не обязательно.

Экспорт группы листов

Этот способ удобен тем, что экспортировать в PDF можно листы, расположенные не подряд:

Sub Primer5()

    Sheets(Array(«Лист2», «Лист3», «Лист5»)).Select

    Selection.ExportAsFixedFormat Type:=xlTypePDF, Filename:=«C:Testfile5.pdf», OpenAfterPublish:=True

End Sub

This is somewhat a continuation on my previous post VBA – Convert XLS to XLSX in which I provided a simple little procedure to upgrade an older xls file to the newer xlsx file format.

I thought to myself, would it be nice to have a more versatile function that could migrate between various other common file formats.

So I set out to take my original function and transform it to enable to user to specify the desired output format and came up with a nice function that enabled anyone to converts Excel compatible files to another Excel compatible format.

Then I said to myself, it must be possible to do something similar for Word and set out to create a function that would enable people to convert file between the various Word compatible formats.

Below are the 2 functions I came up with.

Excel File Format Conversion Function

The following function can be used to convert files between:

  • csv -> xlsx
  • xls -> xlsx
  • xls -> xlsm
  • xls -> txt
  • xlsx -> txt
  • xlsx -> csv
  • and so on…
Enum XlFileFormat
    'Ref: https://msdn.microsoft.com/en-us/vba/excel-vba/articles/xlfileformat-enumeration-excel
    xlAddIn = 18    'Microsoft Excel 97-2003 Add-In *.xla
    xlAddIn8 = 18    'Microsoft Excel 97-2003 Add-In *.xla
    xlCSV = 6    'CSV *.csv
    xlCSVMac = 22    'Macintosh CSV *.csv
    xlCSVMSDOS = 24    'MSDOS CSV *.csv
    xlCSVWindows = 23    'Windows CSV *.csv
    xlCurrentPlatformText = -4158    'Current Platform Text *.txt
    xlDBF2 = 7    'Dbase 2 format *.dbf
    xlDBF3 = 8    'Dbase 3 format *.dbf
    xlDBF4 = 11    'Dbase 4 format *.dbf
    xlDIF = 9    'Data Interchange format *.dif
    xlExcel12 = 50    'Excel Binary Workbook *.xlsb
    xlExcel2 = 16    'Excel version 2.0 (1987) *.xls
    xlExcel2FarEast = 27    'Excel version 2.0 far east (1987) *.xls
    xlExcel3 = 29    'Excel version 3.0 (1990) *.xls
    xlExcel4 = 33    'Excel version 4.0 (1992) *.xls
    xlExcel4Workbook = 35    'Excel version 4.0. Workbook format (1992) *.xlw
    xlExcel5 = 39    'Excel version 5.0 (1994) *.xls
    xlExcel7 = 39    'Excel 95 (version 7.0) *.xls
    xlExcel8 = 56    'Excel 97-2003 Workbook *.xls
    xlExcel9795 = 43    'Excel version 95 and 97 *.xls
    xlHtml = 44    'HTML format *.htm; *.html
    xlIntlAddIn = 26    'International Add-In No file extension
    xlIntlMacro = 25    'International Macro No file extension
    xlOpenDocumentSpreadsheet = 60    'OpenDocument Spreadsheet *.ods
    xlOpenXMLAddIn = 55    'Open XML Add-In *.xlam
    xlOpenXMLStrictWorkbook = 61    '(&;H3D) Strict Open XML file *.xlsx
    xlOpenXMLTemplate = 54    'Open XML Template *.xltx
    xlOpenXMLTemplateMacroEnabled = 53    'Open XML Template Macro Enabled *.xltm
    xlOpenXMLWorkbook = 51    'Open XML Workbook *.xlsx
    xlOpenXMLWorkbookMacroEnabled = 52    'Open XML Workbook Macro Enabled *.xlsm
    xlSYLK = 2    'Symbolic Link format *.slk
    xlTemplate = 17    'Excel Template format *.xlt
    xlTemplate8 = 17    ' Template 8 *.xlt
    xlTextMac = 19    'Macintosh Text *.txt
    xlTextMSDOS = 21    'MSDOS Text *.txt
    xlTextPrinter = 36    'Printer Text *.prn
    xlTextWindows = 20    'Windows Text *.txt
    xlUnicodeText = 42    'Unicode Text No file extension; *.txt
    xlWebArchive = 45    'Web Archive *.mht; *.mhtml
    xlWJ2WD1 = 14    'Japanese 1-2-3 *.wj2
    xlWJ3 = 40    'Japanese 1-2-3 *.wj3
    xlWJ3FJ3 = 41    'Japanese 1-2-3 format *.wj3
    xlWK1 = 5    'Lotus 1-2-3 format *.wk1
    xlWK1ALL = 31    'Lotus 1-2-3 format *.wk1
    xlWK1FMT = 30    'Lotus 1-2-3 format *.wk1
    xlWK3 = 15    'Lotus 1-2-3 format *.wk3
    xlWK3FM3 = 32    'Lotus 1-2-3 format *.wk3
    xlWK4 = 38    'Lotus 1-2-3 format *.wk4
    xlWKS = 4    'Lotus 1-2-3 format *.wks
    xlWorkbookDefault = 51    'Workbook default *.xlsx
    xlWorkbookNormal = -4143    'Workbook normal *.xls
    xlWorks2FarEast = 28    'Microsoft Works 2.0 far east format *.wks
    xlWQ1 = 34    'Quattro Pro format *.wq1
    xlXMLSpreadsheet = 46    'XML Spreadsheet *.xml
End Enum

'---------------------------------------------------------------------------------------
' Procedure : XLS_ConvertFileFormat
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Converts an Excel compatible file format to another format
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sOrigFile     : String - Original file path, name and extension to be converted
' lNewFileFormat: New File format to save the original file as
' bDelOrigFile  : True/False - Should the original file be deleted after the conversion
'
' Usage:
' ~~~~~~
' Convert an xls file into a txt file and delete the xls once completed
'   Call XLS_ConvertFileFormat("C:TempTest.xls", xlTextWindows)
' Convert an xls file into a xlsx file and NOT delete the xls once completed
'   Call XLS_ConvertFileFormat("C:TempTest.xls", False)
' Convert a csv file into a xlsx file and delete the xls once completed
'   Call XLS_ConvertFileFormat("C:TempTest.csv", xlWorkbookDefault, True)
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2018-02-27              Initial Release
' 2         2020-12-31              Fixed typo xlDBF24 -> xlDBF4
'---------------------------------------------------------------------------------------
Function XLS_ConvertFileFormat(ByVal sOrigFile As String, _
                               Optional lNewFileFormat As XlFileFormat = xlOpenXMLWorkbook, _
                               Optional bDelOrigFile As Boolean = False) As Boolean
    '#Const EarlyBind = True 'Use Early Binding, Req. Reference Library
    #Const EarlyBind = False    'Use Late Binding
    #If EarlyBind = True Then
        'Early Binding Declarations
        Dim oExcel            As Excel.Application
        Dim oExcelWrkBk       As Excel.Workbook
    #Else
        'Late Binding Declaration/Constants
        Dim oExcel            As Object
        Dim oExcelWrkBk       As Object
    #End If
    Dim bExcelOpened          As Boolean
    Dim sOrigFileExt          As String
    Dim sNewXLSFileExt        As String

    'Determine the file extension associated with the requested file format
    'for properly renaming the output file
    Select Case lNewFileFormat
        Case xlAddIn, xlAddIn8
            sNewFileExt = ".xla"
        Case xlCSV, xlCSVMac, xlCSVMSDOS, xlCSVWindows
            sNewFileExt = ".csv"
        Case xlCurrentPlatformText, xlTextMac, xlTextMSDOS, xlTextWindows, xlUnicodeText
            sNewFileExt = ".txt"
        Case xlDBF2, xlDBF3, xlDBF4
            sNewFileExt = ".dbf"
        Case xlDIF
            sNewFileExt = ".dif"
        Case xlExcel12 = 50    'Excel Binary Workbook *.xlsb
            sNewFileExt = ".xlsb"
        Case xlExcel2, xlExcel2FarEast, xlExcel3, xlExcel4, xlExcel5, xlExcel7, _
             xlExcel8, xlExcel9795, xlWorkbookNormal
            sNewFileExt = ".xls"
        Case xlExcel4Workbook = 35    'Excel version 4.0. Workbook format (1992) *.xlw
            sNewFileExt = ".xlw"
        Case xlHtml = 44    'HTML format *.htm; *.html
            sNewFileExt = ".html"
        Case xlIntlAddIn, xlIntlMacro
            sNewFileExt = ""
        Case xlOpenDocumentSpreadsheet    'OpenDocument Spreadsheet *.ods
            sNewFileExt = ".ods"
        Case xlOpenXMLAddIn    'Open XML Add-In *.xlam
            sNewFileExt = ".xlam"
        Case xlOpenXMLStrictWorkbook, xlOpenXMLWorkbook, xlWorkbookDefault = 51
            sNewFileExt = ".xlsx"
        Case xlOpenXMLTemplate    'Open XML Template *.xltx
            sNewFileExt = ".xltx"
        Case xlOpenXMLTemplateMacroEnabled     'Open XML Template Macro Enabled *.xltm
            sNewFileExt = ".xltm"
        Case xlOpenXMLWorkbookMacroEnabled     'Open XML Workbook Macro Enabled *.xlsm
            sNewFileExt = ".xlsm"
        Case xlSYLK     'Symbolic Link format *.slk
            sNewFileExt = ".slk"
        Case xlTemplate, xlTemplate8    ' Template 8 *.xlt
            sNewFileExt = ".xlt"
        Case xlTextPrinter        'Printer Text *.prn
            sNewFileExt = ".prn"
        Case xlWebArchive         'Web Archive *.mht; *.mhtml
            sNewFileExt = ".mhtml"
        Case xlWJ2WD1        'Japanese 1-2-3 *.wj2
            sNewFileExt = ".wj2"
        Case xlWJ3, xlWJ3FJ3    'Japanese 1-2-3 format *.wj3
            sNewFileExt = ".wj3"
        Case xlWK1, xlWK1ALL, xlWK1FMT   'Lotus 1-2-3 format *.wk1
            sNewFileExt = ".wk1"
        Case xlWK3, xlWK3FM3   'Lotus 1-2-3 format *.wk3
            sNewFileExt = ".wk3"
        Case xlWK4       'Lotus 1-2-3 format *.wk4
            sNewFileExt = ".wk4"
        Case xlWKS, xlWorks2FarEast      'Lotus 1-2-3 format *.wks
            sNewFileExt = ".wks"
        Case xlWQ1       'Quattro Pro format *.wq1
            sNewFileExt = ".wq1"
        Case xlXMLSpreadsheet       'XML Spreadsheet *.xml
            sNewFileExt = ".xml"
    End Select

    'Determine the original file's extension for properly renaming the output file
    sOrigFileExt = "." & Right(sOrigFile, Len(sOrigFile) - InStrRev(sOrigFile, "."))

    'Start Excel
    On Error Resume Next
    Set oExcel = GetObject(, "Excel.Application")          'Bind to existing instance of Excel
    If Err.Number <> 0 Then          'Could not get instance of Excel, so create a new one
        Err.Clear
        On Error GoTo Error_Handler
        Set oExcel = CreateObject("Excel.Application")
    Else          'Excel was already running
        bExcelOpened = True
    End If
    On Error GoTo Error_Handler

    oExcel.ScreenUpdating = False
    oExcel.Visible = False         'Keep Excel hidden until we are done with our manipulation
    Set oExcelWrkBk = oExcel.Workbooks.Open(sOrigFile)    'Open the original file
    'Save it as the requested new file format
    oExcelWrkBk.SaveAS Replace(sOrigFile, sOrigFileExt, sNewFileExt), lNewFileFormat, , , , False
    XLS_ConvertFileFormat = True    'Report back that we managed to save the file in the new format
    oExcelWrkBk.Close False    'Close the workbook
    If bExcelOpened = False Then
        oExcel.Quit    'Quit Excel only if we started it
    Else
        oExcel.ScreenUpdating = True
        oExcel.Visible = True
    End If

    If bDelOrigFile = True Then Kill (sOrigFile)    'Delete the original file if requested

Error_Handler_Exit:
    On Error Resume Next
    Set oExcelWrkBk = Nothing
    Set oExcel = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: XLS_ConvertFileFormat" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    oExcel.ScreenUpdating = True
    oExcel.Visible = True         'Make excel visible to the user
    Resume Error_Handler_Exit
End Function

Word File Format Conversion Function

The following function can be used to convert files between:

  • doc -> docx
  • docx -> dotx
  • docx -> pdf
  • docx -> html
  • and so on…
Enum WdSaveFormat
    'Ref: https://msdn.microsoft.com/en-us/vba/word-vba/articles/wdsaveformat-enumeration-word
    wdFormatDocument = 0    'Microsoft Office Word 97 - 2003 binary file format.
    wdFormatDOSText = 4    'Microsoft DOS text format.  *.txt
    wdFormatDOSTextLineBreaks = 5    'Microsoft DOS text with line breaks preserved.  *.txt
    wdFormatEncodedText = 7    'Encoded text format.  *.txt
    wdFormatFilteredHTML = 10    'Filtered HTML format.
    wdFormatFlatXML = 19    'Open XML file format saved as a single XML file.
'    wdFormatFlatXML = 20    'Open XML file format with macros enabled saved as a single XML file.
    wdFormatFlatXMLTemplate = 21    'Open XML template format saved as a XML single file.
    wdFormatFlatXMLTemplateMacroEnabled = 22    'Open XML template format with macros enabled saved as a single XML file.
    wdFormatOpenDocumentText = 23    'OpenDocument Text format. *.odt
    wdFormatHTML = 8    'Standard HTML format. *.html
    wdFormatRTF = 6    'Rich text format (RTF). *.rtf
    wdFormatStrictOpenXMLDocument = 24    'Strict Open XML document format.
    wdFormatTemplate = 1    'Word template format.
    wdFormatText = 2    'Microsoft Windows text format. *.txt
    wdFormatTextLineBreaks = 3    'Windows text format with line breaks preserved. *.txt
    wdFormatUnicodeText = 7    'Unicode text format. *.txt
    wdFormatWebArchive = 9    'Web archive format.
    wdFormatXML = 11    'Extensible Markup Language (XML) format. *.xml
    wdFormatDocument97 = 0    'Microsoft Word 97 document format. *.doc
    wdFormatDocumentDefault = 16    'Word default document file format. For Word, this is the DOCX format. *.docx
    wdFormatPDF = 17    'PDF format. *.pdf
    wdFormatTemplate97 = 1    'Word 97 template format.
    wdFormatXMLDocument = 12    'XML document format.
    wdFormatXMLDocumentMacroEnabled = 13    'XML document format with macros enabled.
    wdFormatXMLTemplate = 14    'XML template format.
    wdFormatXMLTemplateMacroEnabled = 15    'XML template format with macros enabled.
    wdFormatXPS = 18    'XPS format. *.xps
End Enum

'---------------------------------------------------------------------------------------
' Procedure : Word_ConvertFileFormat
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : http://www.cardaconsultants.com
' Purpose   : Converts a Word compatible file format to another format
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - https://creativecommons.org/licenses/by-sa/4.0/
' Req'd Refs: Uses Late Binding, so none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sOrigFile     : String - Original file path, name and extension to be converted
' lNewFileFormat: New File format to save the original file as
' bDelOrigFile  : True/False - Should the original file be deleted after the conversion
'
' Usage:
' ~~~~~~
' Convert a doc file into a docx file but retain the original copy
'   Call Word_ConvertFileFormat("C:UsersDanielDocumentsResume.doc", wdFormatPDF)
' Convert a doc file into a docx file and delete the original doc once converted
'   Call Word_ConvertFileFormat("C:UsersDanielDocumentsResume.doc", wdFormatPDF, True)
'
' Revision History:
' Rev       Date(yyyy/mm/dd)        Description
' **************************************************************************************
' 1         2018-02-27              Initial Release
'---------------------------------------------------------------------------------------
Function Word_ConvertFileFormat(ByVal sOrigFile As String, _
                                Optional lNewFileFormat As WdSaveFormat = wdFormatDocumentDefault, _
                                Optional bDelOrigFile As Boolean = False) As Boolean
    '#Const EarlyBind = True 'Use Early Binding, Req. Reference Library
    #Const EarlyBind = False    'Use Late Binding
    #If EarlyBind = True Then
        'Early Binding Declarations
        Dim oWord             As Word.Application
        Dim oDoc              As Word.Document
    #Else
        'Late Binding Declaration/Constants
        Dim oWord             As Object
        Dim oDoc              As Object
    #End If
    Dim bWordOpened           As Boolean
    Dim sOrigFileExt          As String
    Dim sNewFileExt           As String

    'Determine the file extension associated with the requested file format
    'for properly renaming the output file
    Select Case lNewFileFormat
        Case wdFormatDocument
            sNewFileExt = "."
        Case wdFormatDOSText, wdFormatDOSTextLineBreaks, wdFormatEncodedText, wdFormatOpenDocumentText, wdFormatText, wdFormatTextLineBreaks, wdFormatUnicodeText
            sNewFileExt = ".txt"
        Case wdFormatFilteredHTML, wdFormatHTML
            sNewFileExt = ".html"
        Case wdFormatFlatXML, wdFormatXML, wdFormatXMLDocument
            sNewFileExt = ".xml"
        Case wdFormatFlatXMLTemplate
            sNewFileExt = "."
        Case wdFormatFlatXMLTemplateMacroEnabled
            sNewFileExt = "."
        Case wdFormatRTF
            sNewFileExt = ".rtf"
        Case wdFormatStrictOpenXMLDocument
            sNewFileExt = "."
        Case wdFormatTemplate
            sNewFileExt = "."
        Case wdFormatWebArchive
            sNewFileExt = "."
        Case wdFormatDocument97
            sNewFileExt = ".doc"
        Case wdFormatDocumentDefault
            sNewFileExt = ".docx"
        Case wdFormatPDF
            sNewFileExt = ".pdf"
        Case wdFormatTemplate97
            sNewFileExt = "."
        Case wdFormatXMLDocumentMacroEnabled
            sNewFileExt = ".docm"
        Case wdFormatXMLTemplate
            sNewFileExt = ".doct"
        Case wdFormatXMLTemplateMacroEnabled
            sNewFileExt = "."
        Case wdFormatXPS
            sNewFileExt = ".xps"
    End Select

    'Determine the original file's extension for properly renaming the output file
    sOrigFileExt = "." & Right(sOrigFile, Len(sOrigFile) - InStrRev(sOrigFile, "."))

    'Start Excel
    On Error Resume Next
    Set oWord = GetObject(, "Word.Application")            'Bind to existing instance of Word
    If Err.Number <> 0 Then            'Could not get instance of Word, so create a new one
        Err.Clear
        On Error GoTo Error_Handler
        Set oWord = CreateObject("Word.Application")
    Else            'Word was already running
        bWordOpened = True
    End If
    On Error GoTo Error_Handler

    oWord.Visible = False           'Keep Word hidden until we are done with our manipulation
    Set oDoc = oWord.Documents.Open(sOrigFile)      'Open the original file
    'Save it as the requested new file format
    oDoc.SaveAs2 Replace(sOrigFile, sOrigFileExt, sNewFileExt), lNewFileFormat
    Word_ConvertFileFormat = True      'Report back that we managed to save the file in the new format
    oDoc.Close False      'Close the document
    If bWordOpened = False Then
        oWord.Quit      'Quit Word only if we started it
    Else
        oWord.Visible = True 'Since it was already open, ensure it is visible
    End If

    If bDelOrigFile = True Then Kill (sOrigFile)      'Delete the original file if requested

Error_Handler_Exit:
    On Error Resume Next
    Set oDoc = Nothing
    Set oWord = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Source: XLS_ConvertFileFormat" & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    oWord.Visible = True           'Make excel visible to the user
    Resume Error_Handler_Exit
End Function

Missing File Extensions

Unlike the Excel function, the Word function is currently missing some of the file extensions. I created the general framework, but could not easily find the associated file extensions to some of the file format. You need only complete the missing entry and it will work. So simply update the

sNewFileExt = "."

entries as applicable.

Heroes

1 / 1 / 0

Регистрация: 12.06.2015

Сообщений: 93

1

21.09.2018, 20:30. Показов 11966. Ответов 8

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

Как сохранить копию файла по определенном пути без макросов.
Такой пример не удачный, так как файл .xlsx, который якобы сохранился, при открытии ругается что расширение и формат являются не допустимыми

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Dim x As String
    strPath = "W:Отчетность"
    On Error Resume Next
    x = GetAttr(strPath) And 0
    If Err = 0 Then
        strDate = Format(Now, "dd-mm-yy hh-mm")
        FileNameXls = strPath & "" & "Отчет" & " " & strDate & ".xlsx"
        ActiveWorkbook.SaveCopyAs Filename:=FileNameXls
    Else
        MsgBox " " & strPath & " ", vbCritical
    End If

Есть способ сохранить КОПИЮ файла в формате .xlsx ?



0



Остап Бонд

Заблокирован

21.09.2018, 20:37

2

Sub SaveAs([Filename], [FileFormat], [Password], [WriteResPassword], [ReadOnlyRecommended], [CreateBackup], [AccessMode As XlSaveAsAccessMode = xlNoChange], [ConflictResolution], [AddToMru], [TextCodepage], [TextVisualLayout], [Local])
Member of Excel.Workbook



1



1 / 1 / 0

Регистрация: 12.06.2015

Сообщений: 93

21.09.2018, 21:38

 [ТС]

3

SaveAs сохраняет файл, в котором выполняется макрос.
А нужно чтобы в конце выполнения макроса сохранилась копия файла по другому пути без макросов в формате xlsx



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

21.09.2018, 23:54

4

Лучший ответ Сообщение было отмечено Heroes как решение

Решение

Heroes, сначала SaveCopyAs, потом открыть и сохранить в нужном формате. Допилите по необходимости.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub ExportAsXLSX()
Const strPath = "W:Отчетность"
Dim x
  On Error GoTo 1
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  x = strPath & Format(Now, "hhmmss") & ActiveWorkbook.Name
  ActiveWorkbook.SaveCopyAs x
  With Workbooks.Open(x)
    .SaveAs strPath & Format(Now, "Отчет dd-mm-yy hh-mm.xlsx"), xlOpenXMLWorkbook
    .Close 0
  End With
  Kill x
1 Application.ScreenUpdating = True
  Application.DisplayAlerts = True
End Sub

GetAttr(strPath) And 0 всегда будет 0.



1



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

22.09.2018, 18:41

5

Если меняете формат (да ещё и содержимое) — как это может быть КОПИЕЙ?



0



1 / 1 / 0

Регистрация: 12.06.2015

Сообщений: 93

22.09.2018, 21:21

 [ТС]

6

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Если меняете формат (да ещё и содержимое) — как это может быть КОПИЕЙ?

Ок, это Не копия,
а копия файла с заменой формата с xlsm на xlsx (содержимое например не меняется).



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

22.09.2018, 21:25

7

Ну вот потому SaveCopyAs никак и не подходит.



1



1 / 1 / 0

Регистрация: 12.06.2015

Сообщений: 93

22.09.2018, 21:56

 [ТС]

8

Цитата
Сообщение от Hugo121
Посмотреть сообщение

Ну вот потому SaveCopyAs никак и не подходит.

вы правы не подходит,
тогда вариант сделать SaveCopyAs, открыть эту копию, выполнить SaveAs в нужном формате, ТОлько такой вариант?
Вроде рабочий вариант, но так получается цепочка с 3- файлов(1. Исходный файл, где макрос. 2. Файл «SaveCopyAs». 3. Copy-файл в нужном формате
Если бы сделать все с цепочки 2-х файлов (1. Исходный файл, где макрос. 2. копия файла с заменой формата с xlsm на xlsx

Есть еще идеи?



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

22.09.2018, 22:30

9

Можно не делать копию, а сразу сохранять книгу в нужном виде — но тогда эта конкретная активная книга и будет уже в другом формате, и если Вы хотите продолжать работать с нею в том первозданном виде — нужно её снова открывать. А эту — закрывать.



1



Понравилась статья? Поделить с друзьями:
  • Vba excel сохранение файла pdf
  • Vba excel сохранение при закрытии
  • Vba excel сохранение переменной
  • Vba excel соседнюю ячейку
  • Vba excel сортировка ячейки