You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

关键细节说明

  1. 读入数组获取总行数:通过把所有行先读进数组,我们能直接通过UBound(arrLines)+1得到CSV的总行数,这样就能轻松定位倒数第二行(totalLines-1)和最后一行(totalLines)。
  2. 优化RemoveTrailing函数:我给原函数加了Exit For,当遇到第一个非分号的字符时就停止循环,不用遍历整个字符串,提升了处理效率。
  3. 行号判断:因为数组下标从0开始,所以当前行的实际行号是i+1,用Select Case来判断是否是需要处理的行,逻辑清晰易懂。

内容的提问来源于stack exchange,提问作者Jean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:57:00