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.