Cómo eliminar filas de datos donde se encuentra una cadena?

votos
0

Necesito ayuda para solucionar un macro que he escrito para eliminar líneas de un fichero CSV o TXT si existe una cadena de entrada de usuario.

He declarado variables para File1, File2, File3etc., que se basan en un archivo de texto de entrada que siempre tiene diferentes rutas de los archivos que necesitan ser buscado. Esta parte del código funciona.

La siguiente parte del código se supone que se vea en la extensión de archivo de cada archivo y en base a esta llamada el procedimiento correcto.

Cuando me encontré con el código en algunos archivos, donde los primeros 4 eran .csv y el quinto estaba .txt, no pasó nada en los archivos csv pero el archivo quinto se guardó como el cuarto de archivos.

¿Hay alguien capaz de ver lo que he hecho mal aquí? Fragmentos de código a continuación:

Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False

Dim myOutput As String:
myOutput = G:\Team Drives\Technology Team\Data Management\Admin\GDPR\tempoutput.txt

If File1 <>  Then
    If Right$(File1, 3) = csv Then
    Workbooks.Open File1
    Call cleanCSV
Else
    Open File1 For Input As #1
    Call cleanTXT
    File1.Close
      ActiveWorkbook.Close
      Kill myOutput

      End If
End If


If File2 <>  Then
If Right$(File2, 3) = csv Then
    Workbooks.Open File2
    Call cleanCSV
Else

    Open File2 For Input As #1
    Call cleanTXT
    File2.Close
    ActiveWorkbook.SaveAs fileName:=File2
      ActiveWorkbook.Close
      Kill myOutput
      End If
End If

(Aboves lleva a cabo para permitir más archivos que desea buscar) ...

Sub cleanCSV()

'removes rows in csv files where the entered email is found
Dim Cell As Variant
Dim SrchRng As Range
Set SrchRng = ActiveSheet.UsedRange
lastIndex = SrchRng.Rows.Count
    For i = lastIndex To 1 Step -1
    For Each Cell In SrchRng.Rows(i).Cells
        If Cell.Value = SrchStr Then
        Debug.Print
            Cell.EntireRow.Delete
            Exit For
        End If
    Next
Next
ActiveWorkbook.Close SaveChanges:=True
End Sub


Sub cleanTXT()

Dim str As String

'removes lines in text files where the entered email is found
Const myOutput As String = G:\Team Drives\Technology Team\Data Management\Admin\GDPR\tempoutput.txt
Open myOutput For Output As #2
  Do Until VBA.EOF(1)
    Line Input #1, str
        If InStr(1, str, SrchStr) = 0 Then
            Print #2, str
        End If
Loop

End Sub

Cualquier ayuda o dirección serán muy apreciados!

Gracias.

Publicado el 18/12/2018 a las 11:11
fuente por usuario
En otros idiomas...                            


1 respuestas

votos
0

Que está haciendo diferentes partes de un mismo proceso en diferentes subrutinas, y confiando en la ActiveWorkbook siendo el más adecuado, por lo que no es de extrañar que se está haciendo el archivo incorrecto. Cambiar el código de arriba en la forma

If File1 <> "" Then
    If Right$(File1, 3) = "csv" Then
        CleanCsv File1
    Else
        cleanTXT File1
    End If
End If

Ahora poner todo el resto del código en los dos subprogramas:

Sub CleanCSV(filetoclean as string)
Dim wb as workbook
set wb = Workbooks.open(filetoclean)
Dim Cell As Variant
Dim SrchRng As Range
Set SrchRng = wb.sheets(1).UsedRange
'etc....
wb.close
end sub

y

Sub CleanTxt(filetoclean as string)
Open Filetoclean For Input As #1
Dim myOutput As String:
myOutput = "G:\Team Drives\Technology Team\Data Management\Admin\GDPR\tempoutput.txt"
etc...

Como principio general, un archivo debe ser cerrado por la misma rutina que la abrió, y siempre se debe pasar explícitamente referencias a libros como argumentos - no se basan en la ActiveWorkbook dejar de ser el que usted desea cuando su rutina se llama.

Respondida el 18/12/2018 a las 11:30
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more