none
Importar Txt VBA RRS feed

  • Pergunta

  • Ola Senhores

    Preciso de uma ajuda de vcs.

    preciso importar um arquivo Txt para o Excel,  e quando terminar a importação, ele colocar o nome do aquivo txt, na guia da planilha, assim não preciso ficar renomeando. as guias do Excel.  por favor se alguém puder me ajudar fico muito agradecido.

    Exemplo nas guias do Excel fica: plan1, plan2,       tenho que renomear estas guias com o nome do arquivo, e como são muitos arquivos leva tempo.

    quinta-feira, 22 de dezembro de 2016 19:00

Respostas

  • É porque o Excel não aceita caracteres \ no nome de uma planilha. E permite um máximo de 31 caracteres para o nome da planilha também.

    Tente:

        WorksheetName = Mid(arq, InStrRev(arq, "\") + 1)
        WorksheetName = Split(WorksheetName, ".")(0)
        w.Name = WorksheetName
    

    Dessa forma, "C:\user\luis\documentos\arquivo.txt" é reduzido a "arquivo" ao nomear a planilha.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 29 de dezembro de 2016 17:42
    Moderador

Todas as Respostas

  • Preciso de mais informações para sugerir uma macro.

    Qual é o formato desses arquivos? Estão separados por vírgula ou por tabulação?

    Você quer que a macro importe vários arquivos de uma vez (por exemplo, de um diretório) ou quer um botão que importe um por vez?


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 22 de dezembro de 2016 22:24
    Moderador
  • ola desdeja obrigado pela ajuda

    a importação  no excel e simples mesmo,  exemplo:  Dados/obter dados externos/de Texto ( os delimitadores eu coloco com assistente de importaçao do excel.)

     estes esquivos de txt,  são gerados de um programa que salva os dados em txt, com nome pra importar dentro do excel

    Preciso que este aquivo, ao ser importado para dentro do excel, la embaixa na guia plan1 seje renomeado para o nome do arquivo.

    e depois quando importar outro arquivo que vai estar salvo dentro de meus documentos, ele crie uma copia da plan1 ( que ja vai esta renomeada com nome do arquivo, e renomera denovo este outro arquivo)

    Lembrando as copias devem ficar dentro da mesmo planilha, não precisa ser copiado para outro pasta de trabalho.

    obrigado.

    sexta-feira, 23 de dezembro de 2016 01:05
  • Use algo como isso, considerando que o delimitador é TAB:

    Option Explicit
    
    Sub Main()
        Dim FilePath As String
        Dim WorksheetName As String
        Dim ws As Worksheet
        Dim FileNameParts() As String
        
        FilePath = BrowseFilePath("Arquivos do Text,*.txt", "Selecione um arquivo de texto")
        If FilePath = "" Then Exit Sub
        
        Set ws = ActiveSheet
        ws.Cells.Delete
        With ws.QueryTables.Add(Connection:="TEXT;" & FilePath, _
                                Destination:=Range("A1"))
            .TextFileTabDelimiter = True
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        
        FileNameParts = Split(FilePath, "\")
        WorksheetName = FileNameParts(UBound(FileNameParts))
        WorksheetName = Left(WorksheetName, InStrRev(WorksheetName, ".") - 1)
        ws.Name = WorksheetName
    End Sub
    
    Private Function BrowseFilePath(pFileFilter As String, pTitle As String) As String
        Dim FilePath As String
    
        FilePath = CStr(Application.GetOpenFilename(FileFilter:=pFileFilter, _
                                                    Title:=pTitle))
        If FilePath = CStr(False) Then GoTo Quit
    
        BrowseFilePath = FilePath
    Quit:
    End Function
    
    
    


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    sexta-feira, 23 de dezembro de 2016 11:29
    Moderador
  • ola Felipe obrigado

    ja esta renomeando blz, para completar  so fazer mais uma coisa

    1 mudar para que a macro deixe entrar no assistente de importaçao de texto do excel  ( preciso puxar pelo assistete de importaçao)

    preciso definir as colunas pelo assitente de importação do excel pois os aquivos de textos vem todo emendados.

    Grato Luis

    sexta-feira, 23 de dezembro de 2016 16:20
  • Option Explicit
    
    Sub Main()
        Dim FilePath As String
        Dim WorksheetName As String
        Dim ws As Worksheet
        Dim FileNameParts() As String
        
        'FilePath = BrowseFilePath("Arquivos do Text,*.txt", "Selecione um arquivo de texto")
        FilePath = "C:\Temp\teste\Teste.txt"
        If FilePath = "" Then Exit Sub
        
        Set ws = ThisWorkbook.Worksheets.Add
        With ws.QueryTables.Add(Connection:="TEXT;" & FilePath, _
                                Destination:=ws.Range("A1"))
            .TextFileParseType = xlFixedWidth
            .Refresh BackgroundQuery:=False
            .Delete
        End With
        
        FileNameParts = Split(FilePath, "\")
        WorksheetName = FileNameParts(UBound(FileNameParts))
        WorksheetName = Left(WorksheetName, InStrRev(WorksheetName, ".") - 1)
        ws.Name = WorksheetName
        
        Application.Goto ws.Range("A1")
        Application.Dialogs(xlDialogTextToColumns).Show
    End Sub
    
    Private Function BrowseFilePath(pFileFilter As String, pTitle As String) As String
        Dim FilePath As String
    
        FilePath = CStr(Application.GetOpenFilename(FileFilter:=pFileFilter, _
                                                    Title:=pTitle))
        If FilePath = CStr(False) Then GoTo Quit
    
        BrowseFilePath = FilePath
    Quit:
    End Function
    



    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    sexta-feira, 23 de dezembro de 2016 17:13
    Moderador
  • Caro Felipe

    Fiz algumas mudanças no código, na caixa do assistente ele estava puxando so a primeira linha, arrumei para puxar todas linhas. e criei um botão para chamar a macro.

    agora deu certo, show de bola,

    muito o obrigado e que Deus lhe de cada vez mais sabedoria. 

    Caso queira manda o número do seu telefone, vou add vc no watts

    Luis

    

    sexta-feira, 23 de dezembro de 2016 19:24
  • Que bom que resolveu seu problema.

    Entre no grupo de WhatsApp do meu site! Será bem vindo.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    sábado, 24 de dezembro de 2016 11:10
    Moderador
  • Boa tarde Felipe

    Este código acima preciso juntar ele em uma planilha que faz e importação através de layout.  quero que ele renomeei a planilha para não precisar renomear na mão

    já tenho a planilha que importa com layout. veja abaixo o código dela

    Option Explicit

    Private Sub btexecutar_Click()
    Dim w       As Worksheet 'trabalhar com a planilha
    Dim pt1ini   As Integer    'primeira posição do layout
    Dim pt1tm   As Integer   ' ultima posição do layout
    Dim pt2ini   As Integer
    Dim pt2tm   As Integer
    Dim pt3ini   As Integer
    Dim pt3tm   As Integer
    Dim pt4ini   As Integer
    Dim pt4tm   As Integer
    Dim pt5ini   As Integer
    Dim pt5tm   As Integer
    Dim pt6ini   As Integer
    Dim pt6tm   As Integer
    Dim pt7ini   As Integer
    Dim pt7tm   As Integer
    Dim pt8ini   As Integer
    Dim pt8tm   As Integer
    Dim pt9ini   As Integer
    Dim pt9tm   As Integer
    Dim pt10ini   As Integer
    Dim pt10tm   As Integer
    Dim pt11ini   As Integer
    Dim pt11tm   As Integer
    Dim pt12ini   As Integer
    Dim pt12tm   As Integer
    Dim pt13ini   As Integer
    Dim pt13tm   As Integer
    Dim pt14ini   As Integer
    Dim pt14tm   As Integer
    Dim pt15ini   As Integer
    Dim pt15tm   As Integer
    Dim pt16ini   As Integer
    Dim pt16tm   As Integer
    Dim pt17tm   As Integer
    Dim pt17ini   As Integer



    Dim arq     As Variant 'manipular   o arquivo de texto
    Dim I       As Integer
    Dim col     As Integer
    Dim l       As String
    Dim ln      As Long
    Dim dados As Integer
    Dim strDate As Variant


    Set w = Sheets("layout")
    w.Select
    w.Range("b2").Select

    pt1ini = ActiveCell.Value
    pt1tm = ActiveCell.Offset(0, 2).Value

    pt2ini = ActiveCell.Offset(1, 0).Value
    pt2tm = ActiveCell.Offset(1, 2).Value


    pt3ini = ActiveCell.Offset(2, 0).Value
    pt3tm = ActiveCell.Offset(2, 2).Value

    pt4ini = ActiveCell.Offset(3, 0).Value
    pt4tm = ActiveCell.Offset(3, 2).Value

    pt5ini = ActiveCell.Offset(4, 0).Value
    pt5tm = ActiveCell.Offset(4, 2).Value

    pt6ini = ActiveCell.Offset(5, 0).Value
    pt6tm = ActiveCell.Offset(5, 2).Value

    pt7ini = ActiveCell.Offset(6, 0).Value
    pt7tm = ActiveCell.Offset(6, 2).Value

    pt8ini = ActiveCell.Offset(7, 0).Value
    pt8tm = ActiveCell.Offset(7, 2).Value

    pt9ini = ActiveCell.Offset(8, 0).Value
    pt9tm = ActiveCell.Offset(8, 2).Value

    pt10ini = ActiveCell.Offset(9, 0).Value
    pt10tm = ActiveCell.Offset(9, 2).Value

    pt11ini = ActiveCell.Offset(10, 0).Value
    pt11tm = ActiveCell.Offset(10, 2).Value

    pt12ini = ActiveCell.Offset(11, 0).Value
    pt12tm = ActiveCell.Offset(11, 2).Value

    pt13ini = ActiveCell.Offset(12, 0).Value
    pt13tm = ActiveCell.Offset(12, 2).Value

    pt14ini = ActiveCell.Offset(13, 0).Value
    pt14tm = ActiveCell.Offset(13, 2).Value

    pt15ini = ActiveCell.Offset(14, 0).Value
    pt15tm = ActiveCell.Offset(14, 2).Value

    pt16ini = ActiveCell.Offset(15, 0).Value
    pt16tm = ActiveCell.Offset(15, 2).Value

    pt17ini = ActiveCell.Offset(16, 0).Value
    pt17tm = ActiveCell.Offset(16, 2).Value



    'Importar os dados do Arquivo
    '----------------------------------------------------------

    Set w = Sheets("dados")
       Sheets("DADOS").Select
        Sheets("DADOS").Copy Before:=Sheets(1)

    Set w = Sheets("dados")

    w.UsedRange.EntireColumn.Delete

    w.Select
    w.Range("a1").Value = "Tipo"
    w.Range("b1").Value = "Emp"
    w.Range("c1").Value = "Insc"
    w.Range("d1").Value = "Pis"
    w.Range("e1").Value = "DataAdm"
    w.Range("f1").Value = "CatTrab"
    w.Range("g1").Value = "Nome"
    w.Range("h1").Value = "Matricula"
    w.Range("i1").Value = "NºCtps"
    w.Range("j1").Value = "serieCtps"
    w.Range("k1").Value = "DataOpção"
    w.Range("l1").Value = "Data Nasc"
    w.Range("m1").Value = "Cbo"
    w.Range("n1").Value = "ValorSem 13º"
    w.Range("o1").Value = "ValorSob 13º"

    'Abrir o arquivo de texto
    '---------------------------------------------
    arq = Application.GetOpenFilename("arquivo de texto (*.txt),*.txt", Title:="Escolha o arquivo desejado")

    If arq = "" Or arq = False Then
        
       ' MsgBox "Arquivo de texto não selecionado, processo abortado"
      'vbOKOnly , "Processo Abortado"
        Exit Sub
        
    End If

    w.Select

    I = FreeFile: Open arq For Input Access Read As #1
    col = 1
    ln = 2

    'Inserir dados na planilha
    '------------------------------------------------------
    Do While Not EOF(I)

     FrmMenu.LblStatus.Caption = "Processando Linha:" & ln - 1
        DoEvents
        
        Line Input #I, l
        
        w.Cells(ln, col).Value = Mid$(l, pt1ini, pt1tm)
        w.Cells(ln, col + 1).Value = Mid$(l, pt2ini, pt2tm)
        w.Cells(ln, col + 2).Value = "'" & Mid$(l, pt3ini, pt3tm)
        w.Cells(ln, col + 3).Value = Mid$(l, pt4ini, pt4tm)
        w.Cells(ln, col + 4).Value = "'" & Mid$(l, pt5ini, pt5tm)
        w.Cells(ln, col + 5).Value = "'" & Mid$(l, pt6ini, pt6tm)
        w.Cells(ln, col + 6).Value = Mid$(l, pt7ini, pt7tm)
        w.Cells(ln, col + 7).Value = Mid$(l, pt8ini, pt8tm)
        w.Cells(ln, col + 8).Value = "'" & Mid$(l, pt9ini, pt9tm)
        w.Cells(ln, col + 9).Value = "'" & Mid$(l, pt10ini, pt10tm)
        w.Cells(ln, col + 10).Value = "'" & Mid$(l, pt11ini, pt11tm)
        w.Cells(ln, col + 11).Value = "'" & Mid$(l, pt12ini, pt12tm)
        w.Cells(ln, col + 12).Value = "'" & Mid$(l, pt13ini, pt13tm)
        w.Cells(ln, col + 13).Value = Mid$(l, pt14ini, pt14tm)
        w.Cells(ln, col + 14).Value = Mid$(l, pt15ini, pt15tm)
        ln = ln + 1
        
    Loop
    Close I

    FrmMenu.LblStatus.Caption = "Formatando documento"

    DoEvents
    w.Columns("n:n").Select
        Selection.Style = "currency"
        w.Columns("o:o").Select
        Selection.Style = "currency"
        w.Columns("E:E").Select
        w.Columns("p:p").Select

        
    w.Columns("a:a").AutoFit
    w.Columns("b:b").AutoFit
    w.Columns("c:c").AutoFit
    w.Columns("d:d").AutoFit
    w.Columns("f:f").AutoFit
    w.Columns("g:g").AutoFit
    w.Range("a1").Select

    Unload FrmMenu

    MsgBox "Dado Importado com sucesso!"
    End Sub

    Private Sub btsair_Click()
    Unload Me
    End Sub

    quarta-feira, 28 de dezembro de 2016 20:38
  • Ao inserir um código no fórum, utilize blocos de código. Para utilizar essa ferramenta, clique no botão cuja legenda é “Inserir bloco de código” na barra do editor de mensagens do fórum. Uma janela aparecerá onde você deverá colar seu código cru na caixa de texto à esquerda. Então, selecione a opção Vb.Net na caixa de combinação que você verá em cima à esquerda e depois clique no botão Inserir.

    ---

    Não entendi muito bem sua dúvida. Você quer que essa macro que você postou seja executada após executar a primeira?

    E outra coisa: aparentemente o código que você postou está na classe de um formulário.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quarta-feira, 28 de dezembro de 2016 21:40
    Moderador
  • sim esta na classe de um formulário, que e o botão de importar Text

    quanto a macro ser executada pode ser primeiro, o que preciso e que depois que ela executar, simplesmente renomeia a planilha com o nome do arquivo, como você fez no outro código.

    Assim sendo,  não sera mas preciso trazer a caixa assistente do Excel. porque os dados ja vem direto, pegando da planilha Layout

    se quiser posso te mandar planilha, mas não sei como mandar por aqui.

    Grato

    quarta-feira, 28 de dezembro de 2016 23:35
  • Você tem alguma noção de VBA? Esse problema parece ser fácil de ser resolvido.

    Seu código está bastante grande e não tenho tempo para analisar, mas creio que uma simples instrução ActiveSheet.Name = arq após ter feito a cópia da planilha dados resolve seu problema, não?


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 29 de dezembro de 2016 12:16
    Moderador
  •  Estou aprendendo VBA.

    vou tentar fazer aqui, se conseguir eu te aviso.

    obrigado.

    quinta-feira, 29 de dezembro de 2016 13:26
  • Felipe, ele consegue ler os caminhos mas não consegue renomear.

    ficou assim

    w.Name = arq

    quinta-feira, 29 de dezembro de 2016 14:14
  • Qual é o valor da variável arq no momento em que dá o erro, em modo de depuração? Deixe o mouse sobre a variável que irá aparecer seu valor num rótulo suspenso e me informe.

    ---

    Estou confuso com esse bloco de código:

    Set w = Sheets("dados")
    Sheets("DADOS").Select
    Sheets("DADOS").Copy Before:=Sheets(1)
    
    Set w = Sheets("dados")

    Você grava os dados na planilha original Dados? E ao término do processo você renomeia a Dados (2) para Dados novamente?

    O ideal é você salvar os dados sempre na cópia de dados.

    Daí ficaria assim:

    Sheets("DADOS").Copy Before:=Sheets(1)
    Set w = ActiveSheet
    



    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 29 de dezembro de 2016 14:19
    Moderador
  • Fiz desse jeito que vc falou  ficou melhor a copia,

    coloquei       w.Name = arq      

    variável depuração: de W.Name: (dados 5)   arq:C:\user\luis\documentos\arquivo txt

    ele esta lendo os caminhos  certos, mas nao consegue fazer a renomeação da planilha dados 5, para aquivo text.

    quando roda a macro, ele importa tudo faz a copia, que neste exemplo e a dados 5, mas quando chega no comando para renomear ele da o seguinte erro.

    erro em tempo de execução 1004

    o nome digitado e invalido para planilha ou gráfico...

    etc..

    quinta-feira, 29 de dezembro de 2016 16:26
  • É porque o Excel não aceita caracteres \ no nome de uma planilha. E permite um máximo de 31 caracteres para o nome da planilha também.

    Tente:

        WorksheetName = Mid(arq, InStrRev(arq, "\") + 1)
        WorksheetName = Split(WorksheetName, ".")(0)
        w.Name = WorksheetName
    

    Dessa forma, "C:\user\luis\documentos\arquivo.txt" é reduzido a "arquivo" ao nomear a planilha.


    http://www.ambienteoffice.com.br || Grupo de WhatsApp: https://chat.whatsapp.com/K1uey5Q4yJdKnsgWkVQAZG

    quinta-feira, 29 de dezembro de 2016 17:42
    Moderador
  • Felipe 

    Funcionou beleza, deu certinho resolveu meu problema.

    mais uma vez muito obrigado e um Feliz 2017 .

    Luis

    quinta-feira, 29 de dezembro de 2016 20:08