Como excluir linhas de dados onde uma string é encontrada?

votos
0

Preciso de ajuda solucionar um macro Eu escrevi para apagar linhas de arquivos CSV ou TXT, se existe uma seqüência de entrada do usuário.

Eu anunciei variáveis para File1, File2, File3etc, que são baseados em um arquivo de texto de entrada que tem sempre diferentes filepaths que precisam ser pesquisados. Esta parte do código funciona.

A próxima parte do código é suposto para olhar para a extensão de cada arquivo de arquivo e com base nesta chamada o procedimento correto.

Quando eu corri o código em alguns arquivos, onde os 4 primeiros foram .csv eo 5º foi .txt, nada aconteceu nos arquivos CSV mas o arquivo quinta foi salvo como o 4º arquivo.

Tem alguém capaz de ver o que eu fiz de errado aqui? Trechos de código abaixo:

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 continua para permitir mais arquivos a serem pesquisados) ...

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

Qualquer ajuda ou orientação será extremamente apreciada!

Obrigado.

Publicado 18/12/2018 em 11:11
fonte usuário
Em outras línguas...                            


1 respostas

votos
0

Você está fazendo bits diferentes do mesmo processo em diferentes sub-rotinas, e contando com o ActiveWorkbook sendo o caminho certo, então não é nenhuma maravilha que está ficando o arquivo errado. Mudar o seu código de topo no formulário

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

Agora colocar todo o resto do código para as duas sub-rotinas:

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

e

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 princípio geral, um arquivo deve ser fechado pela mesma rotina que abriu, e você deve sempre explicitamente passar ponteiros para pastas de trabalho como argumentos - não confiar no ActiveWorkbook ainda ser o que você quer quando sua rotina é chamada.

Respondeu 18/12/2018 em 11:30
fonte usuário

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