Editar archivos CSV y de texto con Excel VBA sin dañarlos
Fecha de publicación:
Actualizado:
Artículos técnicos > Editar archivos CSV y de texto con Excel VBA sin dañarlos
Estado 2026 y uso seguro
Conclusión: Trate un archivo de texto sin formato como líneas sólo cuando su formato esté realmente orientado a líneas. Un campo CSV puede contener comas, comillas y saltos de línea, así que utilice un analizador compatible con CSV para datos CSV generales y escriba en un archivo temporal antes de reemplazar el original.
Qué aprenderás
- En qué se diferencian los modos de E/S de archivos de VBA para entrada, adición y salida.
- Cómo la codificación, el estilo de nueva línea, el bloqueo de archivos y la recuperación de errores afectan una reescritura.
- Por qué la división simple de cadenas no es segura para registros CSV arbitrarios de estilo RFC.
Para quién: usuarios de Excel que mantienen macros de procesamiento de texto pequeñas y controladas.
Situación en 2026: La macro original muestra un flujo de trabajo local específico y no se ha generalizado en una biblioteca CSV sin pérdidas. Realice una copia de seguridad de los archivos representativos, pruebe los valores citados y de varias líneas, y no ejecute una reescritura en la única copia de producción.
Nota de seguridad: Los comandos y ejemplos de configuración del artículo original no se han vuelto a ejecutar en un entorno de producción actual. Verifique las versiones compatibles, las copias de seguridad, los controles de acceso y los pasos de reversión en un entorno de prueba independiente antes de aplicarlos.
Fuentes primarias oficiales
Resumen.
Este artículo muestra cómo editar archivos CSV y de texto con VBA y cubre estas tareas:
- Quiero añadir filas a un archivo csv o de texto ya existente. Quiero añadir texto en medio de una línea.
- Quiero eliminar líneas en un archivo csv o de texto ya existente.
Índice de contenidos
1. Método de programación
En conclusión, FileSystemObject no tiene la capacidad de añadir en medio de una línea o eliminar una línea específica, por lo que tienes que programarlo tú mismo.
A continuación se ofrecen ejemplos de referencia de programación.
Como está creado en Function, espero que puedas traerlo tal cual copiando y pegando, y que llame a métodos de 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
Para utilizarlo, pase los argumentos como se indica a continuación.
- filePath: Esta será la ruta completa del archivo. Ejemplo.)C:\Users\user\Desktop\test\test.txt
- mode: Pasar verdadero, falso. En caso de que sea cierto, añade. Si es falso, elimina la fila.
- targetRow: Especifica el número de filas de destino. En el caso de las adiciones, es el número de líneas que hay que añadir, y en el caso de las supresiones, es el número de líneas que hay que eliminar.
- targetInput: En el caso de los postscriptores, especifique el valor que debe añadirse. No se utiliza para el borrado y puede ser un valor arbitrario. También se aceptan letras vacías.
- lineBreakType: Ajuste de los caracteres de nueva línea. Si es verdadero, vbCrLf. vbLf si False. En resumen, True para los archivos creados en Windows.
La codificación de caracteres es UTF-8, pero si quiere cambiarla, modifique el código de la función directamente. Hay dos lugares donde ".Charset = "UTF-8"".
A continuación se muestra un ejemplo de implementación de una llamada a una función real.
Sub test()
'Ejemplo de añadir test123 a la línea 5 de test.txt.(Archivos creados en Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", True, 5, "test123", True
'Ejemplo de eliminación de la línea 5 de test.txt.(Archivos creados en Windows.)
editFile "C:\Users\user\Desktop\test\test.txt", False, 5, "", True
End Sub
Si quiere anexar como un csv, haga que el argumento del valor a anexar sea un valor separado por comas, y se anexará un valor separado por comas. Ejemplo.)"test1,test2,test3"
2. Descripción del código.
Aquí terminan las instrucciones de uso del sistema, seguidas de una explicación del código.
Los detalles se pueden encontrar en el código, pero un flujo de proceso aproximado es el siguiente.
Para la posdata.
- ①Lectura de archivos de texto en rutas pasadas como argumentos.
- ②El número de caracteres hasta el número de líneas pasadas en el argumento se especifica a partir del número de nuevas líneas. Por ejemplo, para la línea 5, hay cuatro saltos de línea antes de la línea 5, así que encuentre la posición donde se encuentra el cuarto salto de línea
- ③Recuperar la información hasta la línea 4.
- ④(2) Adquirir la información a partir de la línea 5 de la misma manera que (2).
- ⑤Se combinan la información de (3), la información a añadir pasada como argumento y la información de (4).
- ⑥Cree un archivo basado en la información de (5) y sobrescriba el archivo.
En caso de supresión
- ①Lectura de archivos de texto en rutas pasadas como argumentos.
- ②El número de caracteres hasta el número de líneas pasadas en el argumento se especifica a partir del número de nuevas líneas. Por ejemplo, para la línea 5, hay cuatro saltos de línea antes de la línea 5, así que encuentre la posición donde se encuentra el cuarto salto de línea
- ③Recuperar la información hasta la línea 4.
- ④(2) Adquirir la información a partir de la línea 6 de la misma manera que (2).
- ⑤La información de (iii) y (iv) se combina. (Crea una cadena sin quinta línea.)
- ⑥Cree un archivo basado en la información de (5) y sobrescriba el archivo.
En el caso de la anexión y el borrado, ambos son iguales, pero en lugar de editar el archivo, se hace como si sólo se extrajera la información necesaria del archivo original y se crea un nuevo archivo y se guarda encima.
3. resumen
Si tiene problemas para editar archivos csv/texto con VBA (macros de Excel), consulte esta sección.