【问题标题】:Converting CSV to XLS doesn't work with Office 2003将 CSV 转换为 XLS 不适用于 Office 2003
【发布时间】:2019-01-16 21:07:01
【问题描述】:

尝试在装有 MS Office 365 的 PC 中运行下面提到的脚本时,它运行良好,但如果我尝试在装有 MS Office 2003 的 PC 中运行相同的脚本,则会出现错误。

Windows 脚本主机
36号线
字符 17
工作簿类的错误 SaveAs 方法失败
代码 800A03EC
源 Microsoft Office Excel

目标:每隔一分钟将指定文件夹中的所有 CSV 文件转换为 XLS。如上所述,它在安装了 Office 365 的机器上运行良好,但如果我在安装了 Office 2003 的机器上运行它会报错。它们都是独立的机器。请帮我解决这个兼容性问题,这样我就可以在安装了 MS Office 2003 的机器上运行这个脚本。

Dim waittime: waittime = 1 * 60 * 1000
'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

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

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

   ' Access the folder to process
    Set objFolder = objFSO.GetFolder("C:\Users\User\Desktop\CSV to XL")

    ' 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

    WScript.Sleep (waittime)
Loop

【问题讨论】:

  • 工作簿中有多少数据? excel 2003 只能处理 65536 行和 256 列。 o365 可以处理 1,048,576 行和 16,384 列。
  • 肯定在这些数字之内。实际上,行和列不会超过两位数。

标签: excel vbscript


【解决方案1】:

xlFileFormat 枚举的 xlOpenXMLWorkbook 值将文件保存为 Open XML 工作簿仅从 Office 2007 开始支持。现在,由于您想将其保存为 Excel 2003 文件格式,您应该为该使用适当的值,在本例中为xlExcel8

这是xlFileFormat 枚举的所有值的列表:

xlFileFormat enumeration (Excel).

因此,您需要做的是将您对SaveAs 方法的调用中的xlOpenXMLWorkbook 替换为xlExcel8

objWorkbook.SaveAs outputFilePath, xlExcel8 

编辑:

如果您只安装了 Office 2003,则似乎不支持 xlExcel8,因此您需要改用 xlExcel9795。首先,在文件顶部添加这个常量:

Const xlExcel9795 = 43

然后,您可以像这样将它传递给SaveAs 方法:

objWorkbook.SaveAs outputFilePath, xlExcel9795 

【讨论】:

  • @Samarth 实际上,我的错,我误解了你的问题(以为你想从 XLS 转换为 CSV,而不是相反)。我已经编辑了我的答案,所以如果有什么不清楚的地方请告诉我。
  • 看来我还是做错了什么。如果你不介意,你能帮我修改一下代码吗?这样我可以有更好的理解?
  • 问题1:根据您的建议,我应该在右上角提到的常量列表中添加“xlExcel18”吗?它应该等于什么?该值究竟代表什么?那么,也就是说,xlExcel18 = 56,那里的56是什么意思?
  • 问题 2: If LCase(objFSO.GetExtensionName(strPath)) = LCase(strCSV) Then ' 将 CSV 加载到 Excel 并保存为原生 Excel 文件 Set objWorkbook = objExcel.Workbooks.Open(strPath, False , True) objWorkbook.SaveAs Replace(strPath, strCSV, strExcel), xlOpenXMLWorkbook objWorkbook.Close False Set objWorkbook = Nothing End 如果应该改成,究竟是什么。我对语法感到困惑。如果您参考我的代码,我的源文件夹与目标文件夹相同。
  • 您不必将其添加到您的代码中,因为它已经存在。现在,您应该始终阅读文档以了解事情是如何工作的,所以让我为您提供一些链接:SaveAs 方法接受一个名为 FileFormat 的参数,它表示将保存工作簿的格式。现在,有格式的许多选项,如here 所示,每个选项都有说明。其中之一是xlExcel8,它代表 Excel 97-2003 工作簿。
猜你喜欢
  • 2011-06-14
  • 1970-01-01
  • 2014-06-05
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2015-03-18
  • 1970-01-01
相关资源
最近更新 更多