Notifications
Clear all

Vba para importar - Usuário cancela importação = erro1004

8 Posts
5 Usuários
0 Reactions
1,782 Visualizações
(@diogodvd)
Posts: 0
New Member
Topic starter
 

Olá pessoal,

O Código abaixo está funcionando quando eu escolho o arquivo csv necessário para atualizar, porém se o usuário cancelar a importação aparece a seguinte mensagem:

Erro 1004

O Excel não pode localizar o arquivo de texto para atualizar esse intervalo de dados externos.

Certifique-se de que o arquivo de texto não tenha sido movido ou renomeado e, em seguida, tente a atualização novamente.

Depura o seguinte:

.Refresh BackgroundQuery:=False

Alguém sabe o que pode ser? Além disso, quando eu cancelo a importação, a planilha fica ativa na aba "dados", queria que sempre ficasse ativa na aba "início", pois a aba dados é oculta ao usuário.

Segue código:

Option Explicit

Sub BuscarCSV()
Application.ScreenUpdating = False
    
    'Deletar Valores Anteriores
    Sheets("Dados").Select
    Cells.Clear
        
    Dim Caminho As Variant
    
    Sheets("Dados").Select
    'Escolha qual planilha
    Caminho = Application.GetOpenFilename
        
    'Importa
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Caminho, Destination:=Range("$A$1"))
        
        '.CommandType = 0
        '.Name = "Teste"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileOtherDelimiter = ";"
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        
        
Sheets("Inicio").Select
Application.ScreenUpdating = True
        
        End With

End Sub
 
Postado : 11/04/2018 3:42 pm
(@srobles)
Posts: 0
New Member
 

diogodvd,

Experimente tratar o erro, conforme exemplo que deixo abaixo:

Option Explicit

Sub BuscarCSV()
Application.ScreenUpdating = False
   
    'Deletar Valores Anteriores
    Sheets("Dados").Select
    Cells.Clear
       
    Dim Caminho As Variant

    'Se houver erro, vá para o parágrafo trataErro
    On Error GoTo trataErro

    Sheets("Dados").Select
    'Escolha qual planilha
    Caminho = Application.GetOpenFilename
       
    'Importa
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Caminho, Destination:=Range("$A$1"))
       
        '.CommandType = 0
        '.Name = "Teste"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileOtherDelimiter = ";"
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
'Tratamento de erro
trataErro:
   If Err=1004 Then       
       MsgBox "Operação cancelada pelo usuário!", vbExclamation, "Erro"
       Sheets("Inicio").Select
       Application.ScreenUpdating = True
       Exit sub
   End If

Sheets("Inicio").Select
Application.ScreenUpdating = True
       
        End With

Teste e retorne.

Abs

End Sub

 
Postado : 11/04/2018 6:14 pm
(@diogodvd)
Posts: 0
New Member
Topic starter
 

Srrobles,

Isso mesmo, perfeito, nem sei como agradecer...

Muito obrigado...

Isso não é problema, mas tem como a planilha ficar com os dados que estavam preenchidos se o usuário cancelar a importação? Pois ao cancelar ele zera tudo... Mas tipo assim não tem problema, só gostaria de saber se tem como.

Novamente agradeço.

Abs

 
Postado : 11/04/2018 6:28 pm
(@mprudencio)
Posts: 0
New Member
 

O que vc pode fazer é colocar uma confirmação para o usuario se ele realmente deseja fazer a importação.

Se ele cancelar simplesmente o codigo interrompe.

Option Explicit

Sub BuscarCSV()
Application.ScreenUpdating = False
    
    
        
    Dim Caminho As Variant
    DIm Confirmação as vbmsgboxresult

    Confirmação = msgbox("Confirma a Importação de Novo CSV???",vbyesno,"Confirma Importação")

     if confirmação = vbno then exitsub


    'Deletar Valores Anteriores
    Sheets("Dados").Select
    Cells.Clear


    Sheets("Dados").Select
    'Escolha qual planilha
    Caminho = Application.GetOpenFilename
        
    'Importa
    With ActiveSheet.QueryTables.Add(Connection:= _
        "TEXT;" & Caminho, Destination:=Range("$A$1"))
        
        '.CommandType = 0
        '.Name = "Teste"
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = True
        .TextFileTabDelimiter = False
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileOtherDelimiter = ";"
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
        
        
Sheets("Inicio").Select
Application.ScreenUpdating = True
        
        End With

End Sub
 
Postado : 11/04/2018 7:34 pm
(@diogodvd)
Posts: 0
New Member
Topic starter
 

MPrudêncio, deu o seguinte erro.

"Erro de compilação:

Sub ou Function não definida".

Dai o começo do código fica amarelo: Sub BuscarCSV()

Mas agradeço pela atenção

 
Postado : 11/04/2018 7:46 pm
(@wagner-morel-vidal-nobre)
Posts: 4063
Famed Member
 

diogodvd,

Bom dia!

Anexe, aqui mesmo no fórum, seu arquivo ou um exemplo com dados fictícios mas com o mesmo layout do arquivo original, compactado com .ZIP. Assim, podemos rodar e depurar ser código para encontrar o erro.

 
Postado : 12/04/2018 7:09 am
(@edsonbr)
Posts: 0
New Member
 

Só um detalhe, em relação ao seu primeiro post:

...porém se o usuário cancelar a importação...

Quando o usuário cancela a abertura de um (ou mais) arquivos, o método GetOpenFilename retorna FALSE ao invés de um (ou mais) nomes de arquivo. Então dá pra usufruir desse retorno para desviar o fluxo de seu programa para a ação desejada. Exemplo:

...
    Sheets("Dados").Select
    'Escolha qual planilha
    Caminho = Application.GetOpenFilename
    '///////////////////////////
       If Caminho = False Then
           MsgBox "Nada selecionado"
           Worksheets("início").Activate
           Exit Sub
       End If
    '///////////////////////////
   'Importa
    With ActiveSheet.QueryTables.Add(Connection:= _
 ...
 
Postado : 12/04/2018 7:38 am
(@mprudencio)
Posts: 0
New Member
 

diogodvd

Por um descuido meu eu digitei End Sub sem espaços. (Digitei direto no Forum)

Nesta linha do codigo

if confirmação = vbno then exitsub basta dar um espaço end sub que vai funcionar.

 
Postado : 14/04/2018 7:14 pm