替换txt文件中的字符

问题描述 投票:0回答:3

有一个使用更高级的代码(不是我的)创建的 .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
excel vba txt
3个回答
1
投票

实现此目的的一种方法是直接写入文本文件。

以下是编辑后的代码。假设 .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

结束子


0
投票
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

0
投票

如果您想在文件中进行更改,可以使用此方法:

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源(我刚刚在测试中使用了活动工作簿)

© www.soinside.com 2019 - 2024. All rights reserved.