【问题标题】:Removing Excess Spaces in CSV Using VBA使用 VBA 删除 CSV 中的多余空格
【发布时间】:2016-12-01 16:34:20
【问题描述】:

我正在使用 VBA 脚本将 Excel 文档中的数据编译为 CSV 文件,以便与 PowerCLI 脚本一起使用。我遇到了与列名中有额外空格相关的问题,我想确定一种方法:

引入一个函数来消除我的主 VBA 脚本中的多余空格,或者让与删除多余空格相关的 VBA TrimEText 部分与主 VBA 脚本同时运行

“主”VBA 脚本是:

Function BuildValuesString(colIndex As String, rows As String) As String
    Dim val As Variant

    For Each val In Split(rows, ",")
        If Cells(val, colIndex) <> "" Then BuildValuesString = BuildValuesString & Cells(val, colIndex).Value & " , "
    Next val
End Function
Function BuildNullStrings(numNullStrings As Long) As String
    Dim iNullStrings As Long

    For iNullStrings = 1 To numNullStrings
        BuildNullStrings = BuildNullStrings & "" & " , "
    Next iNullStrings
End Function


Sub WriteCSVFile2()

    Dim My_filenumber As Integer
    Dim logSTR As String

    My_filenumber = FreeFile

    logSTR = logSTR & "Name" & " , "
    logSTR = logSTR & "VLAN" & " , "
    logSTR = logSTR & "NumCPU" & " , "
    logSTR = logSTR & "MemoryGB" & " , "
    logSTR = logSTR & "C" & " , "
    logSTR = logSTR & "D" & " , "
    logSTR = logSTR & "App" & " , "

    logSTR = logSTR & Chr(13)

    logSTR = logSTR & BuildValuesString("C", "18,19,20,21,22")
    logSTR = logSTR & BuildNullStrings(1)
    logSTR = logSTR & BuildValuesString("C", "26,27,28,29,30,31,32")

    logSTR = logSTR & Chr(13)
    logSTR = logSTR & BuildNullStrings(6)

    logSTR = logSTR & BuildValuesString("C", "36,37,38,39,40,41,42")

    logSTR = logSTR & Chr(13)
    logSTR = logSTR & BuildNullStrings(6)

    logSTR = logSTR & BuildValuesString("C", "46,47,48,49,50,51,52")


Open "Z:\Operational Env. Requests\2016\Requests(Test)\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber
    Print #My_filenumber, logSTR
Close #My_filenumber

End Sub

删除多余空格的部分是:

Sub TrimEText()
' This module will trim extra spaces from BOTH SIDES and excessive spaces from inside the text.
    Dim MyCell As Range
    On Error Resume Next
        Selection.Cells.SpecialCells(xlCellTypeConstants, 23).Select
        For Each MyCell In Selection.Cells
            MyCell.Value = Application.WorksheetFunction.Substitute(Trim(MyCell.Value), " ", " ")
            MyCell.Value = Application.WorksheetFunction.Substitute(Trim(MyCell.Value), "", " ")
            MyCell.Value = Application.WorksheetFunction.Substitute(Trim(MyCell.Value), "", " ")
            MyCell.Value = Application.WorksheetFunction.Substitute(Trim(MyCell.Value), "", " ")
            MyCell.Value = Application.WorksheetFunction.Substitute(Trim(MyCell.Value), "", " ")
        Next
    On Error GoTo 0
End Sub

有没有一种方法可以同时运行而不需要在导出的 CSV 文档中选择单元格?就像在 VBA 脚本中指定 CSV 文档本身的单元格一样?

【问题讨论】:

  • 是的 - 不要使用Selection。查看this thread on avoiding the use of .Select。因此,只需设置一个您知道将包含数据的范围(查找最后一行可以帮助将其缩减到使用的范围),然后在其上运行宏。
  • 另外,尽量避免使用On Error Resume Next,它只是掩盖错误而不是处理它们
  • 使用保存为 CSV 的临时工作表或与文本驱动程序的 ADODB 连接,这将变得非常容易且不易出错。

标签: vba excel csv


【解决方案1】:

“我遇到了与列名中有多余空格有关的问题” 这是您在列名中添加空格的情况:

logSTR = logSTR & "名称" & " , "

在最后一行添加一个没有标题的额外列。这可能会带来很大的问题。

logSTR = logSTR & "应用" & " , "

有 7 列而不是 6。BuildNullStrings 不需要 `String(7,",") 做同样的事情。

logSTR = logSTR & BuildNullStrings(6)

这将导致您的数据未对齐并丢失列。

If Cells(val, colIndex) "" Then BuildValuesString = BuildValuesString & Cells(val, colIndex).Value & " , "

重构代码

Sub WriteCSVFile2()
    Dim logSTR As String
    Dim My_filenumber As Integer
    Dim data(6)
    Dim logSTR As String
    data(0) = Join(Array("Name", "VLAN", "NumCPU", "MemoryGB", "C", "D", "App"), ",")
    data(1) = BuildValuesString("C", 18, 19, 20, 21, 22) & String(1, ",")
    data(2) = BuildValuesString("C", 26, 27, 28, 29, 30, 31, 32)
    data(3) = String(7, ",")
    data(4) = BuildValuesString("C", 36, 37, 38, 39, 40, 41, 42)
    data(5) = String(7, ",")
    data(6) = BuildValuesString("C", 46, 47, 48, 49, 50, 51, 52)

    logSTR = Join(data, vbCrLf)

    My_filenumber = FreeFile
    Open "Z:\Operational Env. Requests\2016\Requests(Test)\" & ThisWorkbook.Name & ".csv" For Append As #My_filenumber
    Print #My_filenumber, logSTR
    Close #My_filenumber

End Sub

Function BuildValuesString(colIndex As String, ParamArray RowNumbers()) As String
    Dim x As Long
    Dim result As String
    For x = 0 To UBound(RowNumbers)
        RowNumbers(x) = Trim(Cells(clong(RowNumbers(x)), colIndex).Value)
        If Cells(val, colIndex) <> "" Then BuildValuesString = BuildValuesString & Cells(val, colIndex).Value & " , "
    Next
    BuildValuesString = Join(RowNumbers, ",")
End Function

修剪使用范围

Sub TrimData() Application.ScreenUpdating = False 调暗 c 作为范围

For Each c In ActiveSheet.UsedRange.SpecialCells(xlCellTypeConstants)
    c.Value = Trim(c.Value)
Next

Application.ScreenUpdating = True

结束子

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-09
    • 2014-09-24
    • 2012-01-24
    • 2021-05-31
    • 2016-05-19
    • 1970-01-01
    • 2023-01-16
    • 2019-03-03
    相关资源
    最近更新 更多