Страницы: 1
RSS
Как пакетно преобразовать книги формата xls в xlsb
 
Добрый день, товарищи.

Может быть кто подскажет, существует ли программа или надстройка или что-нибудь, куда можно загнать, например, файлов 30 Excel формата xls и преобразовать их нажатием одной кнопки в xlsb.
Хочу уменьшить объем хранения на сетевом диске, где сейчас храниться порядка 350 файлов размером 5-10 Мб каждый.
Онлайн конвертеры, которые я нашел, позволяют только поштучно конвертировать, да и конфиденциальность...

Спасибо.
 
ИМХО 30 файлов за час открыть в екселе и сохранить куда надо в новом формате. Это не тот объем, который стОит автоматизировать. Особенно, если с этим проблемы и самостоятельно быстро вы это сделать не сможете. Здесь помощь будете ждать ощутимо дольше, затем проверять, как оно работает. Настраивать...
Если автоматизировать бардак, то получится автоматизированный бардак.
 
wowick, Мне это нужно разово. Конвертнуть все 350 файлов за раз.
Недавно открыл для себя преимущества xlsb. В дальнейшем буду тяжелые файлы сразу сохранять в xlsb.
 
Цитата
rehotka написал:
существует ли программа или надстройка или что-нибудь
Сменить формат файлов
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
А может есть бесплатный способ?
 
Так Вам подсказали бесплатный в №2 :)
Я сам - дурнее всякого примера! ...
 
Цитата
rehotka написал:
может есть бесплатный способ?
Ну вообще, если нужно разово - то я привел метод бесплатный. Надстройка месяц работает на полную без оплаты.
Второй вариант: начать учить VBA и циклы, благо примеров на форуме и в сети полно. И спрашивать здесь уже что конкретно непонятно.

Вот, нашел древний код у себя(делал когда-то). Просто изменил тип файлов:
Код
'---------------------------------------------------------------------------------------
' Module    : mSaveAsMass
' DateTime  : 25.02.2014 18:02
' Author    : The_Prist(Щербаков Дмитрий)
'             WebMoney - R298726502453; Яндекс.Деньги - 41001332272872
'             http://www.excel-vba.ru
' Purpose   :
'---------------------------------------------------------------------------------------
Option Explicit

Sub SaveAs_Mass()
    Dim sFolder As String, sFiles As String, sNonEx As String
    Dim lPos As Long
    sFolder = ThisWorkbook.Path
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)
    Application.ScreenUpdating = 0
    Application.DisplayAlerts = 0
    sFiles = Dir(sFolder & "*.xls")
    Do While sFiles <> ""
        If sFiles <> ThisWorkbook.Name Then
            lPos = InStrRev(sFiles, ".")
            sNonEx = Mid(sFiles, 1, lPos)
            Workbooks.Open sFolder & sFiles, False
            ActiveWorkbook.SaveAs sFolder & sNonEx & "xlsb", 50
            ActiveWorkbook.Close 0
        End If
        sFiles = Dir
    Loop
    Application.ScreenUpdating = 1
    Application.DisplayAlerts = 1
End Sub
Изменено: The_Prist - 05.10.2017 10:32:29
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
The_Prist, спасибо большое.
Мультекс на работе нет возможности установить, но ваш код работает. Конвертирует досточно быстро. Несколькими заходами, на всяк случай, все свои файлы переведу в ХЛСБ.
Изменено: rehotka - 01.11.2017 10:08:23
 
The_Prist, подтверждаю в Office 2013, код работает, формат преобразуется. Вот только дата/время изменения  у всех сконвертированных файлов соответствует текущему моменту конвертации. Это не всегда удобно. Возможно ли сделать, чтобы дата/время изменения файла соответствовали оригиналу?
Изменено: Дмитрий - 05.10.2021 13:33:04
 
Дмитрий, при конвертации создаётся новый файл - у нового файла всегда дата/время изменения/создания будет текущая.

P.S. Попробуйте щёлкнуть правой клавишей мыши на рабочем столе Windows, в контекстном меню выбрать Создать - и создайте любой файл (текстовый, Word, Excel и пр.) и посмотрите время изменения/создания его в свойствах этого файла. Странно, что там будет стоять текущая дата, а не 1918 год
Изменено: New - 05.10.2021 13:42:03
 
Ссылка.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
New, Я безусловно это понимаю. Быть может, я не очень подробно сформулировал вопрос. Возможно ли в коде от The_Prist, перед открытием исходного файла прочитать из него дату/время изменения, а после конвертации, новому файлу значение этого атрибута изменить, на прочитанные из оригинала?

JayBhagavan, Да, я уже видел это на киберфоруме. Но пока не соображу, какие из примеров адаптировать к текущему макросу.
 
Дмитрий, попробуйте так
1. Сохраните макрос от The_Prist и от меня в файл XLSM и поместите его в папку с нужными файлами, которые вам нужно пересохранить в другом формате
2. Запустите сперва макрос от The_Prist
3. У вас в папке создадутся одни и те же файлы, но с разными расширениями (XLS и XLSB)
4. Затем запустите этот макрос, он сперва пройдётся по файлам с расширением XLS, запомнить их название и время изменения, а потом в цикле пройдётся по файлам XLSB и изменит у них время Изменения на аналогочный файл (т.е. файлу 1.XLSB будет присвоено время от файла 1.XLS)
5. Потом все файлы с расширением XLS можно удалить из папки.

Код
Sub Скорректировать_время_изменения_файлов()
    Dim objShell As Object, objFolder As Object, objItem As Object
    Dim DateTimeTemp As Date, S As String
    Dim Coll As New Collection, FSO As Object, iEXT As String, sFileNameWOExt As String, sFolder As String
    
    sFolder = ThisWorkbook.Path
    sFolder = sFolder & IIf(Right(sFolder, 1) = Application.PathSeparator, "", Application.PathSeparator)

    Set FSO = CreateObject("Scripting.FileSystemObject")
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(CStr(sFolder))
    
    For Each objItem In objFolder.Items
        If objItem <> ThisWorkbook.Name Then
            iEXT = FSO.GetExtensionName(objItem.Name)
            If LCase(iEXT) = "xls" Then
                sFileNameWOExt = Left(objItem, InStrRev(objItem, ".") - 1)
                DateTimeTemp = CDate(objItem.ModifyDate)
                Coll.Add DateTimeTemp, sFileNameWOExt
            End If
        End If
    Next
        
    For Each objItem In objFolder.Items
        If objItem <> ThisWorkbook.Name Then
            iEXT = FSO.GetExtensionName(objItem.Name)
            If LCase(iEXT) = "xlsb" Then
                sFileNameWOExt = Left(objItem, InStrRev(objItem, ".") - 1)
                S = Coll.Item(sFileNameWOExt)
                'S = Format$(S, "dd.mm.yyyy hh:mm:ss")
                objItem.ModifyDate = S
                S = Empty
            End If
        End If
    Next
    
    Set FSO = Nothing
    Set objFolder = Nothing
    Set objShell = Nothing
    MsgBox "Данные времени изменены!", vbInformation, "Конец"
End Sub
Изменено: New - 05.10.2021 19:48:43
 
New, К сожалению, не работает. При выполнении сразу же выскакивает диалог "Данные времени изменены" и ничего не происходит.
Я даже не думал, что для этого отдельный макрос нужен. Как я себе это представлял:
В цикле Do While от The_Prist, перед открытием файла прочитать дату/время изменения в переменную. После сохранения файла данные из этой переменной записать в атрибут "Дата изменения". Я так понимаю, в цикле имя файла ведь уже известно.
В командах vba я не то что не силён, а полный 0, т.к. никогда дело с ним не имел. Поэтому на большую часть кода смотрю как баран на новые ворота.
 
Дмитрий, объединил 2 макроса в 1. Поместите этот файл в папку с файлами XLS, откройте его там и нажмите на кнопку. Макрос пересохранит файлы из XLS в XLSB и покажет сколько файлов он пересохранил

Код
Изменено: New - 09.10.2021 21:20:11
 
New, Ура, работает! И с исходными файлами xls и xlsx, если в коде в двух местах расширение поменять. Работает с названиями файлов на латинице, на кириллице, с пробелами. Но, если в названии файла есть точка, например, дата вида "Файл 01.05.2021.xls", то файл сохраняется вида "Файл 01.01.2021" и макрос завершается с ошибкой:
Цитата
Run-time error '91':
Object variable or With block variable not set
Дата изменения файла остаётся текущей. Если к такому файлу дописать расширение .xlsb, то открывается нормально уже в новом формате. В Вашем коде методом логического тыка изменил строчку:
Код
ActiveWorkbook.SaveAs sFolder & sFileNameWithoutExt, 50 &#39;50 - xlsb

на:
Код
ActiveWorkbook.SaveAs sFolder & sFileNameWithoutExt & ".xlsb", 50 &#39;50 - xlsb

Заработало со всеми файлами.
Страницы: 1
Наверх