如何在VBA中仅对CSV特定行应用RemoveTrailing函数?
修改VBA代码实现特定行移除末尾分号
没问题,我来帮你调整这段代码,让它只对第1、2行,最后一行以及倒数第二行应用RemoveTrailing函数,其余行直接输出。
核心思路
要实现这个需求,我们需要先把CSV文件的所有内容读入一个数组,这样就能提前知道总行数,方便定位最后两行。之后遍历数组时,判断当前行是否是我们需要处理的目标行,再决定是否调用移除函数。
修改后的完整代码
Option Explicit Public Function RemoveTrailing(s As String) As String Dim nIndex As Integer For nIndex = Len(s) To 1 Step -1 If Right$(s, 1) = ";" Then s = Left$(s, Len(s) - 1) Else ' 遇到非分号就停止循环,提升效率 Exit For End If Next RemoveTrailing = s End Function Sub ExportAsCSV() Dim MyFileName As String Dim CurrentWB As Workbook, TempWB As Workbook Set CurrentWB = ActiveWorkbook ActiveWorkbook.ActiveSheet.UsedRange.Copy Set TempWB = Application.Workbooks.Add(1) With TempWB.Sheets(1).Range("A1") .PasteSpecial xlPasteValues .PasteSpecial xlPasteFormats End With MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv" Application.DisplayAlerts = False TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True TempWB.Close SaveChanges:=False Application.DisplayAlerts = True Dim sFile2 As String Dim sLine As String Dim arrLines() As String Dim totalLines As Long Dim i As Long sFile2 = Replace(MyFileName, ".csv", "SANS_VIDE.csv") ' 第一步:把所有行读入数组,获取总行数 Open MyFileName For Input As #1 ReDim arrLines(0 To 0) Do Until EOF(1) Line Input #1, sLine arrLines(UBound(arrLines)) = sLine ReDim Preserve arrLines(0 To UBound(arrLines) + 1) Loop ' 移除最后一个空元素(因为循环结束时多扩了一次容) ReDim Preserve arrLines(0 To UBound(arrLines) - 1) totalLines = UBound(arrLines) + 1 ' 数组从0开始,总行数是下标+1 Close #1 ' 第二步:遍历数组,只处理特定行 Open sFile2 For Output As #2 For i = LBound(arrLines) To UBound(arrLines) ' 判断当前行是否是目标行:第1、2行,倒数第二行、最后一行 Select Case i + 1 ' 数组下标从0开始,行号是下标+1 Case 1, 2, totalLines - 1, totalLines Print #2, RemoveTrailing(arrLines(i)) Case Else Print #2, arrLines(i) End Select Next i Close #2 End Sub
关键细节说明
- 读入数组获取总行数:通过把所有行先读进数组,我们能直接通过
UBound(arrLines)+1得到CSV的总行数,这样就能轻松定位倒数第二行(totalLines-1)和最后一行(totalLines)。 - 优化
RemoveTrailing函数:我给原函数加了Exit For,当遇到第一个非分号的字符时就停止循环,不用遍历整个字符串,提升了处理效率。 - 行号判断:因为数组下标从0开始,所以当前行的实际行号是
i+1,用Select Case来判断是否是需要处理的行,逻辑清晰易懂。
内容的提问来源于stack exchange,提问作者Jean
相关产品推荐
相关产品推荐

