如何用VBA(Excel宏)编辑csv和文本文件。


出版日期:2022年7月5日。



INFOMARTION > 如何用VBA(Excel宏)编辑csv和文本文件。

概述。

我想介绍一下如何用VBA(Excel宏)来编辑csv和文本文件。 这篇文章的目的是为那些想要编排以下任务的人准备的

  • 我想在一个已经存在的csv或文本文件中添加行。 我想在一行的中间添加文字。
  • 我想删除一个已经存在的csv或文本文件中的行。

目录

  1. 编程方法
  2. 代码描述。
  3. 摘要

1. 编程方法

总之,FileSystemObject不具备在行中间追加或删除特定行的能力,所以你必须自己编程。

以下是编程的参考例子。

由于它是在Function中创建的,我希望你能通过复制和粘贴把它带进来,并让它从Sub中调用方法。

'Parameter Examples
'## filePath      C:\Users\user\Desktop\test\test.txt
'## mode          false:delete, true:write
'## targetRow     10
'## targetInput   If in write mode, any character
'## lineBreakType false:vbLf, true:vbCrLf

Function editFile(filePath As String, mode As Boolean, targetRow As Long, targetInput As String, lineBreakType As Boolean)
 
'File existence check
If Dir(filePath) = "" Then
  MsgBox "File does not exist!"
  Exit Function
End If
 
Dim tempText As String
Dim tempTextBefore As String
Dim tempTextNew As String
Dim tempTextAfter As String
Dim resultText As String
Dim i As Long
'File read
With CreateObject("ADODB.Stream")
  .Charset = "UTF-8"
  .Open
  .LoadFromFile filePath
  tempText = .ReadText
  .Close
End With
Dim tempTextBeforeRow As Long
tempTextBeforeRow = 0
For i = 1 To targetRow - 1
  If lineBreakType Then
    tempTextBeforeRow = InStr(tempTextBeforeRow + 1, tempText, vbCrLf)
  Else
    tempTextBeforeRow = InStr(tempTextBeforeRow + 1, tempText, vbLf)
  End If
Next i
If lineBreakType Then
  tempTextBeforeRow = tempTextBeforeRow + 1
End If
 
tempTextBefore = Left(tempText, tempTextBeforeRow)
'write
If mode Then
  tempTextAfter = Mid(tempText, tempTextBeforeRow + 1, Len(tempText))
  If lineBreakType Then
    tempTextNew = targetInput & vbCrLf
  Else
    tempTextNew = targetInput & vbLf
  End If
  resultText = tempTextBefore & tempTextNew & tempTextAfter
'delete
Else
  Dim tempTextAfterRow As Long
  tempTextAfterRow = 0
  For i = 1 To CInt(targetRow)
    If lineBreakType Then
      tempTextAfterRow = InStr(tempTextAfterRow + 1, tempText, vbCrLf)
    Else
      tempTextAfterRow = InStr(tempTextAfterRow + 1, tempText, vbLf)
    End If
  Next i
  If lineBreakType Then
    tempTextAfterRow = tempTextAfterRow + 1
  End If
  tempTextAfter = Mid(tempText, tempTextAfterRow + 1, Len(tempText))
  resultText = tempTextBefore & tempTextAfter
End If
 
With CreateObject("ADODB.Stream")
  .Charset = "UTF-8"
  If lineBreakType Then
    .LineSeparator = -1
  Else
    .LineSeparator = 10
  End If
  .Open
  .WriteText tempTextBefore & tempTextNew & tempTextAfter, 0
  .SaveToFile filePath, 2
  .Close
End With
End Function

要使用它,请按以下方式传递参数。

  • filePath・・・这将是该文件的完整路径。 例子。)C:\Users\user\Desktop\test\test.txt
  • mode・・・传真,传假。 如果是真的,则添加。 如果是false,则删除该行。
  • targetRow・・・指定目标行的数量。 在添加的情况下,它是要添加的行数,而在删除的情况下,它是要删除的行数。
  • targetInput・・・对于后文,指定要附加的值。 它不用于删除,可以是一个任意的值。 空的字母也是可以接受的。
  • lineBreakType・・・设置换行符。 如果为真,则vbCrLf。 vbLf if False. 简而言之,对于在Windows中创建的文件来说是真的。

字符编码是UTF-8,但如果你想改变它,直接修改Function代码。 有两个地方出现了".Charset = "UTF-8""。

下面是一个实际函数调用的实现例子。

Sub test()
 
'将test123追加到test.txt的第5行的例子。(在Windows中创建的文件。)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
 
'删除test.txt第5行的例子。(在Windows中创建的文件。)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
 
End Sub

如果你想以csv形式追加,让要追加的值的参数为逗号分隔的值,就会追加一个逗号分隔的值。 例子。)"test1,test2,test3"

2. 代码描述。

关于如何使用该系统的说明到此为止,接下来是对代码的解释。

细节可以在代码中找到,但大致的流程如下。

为后记。

  • ①读取作为参数传递的路径中的文本文件。
  • ②从换行符的数量来指定参数中所传递的字符数,直至行数。 例如,对于第5行,在第5行之前有四个换行符,所以要找到第四个换行符的位置
  • ③检索到第4行的信息。
  • ④(2) 以与(2)相同的方式获取第5行以后的信息。
  • ⑤(3)中的信息、作为参数传递的要附加的信息和(4)中的信息被结合在一起。
  • ⑥根据(5)中的信息创建一个文件,并覆盖该文件。

在删除的情况下

  • ①读取作为参数传递的路径中的文本文件。
  • ②从换行符的数量来指定参数中所传递的字符数,直至行数。 例如,对于第5行,在第5行之前有四个换行符,所以要找到第四个换行符的位置
  • ③检索到第4行的信息。
  • ④(2) 以与(2)相同的方式获取第6行以后的信息。
  • ⑤(iii)和(iv)中的信息被合并在一起。 (创建一个没有第五行的字符串。)
  • ⑥根据(5)中的信息创建一个文件,并覆盖该文件。

在追加和删除的情况下,两者是一样的,但不是编辑文件,而是像只从原文件中提取必要的信息,然后创建一个新的文件并保存过来。

3. 摘要

如果你在用VBA(Excel宏)编辑csv/文本文件时遇到问题,请参考本节。

谢谢你一直看到最后。




■INFORMATION

请点击这里,进入信息首页。


■PROFILE

请点击这里查看简介。


■联系方式。

有关文章的查询,请在此与我们联系。