[英]how to convert excel file to CSV file (pipe delimited) using excel vba
[英]How to convert Excel to semicolon or pipe delimited file using script?
我正在尝试自动化将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格式。 但是它仍然生成逗号分隔的文件。 本地设置被设置为管道。
sheet.SaveAs strScriptPath & "abc.csv", 23, local=true
测试它: UPDATED( local
字段为位置10! )
- 对于VBScript-
,,,,,,,,,True
最后一个职位是“本地”
(ty @Lankymart)
- 对于VBA-
FileFormat:= xlCSVWindows,Local:= True
然后从区域设置中定界
默认为
本地:=假(默认)
总是','
https://msdn.microsoft.com/zh-CN/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
的列Description
中,BUT的写法是:
忽略Microsoft Excel中的所有语言。
恕我直言,因此函数中的参数数量从12减少到10
并将文件格式设置为23:
名称值说明
xlCSV 6 CSV
xlCSVMac 22 Macintosh CSV
xlCSVMSDOS 24 MSDOS CSV
xlCSV Windows 23 Windows CSV
现在,这里是有趣的部分发生了……默认情况下,Excel将使用逗号作为分隔符,但是如果您打开“控制面板”->“区域和语言”,然后单击底部的“其他设置”按钮...
现在,请仔细查看“列表分隔符”项,该字段通常在该字段中带有逗号,但是出于说明目的,我将其切换为Pipe字符。
我希望这有帮助!
简短示例的最终解决方案: 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
脚本make文件abc_sales
脚本的文件夹,并用文件(CSV类型的) file_temp
(含1片“销售”类型的Excel)。
在上方字段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
如注释中所指出的 ,您必须定义命名常量,因为VBScript无法访问Excel对象类型库,因此不知道如何将它们与它们的数值关联。
VBScript也不支持诸如#这样的命名参数语法;
Sheet.SaveAs Filename:=strScriptPath & "abc_sales" & ".csv", FileFormat:=xlCSVWindows, local:=True
会因失败而失败
Microsoft VBScript编译错误:
语法错误
as 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)
...
表示示例未包含的现有代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.