【问题标题】:How can I Open all CSV files in a folder, Run text to columns, then Save as new file?如何打开文件夹中的所有 CSV 文件,将文本运行到列,然后另存为新文件?
【发布时间】:2018-03-19 15:14:10
【问题描述】:

我必须整理一个宏来读取文件夹中的所有 CSV,应用分隔符,然后另存为新文件。
目前我可以让它打开一个文件夹中的所有 CSV 并将它们保存为新的工作簿,但是在该过程的中间应用文本到列是很棘手的。

Sub CSVtoXLS()
Dim xFd As FileDialog
Dim xSPath As String
Dim xCSVFile As String
Dim xWsheet As String
Application.DisplayAlerts = False
Application.StatusBar = True
xWsheet = ActiveWorkbook.Name
Set xFd = Application.FileDialog(msoFileDialogFolderPicker)
xFd.Title = "Select a folder:"
If xFd.Show = -1 Then
    xSPath = xFd.SelectedItems(1)
Else
    Exit Sub
End If
If Right(xSPath, 1) <> "\" Then xSPath = xSPath + "\"
xCSVFile = Dir(xSPath & "*.csv")
Do While xCSVFile <> ""
    Application.StatusBar = "Converting: " & xCSVFile
    Workbooks.Open Filename:=xSPath & xCSVFile
    
    Columns("A:A").Select
Selection.TextToColumns Destination:=Range("A1"), DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _
    :="|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, _
    1), Array(6, 1), Array(7, 1), Array(8, 1), Array(9, 1), Array(10, 1), Array(11, 1), Array(12 _
    , 1), Array(13, 1), Array(14, 1), Array(15, 1), Array(16, 1), Array(17, 1), Array(18, 1), _
    Array(19, 1), Array(20, 1), Array(21, 1), Array(22, 1), Array(23, 1), Array(24, 1), Array( _
    25, 1), Array(26, 1), Array(27, 1), Array(28, 1), Array(29, 1), Array(30, 1), Array(31, 1), _
    Array(32, 1), Array(33, 1), Array(34, 1), Array(35, 1), Array(36, 1), Array(37, 1), Array( _
    38, 1), Array(39, 1), Array(40, 1), Array(41, 1), Array(42, 1)), TrailingMinusNumbers _
    :=True
    
    ActiveWorkbook.Close
    Windows(xWsheet).Activate
    xCSVFile = Dir
Loop
Application.StatusBar = False
Application.DisplayAlerts = True
End Sub

【问题讨论】:

  • 这里的关键点是如何“应用分隔符”,那么您能否准确解释一下您的情况是什么意思?例如,是否存在制表符分隔符并且您想将它们全部替换为逗号?如果是这样,是否只是用逗号替换每个文件中的所有选项卡?等等。
  • CSVS 的格式如下 员工编号|POST ID|DATE COMMENCED POST|DATE COMMENCED POSTPS|DATE CEASED 所以我需要将“|”分开所有文本当前都在单元格 A1 中,我需要将其全部拆分到相关单元格中,以便 A1、B1、C1 等沿行向下。
  • 那么这是否意味着只需替换所有 |与其他角色?如果是这样,有许多程序可以跨多个文件进行批量查找和替换,例如记事本++、括号等...
  • 这将是在每个 | 之前打破所有内容的情况并将其放置在单元格中。因此,例如,如果它是 A|B|C|D|E,那么 A 将在 A1 中,B 将在 B1 中,C 将在 C1 中,依此类推。我被要求通过 Excel 中的宏来执行此操作。我认为文本到列是最简单的方法吗?
  • 听起来您在描述 Excel 的导入向导所做的事情。数据-->获取数据-->从文件-->从文本/csv。你试过吗?

标签: vba excel csv delimiter


【解决方案1】:

将 csv 文件与工作簿放在同一目录后,请尝试以下代码。

Option Explicit
Dim theDir As String, wk As Workbook, numFiles As Integer, s As String, r As Range
Const ext = ".csv"

Sub csvToXLSX()
  theDir = ThisWorkbook.Path
  s = Dir(theDir & "\*" & ext)
  While s <> ""
    Set wk = Workbooks.Open(theDir & "\" & s)
    Set r = Range(Range("A1"), Range("A1").End(xlDown))
    r.TextToColumns Destination:=r, DataType:=xlDelimited, _
    TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _
    Semicolon:=False, Comma:=True, Space:=False, Other:=True, OtherChar:= _
    "|", FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1)) _
    , TrailingMinusNumbers:=True
    Application.DisplayAlerts = False
    wk.SaveAs Filename:=theDir & "\" & s & ".xlsx", FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
    wk.Close False
    Application.DisplayAlerts = True
    s = Dir()
    numFiles = numFiles + 1
  Wend
  MsgBox (numFiles & " files were processed.")
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多