Как удалить строки данных, где находится строка? - PullRequest
0 голосов
/ 18 декабря 2018

Мне нужна помощь в устранении неполадок с макросом, который я написал для удаления строк из файлов CSV или TXT, если существует строка ввода пользователя.

Я объявил переменные для File1, File2, File3и т. д., основанные на входном текстовом файле, который всегда имеет разные пути к файлам, которые необходимо искать.Эта часть кода работает.

В следующей части кода предполагается, что расширение файла каждого файла и на основе этого вызова правильная процедура.

Когда я запускаю кодв некоторых файлах, где первые 4 были .csv, а 5-й был .txt, в файлах csv ничего не происходило, но 5-й файл был сохранен как 4-й файл.

Кто-нибудь может увидеть, что я сделал неправильно?Вот?Приведенные ниже фрагменты кода:

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

(выше приведено, чтобы можно было искать больше файлов) ...

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

Любая помощь или направление будут чрезвычайно полезны!

Спасибо.

1 Ответ

0 голосов
/ 18 декабря 2018

Вы выполняете разные биты одного и того же процесса в разных подпрограммах и полагаетесь на правильную активную книгу, поэтому неудивительно, что она получает неправильный файл.Переключите ваш верхний код в форму

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

Теперь поместите весь остальной код в две подпрограммы:

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

и

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

КакОбщий принцип: файл должен быть закрыт той же самой подпрограммой, которая его открыла, и вы всегда должны явно указывать указатели на рабочие книги в качестве аргументов - не полагайтесь на activeworkbook, который все еще остается тем, который вы хотите, когда вызывается ваша подпрограмма.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...