Wie Reihen von Daten zu löschen, wenn eine Zeichenfolge gefunden wird?

stimmen
0

Ich brauche Hilfe eines Makros zur Fehlerbehebung ich geschrieben habe Zeilen aus CSV- oder TXT-Dateien zu löschen, wenn ein Benutzer Eingabestring vorhanden ist.

Ich habe deklarierten Variablen für File1, File2, File3etc. , die auf einer Eingangstextdatei basieren, die immer unterschiedliche Dateipfade hat , die durchsucht werden müssen. Dieser Teil des Codes funktioniert.

Der nächste Teil des Codes soll bei der Dateierweiterung jeder Datei suchen und zu diesem Aufruf die korrekte Vorgehensweise basiert.

Wenn ich den Code für einige Dateien lief, wo die ersten 4 .csv und der 5. war .txt waren, ist nichts passiert in der CSV-Dateien, aber die fünfte Datei wurde als 4. Datei gespeichert.

Ist jemand in der Lage zu sehen, was ich hier falsch gemacht habe? Code-Schnipsel unten:

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 trägt auf, um weitere Dateien zu ermöglichen, durchsucht werden) ...

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

Jede Hilfe oder Richtung wird sehr geschätzt!

Vielen Dank.

Veröffentlicht am 18/12/2018 um 11:11
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Sie tun, verschiedene Bits des gleichen Prozesses in verschiedenen Subroutinen und wobei die rechten auf der Active verlassen, so ist es kein Wunder, dass es die falsche Datei zu bekommen. Schalten Sie Ihre Top-Code in das Formular

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

Setzen Sie nun den Rest des Codes in die beiden Unterprogramme:

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

und

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...

Als allgemeines Prinzip sollte eine Datei mit dem gleichen Routine geschlossen werden, dass es geöffnet, und Sie sollten immer explizit Hinweise auf Arbeitsmappen als Argumente übergeben - verlassen Sie sich nicht auf die Active noch ist diejenige, die Sie möchten, wenn Sie Ihre Routine aufgerufen wird.

Beantwortet am 18/12/2018 um 11:30
quelle vom benutzer

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