Respostas:
Confira o Office Migration Planning Manager.
O kit de ferramentas também contém o Office File Converter (OFC), que permite conversões em massa de documentos dos formatos binário para OpenXML. ( Technet )
Eu recomendo usar uma macro para processar os arquivos em uma pasta para convertê-los de xls para xlsx. Esse código pressupõe que todos os arquivos estejam localizados em uma pasta e que todos os arquivos xls precisam ser convertidos, mas se você quiser selecionar arquivos individuais, esse código poderá ser atualizado.
Esse código precisaria ser executado em uma pasta de trabalho do Excel 2007 ou Excel 2010.
Option Explicit
' Convert all xls files in selected folder to xlsx
Sub convertXLStoXLSX()
Dim FSO As Scripting.FileSystemObject
Dim strConversionPath As String
Dim fFile As File
Dim fFolder As Folder
Dim wkbConvert As Workbook
' Open dialog and select folder
With Application.FileDialog(msoFileDialogFolderPicker)
.AllowMultiSelect = False
.Show
strConversionPath = .SelectedItems(1)
End With
Set FSO = New Scripting.FileSystemObject
' Check if the folder exists
If FSO.FolderExists(strConversionPath) Then
Set fFolder = FSO.GetFolder(strConversionPath)
' Loop through files, find the .xls files
For Each fFile In fFolder.Files
If Right(fFile.Name, 4) = ".xls" Or Right(fFile.Name, 4) = ".XLS" Then
Application.DisplayAlerts = False
Set wkbConvert = Workbooks.Open(fFile.Path)
' Save as XML workbook - if file contains macros change FileFormat:=52
wkbConvert.SaveAs FSO.BuildPath(fFile.ParentFolder, Left(fFile.Name, Len(fFile.Name) - 4)) & ".xlsx", FileFormat:=51
wkbConvert.Close SaveChanges:=False
' Delete original file
fFile.Delete Force:=True
Application.DisplayAlerts = True
End If
Next fFile
End If
End Sub
Se os arquivos que você está convertendo contiverem macros, será necessário atualizar o 'FileFormat: = 51' para ler 'FileFormat: = 52'. Ou, se você não precisar codificar macro nos arquivos convertidos, poderá deixá-lo em paz e ele removerá as macros quando o converter no formato xlsx.
Sub SaveAllAsXLSX () Dim strFilename As String Dim strDocName As String Dim strPath As String Dim wbk As Workbook Dim fDialog As FileDialog Dim intPos como inteiro Dim strPassword As String Dim strWritePassword As String Dim varA As String Dim varB As String Dim colFiles como nova coleção Dim vFile como variante Defina fDialog = Application.FileDialog (msoFileDialogFolderPicker) Com fDialog .Title = "Selecione a pasta e clique em OK" .AllowMultiSelect = True .InitialView = msoFileDialogViewList Se .Show -1 Então MsgBox "Cancelado pelo Usuário",, "Listar Conteúdo da Pasta" Sair do Sub Fim se strPath = fDialog.SelectedItems.Item (1) Se estiver certo (strPath, 1) "\" Então strPath = strPath + "\" Terminar com Se esquerda (strPath, 1) = Chr (34), então strPath = Mid (strPath, 2, Len (strPath) - 2) Fim se Definir obj = CreateObject ("Scripting.FileSystemObject") RecursiveDir colFiles, strPath, "* .xls", True Para cada vFile em colFiles Debug.Print vFile strFilename = vFile varA = Direita (strFilename, 3) Se (varA = "xls" ou varA = "XLSX"), então Defina wbk = Workbooks.Open (nome do arquivo: = strFilename) Se wbk.HasVBProject Then wbk.SaveAs Nome do arquivo: = strFilename & "m", FileFormat: = xlOpenXMLWorkbookMacroEnabled Outro wbk.SaveAs Nome do arquivo: = strFilename & "x", FileFormat: = xlOpenXMLWorkbook Fim se wbk.Close SaveChanges: = False obj.DeleteFile (strFilename) Fim se Próximo vFile End Sub Função pública RecursiveDir (colFiles As Collection, _ strFolder como String, _ strFileSpec como String, _ bIncludeSubfolders As Boolean) Dim strTemp As String Dim colFolders As New Collection Dim vFolderName As Variant 'Adicionar arquivos no strFolder que correspondam strFileSpec a colFiles strFolder = TrailingSlash (strFolder) strTemp = Dir (strFolder & strFileSpec) Do While strTemp vbNullString colFiles.Add strFolder & strTemp strTemp = Dir Loop Se bIncludeSubpolders Then 'Preencher colFolders com a lista de subdiretórios do strFolder strTemp = Dir (pasta do arquivo, vbDirectory) Do While strTemp vbNullString If (strTemp ".") E (strTemp "..") Então If (GetAttr (strFolder & strTemp) And vbDirectory) 0 Então colFolders.Add strTemp Fim se Fim se strTemp = Dir Loop 'Chame RecursiveDir para cada subpasta em colFolders Para cada vFolderName em colFolders Chame RecursiveDir (colFiles, strFolder & vFolderName, strFileSpec, True) Próximo vFolderName Fim se Função final Função pública TrailingSlash (strFolder As String) Como String Se Len (strFolder)> 0 Então If Right (strFolder, 1) = "\" Então TrailingSlash = strFolder Outro TrailingSlash = strFolder & "\" Fim se Fim se Função final
Se você possui o MsOffice instalado, essa ferramenta pode valer um download para uma solução rápida.
http://www.softinterface.com/Convert-XLS/Features/Convert-XLS-To-XLSX.htm
Quando você seleciona uma pasta para ver os arquivos xls convertidos, marque a opção da ferramenta de conversão que usa o MS Office na conversão, e não o próprio conversor.
Se você usar seu próprio conversor, perderá cores nas células e uma única folha parece sair. Se você usar o MsOffice como o conversor parece funcionar bem. Boa ferramenta para uma solução rápida.
Então, escrevi um VBScript simples para converter arquivos .xls em .xlsx de maneira silenciosa.
./convert-xls-xlsx.vbs {caminho para a pasta que contém arquivos .xls}
convert-xls-xlsx.vbs:
Definir args = WScript.Arguments strPath = args (0) strPath = CreateObject ("Scripting.FileSystemObject"). GetAbsolutePathName (strPath) Defina objExcel = CreateObject ("Excel.Application") objExcel.Visible = False objExcel.DisplayAlerts = False Defina objFso = CreateObject ("Scripting.FileSystemObject") Definir objFolder = objFso.GetFolder (strPath) Para cada objFile Em objFolder.Files fileName = objFile.Path If (objFso.GetExtensionName (objFile.Path) = "xls") Então Definir objWorkbook = objExcel.Workbooks.Open (fileName) saveFileName = Substituir (nome do arquivo, ". xls", ". xlsx") objWorkbook.SaveAs saveFileName, 51 objWorkbook.Close () objExcel.Application.DisplayAlerts = True Fim se Próximo MsgBox "Conversão concluída"
NOTA: Procure espaços no caminho da pasta; se o caminho tiver um espaço intermediário, coloque-o entre aspas.