有一个使用更高级的代码(不是我的)创建的 .xlsx 文件。
需要保存为逗号分隔的csv(打开->另存为->关闭文件)。
我编写了 VBA 代码来执行打开->另存为->关闭的操作。为我和一些同事工作。
有些具有不同的 Excel 设置,因此当它们另存为 CSV 文件而不是“,”时,会出现“;”用来。这使得 csv 无法使用。
解决此问题的一种方法是另存为 csv -> 将文件扩展名更改为 .txt -> Ctrl+H 替换所有“;”用“,” - >保存并关闭文件 - >将文件扩展名更改为.csv。
我想确保具有不同 Excel 设置的同事可以创建 csv 文件。具有不同设置的宏(按钮)不同,因此无需更改可用的代码。
使用这行代码可以更改文件格式。计划在 Sub 末尾使用它再次从 .txt 转换为 .csv。
Name "C:\...\Test_csv_saved.csv" As "C:\...\Test_csv_saved.txt"
在网上看了一个,我想我可以用它来代替“;”与“,”。
sTemp = Replace(sTemp, "; ", ",")
仍然需要一种方法来打开该 .txt 文件(也许选择所有文本?),保存并关闭。
该文件没有小数位,因此无需担心。
文件中有一组字符
...;;"ns=2;s=MAIN.test.text;;;..
所以替换所有“;”后这将变成
...,,"ns=2,s=MAIN.test.text,,,..
所以“ns=2,s”需要改回来。
这是文件的一部分。
Tus;W;;;;;;;;;NONE;0;0;0;0;;;;;0;0;0;0;;;;;;;;;;0;;;;;;;;0;;;;0;1;;0;;0;0;0;;1;0;0;0;;EQU;NONE;;;;;
0;0;0;;1;0;0;0;;EQU;NONE;;;;;;;;;;;;;;d;7;1;
;;;;"ns=2;s=MAIN";;;0;;;;;;;;0;;;;0;1;;0;;0;0;0;;1;0;
;;;;"ns=2;s=MAIN";;;0;;;;;;;;0;;;;0;1;;0;;0;0;0;;1;0;
;;;;"ns=2;s=MAIN";;;0;;;;;;;;0;;;;0;1;;0;;0;0;0;;1;0;
;;;;"ns=2;s=MAIN";;;0;;;;;;;;0;;;;0;1;;0;;0;0;0;;1;0;
;;;;"ns=2;s=MAIN.Test.text";;;0;;;;;;;;0;;;;0;1;;0;;0;0;0;;1;0;
Source_Path = "C:...\Test_xlsx_File.xlsx"
Set WB_Source = Workbooks.Open(Source_Path)
WB_Source.Application.DisplayAlerts = False 'Don't show pop-ups
WB_Source.SaveAs Filename:= _
"C:...\Test_csv_saved.csv" _
,FileFormat:=xlCSV, CreateBackup:=False
WB_Source.Application.DisplayAlerts = True 'show pop-ups again
WB_Source.Close (True)
Application.ScreenUpdating = True 'set to false above
实现此目的的一种方法是直接写入文本文件。
以下是编辑后的代码。假设 .xlsx 文件已关闭,然后代码将运行。然后,这将打开 Excel 文件,打开后它也会处于活动状态。
Sub CreateTxtFile()
Dim pathSrc As String, fNameSrc As String, pathTarg As String, fNameTarg As String, myStr As String
Dim fileNumber As Integer, lr As Integer, lc As Integer, rw As Integer, cl As Integer
lr = Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row
pathSrc = "C:\Temp\"
fNameSrc = "Test.xlsx"
Workbooks.Open pathSrc & fNameSrc
pathTarg = "C:\Temp\"
fNameTarg = "OutputTextFile.txt"
fileNumber = FreeFile
Open pathTarg & fNameTarg For Output As fileNumber
For rw = 1 To lr
lc = Worksheets(1).Cells(1, Columns.Count).End(xlToLeft).Column
myStr = ""
For cl = 1 To lc
If cl < lc Then
myStr = myStr & Cells(rw, cl).Value & ","
Else
myStr = myStr & Cells(rw, cl).Value
End If
Next cl
Print #fileNumber, myStr
Next rw
Close fileNumber
结束子
Option Explicit
Sub CreateCSV()
Const SEP = ","
Const FOLDER = "C:...\"
Dim wb As Workbook, ar
Dim r As Long, c As Long, n As Long
Dim Source_Path As String, CSVfile As String, s As String
Source_Path = "Test_xlsx_File.xlsx"
CSVfile = "Test_csv_saved.csv"
Set wb = Workbooks.Open(FOLDER & Source_Path, ReadOnly:=True)
ar = wb.Sheets(1).UsedRange
Dim fso As Object, ts As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set ts = fso.createtextfile(FOLDER & CSVfile)
For r = 1 To UBound(ar)
s = ""
For c = 1 To UBound(ar, 2)
If c > 1 Then s = s & SEP
If IsNumeric(ar(r, c)) Then
s = s & ar(r, c)
Else
s = s & """" & ar(r, c) & """"
End If
Next
ts.writeline s
n = n + 1
Next
ts.Close
wb.Close
MsgBox n & " lines written to " & FOLDER & CSVfile, vbInformation
End Sub
如果您想在文件中进行更改,可以使用此方法:
Option Explicit
Sub ChangeTextFile()
Dim path As String
Dim textFile As Integer
Dim ignore As Boolean
Dim letter
path = "C:\Temp\test.txt"
ignore = False
textFile = FreeFile
Open path For Binary As textFile
Do While Not EOF(textFile)
letter = Input(1, textFile)
If letter = """" Then ignore = Not ignore
If letter = ";" And Not ignore Then Put textFile, Loc(textFile), ","
Loop
Close textFile
End Sub
或者,您可以在另存为 csv 时强制 Excel 使用 , 逗号作为分隔符。那么你根本不需要做任何改变:
Sub saveAsCSV()
Dim path As String
Dim sep As String
Dim blah As Boolean
path = "C:\Temp\Test_csv_saved.csv"
blah = Application.UseSystemSeparators
sep = Application.DecimalSeparator
Application.DecimalSeparator = "."
Application.UseSystemSeparators = False
Application.Workbooks("book1.xlsm").SaveAs Filename:=path, FileFormat:=xlCSV, CreateBackup:=False
Application.UseSystemSeparators = blah
Application.DecimalSeparator = sep
End Sub
您需要添加WB源(我刚刚在测试中使用了活动工作簿)