我正在尝试自动执行将Excel工作簿转换为CSV文件的任务。生成的文件应为分号和管道分隔。但是我只能获得逗号分隔文件。我尝试使用SaveAs
参数,但没有帮助。
有人可以建议在VBScript中执行此操作。
这是我的代码,可以将工作簿转换为CSV。我甚至试图用管道或分号替换逗号,但这是超级错误导致不正确的数据。
Dim strExcelFileName
Dim strCSVFileName
strDelimiter = "|"
strExcelFileName = "file_temp" '
Set fso = CreateObject ("Scripting.FileSystemObject")
strScript = WScript.ScriptFullName
strScriptPath = fso.GetAbsolutePathName(strScript & "\..")
WScript.Echo strScriptPath
'If the Input file is NOT qualified with a path, default the current path
LPosition = InStrRev(strExcelFileName, "\")
If LPosition = 0 Then 'no folder path
strExcelFileName = strScriptPath & "\file\" & strExcelFileName
strScriptPath = strScriptPath & "\"
Else 'there is a folder path, use it for the output folder path also
strScriptPath = Mid(strExcelFileName, 1, LPosition)
End If
'MsgBox LPosition & " - " & strExcelFileName & " - " & strScriptPath ' use this for debugging
Set objXL = CreateObject("Excel.Application")
Set objWorkBook = objXL.Workbooks.Open(strExcelFileName)
objXL.DisplayAlerts = False
'loop over worksheets
For Each sheet In objWorkBook.Sheets
'only saveAS sheets that are NOT empty
If objXL.Application.WorksheetFunction.CountA(sheet.Cells) <> 0 Then
sheet.Rows(1).Delete ' this will remove Row 1 or the header Row
Select Case sheet.Name
Case "Sales"
sheet.SaveAs strScriptPath & "abc_sales.csv", 23, local=true 'CSV
Case "Goals"
sheet.SaveAs strScriptPath & "abc_file_goals.csv", 6 'CSV
Case "Commissions"
sheet.SaveAs strScriptPath & "abc_file_coms.csv", 6 'CSV
Case Else
sheet.SaveAs strScriptPath & "abc_file_coms.csv", 6 'CSV
End Select
End If
Next
'clean up
objWorkBook.Close
objXL.Quit
Set objXL = Nothing
Set objWorkBook = Nothing
Set fso = Nothing
编辑我在下面的代码中尝试了强制本地设置和windows csv格式。但它是stil生成逗号分隔文件。本地设置被设置为管道。
sheet.SaveAs strScriptPath & "abc.csv", 23, local=true
答案 0 :(得分:0)
测试它:更新(字段local
位置 10!)
- for VBScript -
,,,,,,,,,,真实的最后位置是'本地'
(ty @Lankymart)
- for VBA -
FileFormat:= xlCSVWindows,Local:= True
然后来自区域设置的分隔符
默认为
本地:=假(默认)
永远','
https://msdn.microsoft.com/en-us/vba/excel-vba/articles/workbook-saveas-method-excel
Workbook.SaveAs方法(Excel)
<强>语法
强>
表达。 SaveAs(FileName,FileFormat,Password,WriteResPassword,ReadOnlyRecommended,CreateBackup,AccessMode,ConflictResolution,AddToMru,TextCodepage,TextVisualLayout,Local)
本地 可选变体
True会根据Microsoft Excel语言保存文件(包括控制面板设置)。 False(默认)将文件保存为Visual Basic for Applications(VBA)的语言(除非运行Workbooks.Open的VBA项目是旧的国际化XL5 / 95 VBA项目,否则它通常是美国英语)。
对于TextVisualLayout和TextCodepage, 但在Description
列中写道:
忽略Microsoft Excel中的所有语言。
因此,恕我直言,该函数中的参数数量从12减少到10
并将文件格式设置为23:
XlFileFormat Enumeration (Excel)
名称值描述
xlCSV 6 CSV
xlCSVMac 22 Macintosh CSV
xlCSVMSDOS 24 MSDOS CSV
xlCSVWindows 23 Windows CSV
现在这里有趣的部分发生了......默认情况下,Excel会使用逗号作为分隔符,但如果你打开控制面板 - &gt;区域和语言,然后单击底部的其他设置按钮...
现在仔细查看“列表分隔符”项,该字段通常在字段中有逗号,但为了说明的目的,我已将其切换为管道字符。
我希望这有帮助!
简短示例中的最终解决方案:for VBScript
(放在档案* .vbs中)
Set objXL = CreateObject("Excel.Application")
Path = Replace(WScript.ScriptFullName,WScript.ScriptName, "")
Set objWorkBook = objXL.Workbooks.Open(Path & "file_temp")
objXL.DisplayAlerts = False
'eight comma
objWorkBook.WorkSheets("Sales").SaveAs Path & "abc_sales", 23 , , , , , , , , True
'clean up
objWorkBook.Close
objXL.Quit
Set objXL = Nothing
Set objWorkBook = Nothing
脚本在脚本文件夹中创建文件abc_sales
(CSV类型),文件为file_temp
(Excel的类型为1张“Sales”)。
在上面的字段List Separator
中设置分隔符
或全自动变体:
strDelimiter = "|"
strDelimiterPath = "HKCU\Control Panel\International\sList"
Set WshShell = WScript.CreateObject("WScript.Shell")
strOldDelimiter = WshShell.RegRead(strDelimiterPath)
WshShell.RegWrite strDelimiterPath, strDelimiter, "REG_SZ"
Set objXL = CreateObject("Excel.Application")
strPath = Replace(WScript.ScriptFullName,WScript.ScriptName, "")
Set objWorkBook = objXL.Workbooks.Open(strPath & "file_temp")
objXL.DisplayAlerts = False
'eight comma
objWorkBook.WorkSheets("Sales").SaveAs Path & "abc_sales", 23 , , , , , , , , True
'clean up
WshShell.RegWrite strDelimiterPath, strOldDelimiter, "REG_SZ"
objWorkBook.Close
objXL.Quit
Set objXL = Nothing
Set objWorkBook = Nothing
简短示例中的最终解决方案:VBА
(放在file_temp.xlsm
的模块中)
Attribute VB_Name = "Module1"
Sub Sheets2CSV()
Set awb = ActiveWorkbook
Sheets.Copy
For Each Sheet In ActiveWorkbook.Sheets
'only saveAS sheets that are NOT empty
If Sheet.Application.WorksheetFunction.CountA(Sheet.Cells) <> 0 Then
Sheet.Rows(1).Delete ' this will remove Row 1 or the header Row
Select Case Sheet.Name
Case "Sales"
Sheet.SaveAs awb.Path & "\abc_sales", xlCSVWindows, local:=True
Case "Goals"
Sheet.SaveAs awb.Path & "\abc_file_goals", xlCSVWindows, local:=True
Case "Commissions"
Sheet.SaveAs awb.Path & "\abc_file_coms", xlCSVWindows, local:=True
Case Else
Sheet.SaveAs awb.Path & "\abc_file_sheet_" & Sheet.Name, xlCSVWindows, local:=True
End Select
End If
Next
ActiveWorkbook.Close 0
End Sub
答案 1 :(得分:0)
作为pointed out in the comments,您必须定义命名常量,因为VBScript无法访问Excel对象类型库,因此不知道如何将它们与其数值相关联。
VBScript也不支持命名参数语法,例如#;
Sheet.SaveAs Filename:=strScriptPath & "abc_sales" & ".csv", FileFormat:=xlCSVWindows, local:=True
将失败
Microsoft VBScript编译错误:
语法错误
因为Filename:=
对VBScript没有任何意义。
相反,你想做这样的事情;
'Define your Named Constants
'XlFileFormat Enumeration
Const xlCSVWindows = 23
'...
'SaveAs call should match the number of arguments (optional or not).
Call sheet.SaveAs(strScriptPath & "abc.csv", xlCSVWindows, , , , , , , , , , True)
...
- 表示示例中未包含的现有代码。
# - 根据comments
中的https://stackoverflow.com/a/47281574/692942进行回答