Я написал макрос для удаления строк из файлов csv или txt, если существует строка ввода пользователя.
Я объявил переменные для File1
, File2
, File3
и т. д., Которые основаны на входном текстовом файле, который всегда имеет разные пути к файлам, которые необходимо искать. Эта часть кода работает.
Следующая часть кода должна смотреть на расширение каждого файла и на основе этого вызывать правильную процедуру.
Когда я запускал код для некоторых файлов, где первые четыре были .csv, а пятый - .txt, в файлах csv ничего не происходило, но пятый файл был сохранен как четвертый.
Фрагменты кода ниже:
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
Вы выполняете разные части одного и того же процесса в разных подпрограммах и полагаетесь на то, что activeworkbook является правильным, поэтому неудивительно, что он получает неправильный файл. Поместите свой главный код в форму
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...
Как правило, файл должен быть закрыт той же процедурой, которая открыла его, и вы всегда должны явно передавать указатели на книги в качестве аргументов - не полагайтесь на то, что активная книга по-прежнему будет той, которую вы хотите, когда ваша подпрограмма вызывается.
Я сделал именно то, что было предложено, но теперь запуск кода дает мне ошибку «Несоответствие типа аргумента ByRef» и выделяет Файл1 после cleanCSV File1
.
File1 - это строка? Если вы уже открыли его как текстовый поток, вы получите эту ошибку, но основная процедура не должна этого делать. Попробуйте запустить с помощью F8, чтобы пройти и посмотреть, каково значение файла 1.
По какой-то причине теперь File1 оценивается как не имеющий значения, то же самое для File2. Но следующие файлы имеют правильный путь к файлу. Раньше он работал нормально (и я не касался этого кода), есть ли очевидная причина, по которой это могло произойти?
Какой код вы используете для установки File1 и как он затемнен?
Спасибо ... Я попробую