Search code examples
csvvbscriptxlsx

VBS - Loop through multiple .csv files in a folder and convert the files to .xlsx


I managed to get the following piece of code put together:

'Constants
Const xlOpenXMLWorkbook = 51             '(without macro's in 2007-2016, xlsx)
Const xlOpenXMLWorkbookMacroEnabled = 52 '(with or without macro's in 2007-2016, xlsm)
Const xlExcel12 = 50                     '(Excel Binary Workbook in 2007-2016 with or without macro's, xlsb)
Const xlExcel8 =56                       '(97-2003 format in Excel 2007-2016, xls)

' Extensions for old and new files
strExcel = "xlsx"
strCSV = "csv"

' Set up filesystem object for usage
Set objFSO = CreateObject("Scripting.FileSystemObject")

' Get folder name to process off the command line, make sure it's valid
If (WScript.Arguments.Count > 0) Then
    strFolder = WScript.Arguments(0)
    If Not objFSO.FolderExists(strFolder) Then
        WScript.StdErr.WriteLine "Specified folder does not exist."
        WScript.Quit
    End If
Else
    WScript.StdErr.WriteLine "No folder name specified to process."
    WScript.Quit
End If

' Access the folder to process
Set objFolder = objFSO.GetFolder(strFolder)

' Load Excel (hidden) for conversions
Set objExcel = CreateObject("Excel.Application")
objExcel.Visible = False
objExcel.DisplayAlerts = False

' Process all files
For Each objFile In objFolder.Files
    ' Get full path to file
    strPath = objFile.Path
    ' Only convert CSV files
    If LCase(objFSO.GetExtensionName(strPath)) = LCase(strCSV) Then
        ' Display to console each file being converted
        WScript.Echo "Converting """ & strPath & """"
        ' Load CSV into Excel and save as native Excel file
        Set objWorkbook = objExcel.Workbooks.Open(strPath, False, True)
        objWorkbook.SaveAs Replace(strPath, strCSV, strExcel), xlOpenXMLWorkbook
        objWorkbook.Close False
        Set objWorkbook = Nothing
    End If
Next

'Wrap up
objExcel.Quit
Set objExcel = Nothing
Set objFSO = Nothing 

Unfortunately I have 3 issues:

  1. I was instructed to run this in the following manner:
    Copy the code above and saved it as csv.vbs
    Go to CMD and type in

    cscript csv.vbs "C:\Users\Eitel\Desktop\3rd Party\Work Folder"
    

    This is the path where the CSV files are.

    I would prefer to have a way of executing the code by clicking on/opening a VBScript.

  2. I received this error:

    Input Error: Can not find script file "C:\Users\Eitel\csv.vbs"

    I went to "C:\Users\Eitel\csv.vbs" and pasted the csv.vbs file in this location. I ran the command again and this is what was displayed:

    "C:\Users\Eitel\Desktop\3rd Party\Work Folder\TestFile.CSV"
    C:\Users\Eitel\csv.vbs(44.9) Microsoft Excel: Cannot save as that name. Document was opened as read-only.

    I have no clue what this means or why it happens?

  3. I noticed that while most of the files are .csv extensions, some of the files extensions are displayed as .CSV and some are .csv. I am wondering if this will affect the way in which the script is executed?


Solution

  • Here is the solution I needed:

    Link: https://www.experts-exchange.com/questions/29088597/Change-Multiple-csv-files-into-xlsx-files.html?notificationFollowed=205599875

    'Constants 
    Const xlOpenXMLWorkbook = 51             '(without macro's in 2007-2016, xlsx)
    Const xlOpenXMLWorkbookMacroEnabled = 52 '(with or without macro's in 2007-2016, xlsm)
    Const xlExcel12 = 50                     '(Excel Binary Workbook in 2007-2016 with or without macro's, xlsb)
    Const xlExcel8 =56                       '(97-2003 format in Excel 2007-2016, xls)
    
    ' Extensions for old and new files
    strExcel = "xlsx"
    strCSV = "csv"
    strXLS = "xls"
    
    ' Set up filesystem object for usage
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    
    strFolder = "B:\EE\EE29088597\Files"
    
    ' Access the folder to process
    Set objFolder = objFSO.GetFolder(strFolder)
    
    ' Load Excel (hidden) for conversions
    Set objExcel = CreateObject("Excel.Application")
    objExcel.Visible = False
    objExcel.DisplayAlerts = False
    
    ' Process all files
    For Each objFile In objFolder.Files
        ' Get full path to file
        strPath = objFile.Path
        ' Only convert CSV files
        If LCase(objFSO.GetExtensionName(strPath)) = LCase(strCSV) Or LCase(objFSO.GetExtensionName(strPath)) = LCase(strXLS) Then
            ' Display to console each file being converted
            Wscript.Echo "Converting """ & strPath & """"
            ' Load CSV into Excel and save as native Excel file
            Set objWorkbook = objExcel.Workbooks.Open(strPath, False, True)
            strNewPath = objFSO.GetParentFolderName(strPath) & "\" & objFSO.GetBaseName(strPath) & "." & strExcel
            objWorkbook.SaveAs strNewPath, xlOpenXMLWorkbook
            objWorkbook.Close False
            Set objWorkbook = Nothing
        End If
    Next
    
    'Wrap up
    objExcel.Quit
    Set objExcel = Nothing
    Set objFSO = Nothing
    

    This will scan the directory for any xls or csv file and convert them into xlsx files.