我正在使用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文档本身的单元格吗?
答案 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