使用VBA删除CSV中的多余空格

时间:2016-12-01 16:34:20

标签: excel vba excel-vba csv

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

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

'main'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文档本身的单元格吗?

1 个答案:

答案 0 :(得分:3)

“我遇到与列名中有额外空格有关的问题” 以下是您为列名添加空格:

  

logSTR = logSTR&amp; “名字”&amp; “,”

在最后一行添加一个没有标题的额外列。这可能非常有问题。

  

logSTR = logSTR&amp; “App”&amp; “,”

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

  

logSTR = logSTR&amp; BuildNullStrings(6)

这会导致您的数据未对齐且缺少列。

  

如果Cells(val,colIndex)&lt;&gt; “”然后BuildValuesString = BuildValuesString&amp;细胞(val,colIndex).Value&amp; “,”

重构代码

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     Dim c As Range

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

Application.ScreenUpdating = True

End Sub