Função parecida com...
 
Notifications
Clear all

Função parecida como FIND do excel

15 Posts
1 Usuários
0 Reactions
2,932 Visualizações
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Fala gente, tudo beleza?

Estou precisando de uma ajuda com um código que não surgiu a luz para realizalo.

Segue:

Sub ImportaOp()
'On Error GoTo trata_erro

Dim caixa As FileDialog
Dim codigo
Dim nome

Set caixa = Application.FileDialog(msoFileDialogFilePicker)
caixa.Title = "Selecione o arquivo"
    If caixa.Show = -1 Then
        For Each caminho In caixa.SelectedItems
        i = 5
    
        Dim fs, f
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.OpenTextFile(caminho, 1)
    
        linha = f.readline
    
        'Procura data
        Data = Mid(linha, 5, 10)
    
        linha = f.readline
        Worksheets("Principal").Cells(1, 2).Value = Data
    
        Do While f.AtEndOfStream <> True
        
            linha = f.readline
        
[b][color=#FF0000]            'Acha um cliente
            If linha Like "*NOME DO CLIENTE:*" Then[/color][/b]            

End Sub

Esse código abre um arquivo .txt e faz a análise dele, porém, a linha do cliente vem da seguinte forma:

-  1234567-8   NOME DO CLIENTE: CLIENTE TESTE

A minha ideia para a minha variável linha achar essa linha é usar o LIKE procurando por "NOME DO CLIENTE:" o problema é desmembrar essa informação!
Por exemplo, eu queria que na célula A1 venha o campo código do cliente e na A2 venha o nome do cliente.
Minha dificuldade, a quantidade de espaços antes do código numérico varia, por exemplo:

-        7-5 - 8 espaços em branco
-       27-5 - 7 espaços em branco
-      127-5 - 6 espaços em branco
-     3127-5 - 5 espaços em branco
-    93127-5 - 4 espaços em branco
-   293127-5 - 3 espaços em branco
-  1234567-8 - 2 espaços em branco

É possível fazer a análise dos dados através da memória da variável ou eu terei que identificar a linha, jogar no excel e fazer a análise?
Eu uso uma fórmula para resolver esse conflito no excel, segue:

=MID(D4;9;FIND("-";D4;1)-7)
=MID(D5;8;FIND("-";D5;1)-6)
=MID(D6;7;FIND("-";D6;1)-5)
=MID(D7;6;FIND("-";D7;1)-4)
=MID(D8;5;FIND("-";D8;1)-3)
=MID(D9;4;FIND("-";D9;1)-2)
=MID(D10;3;FIND("-";D10;1)-1)

Se eu errei algo na fórmula, desconsidere, apenas fiz para teste.

Poderiam me ajudar?

 
Postado : 13/03/2012 11:35 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde!!

me desculpa mas fiquei boiando..não entendi :?

 
Postado : 13/03/2012 11:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde!!

me desculpa mas fiquei boiando..não entendi :?

Tranquilo.

Simplesmente o código do cliente vem junto com o nome da seguinte maneira:
- 1234567-8 NOME DO CLIENTE: CLIENTE TESTE

Eu queria separar o código do nome dele e escrever o código na célula A1 e o nome na A2.
Minha dificuldade é, fazer isso num arquivo TXT e somente depois de separado pelo VBA, gravar as informações no excel.

 
Postado : 13/03/2012 12:01 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde!!

Até alguém melhor que eu resolva, gostaria que postasse um exemplo (COMPACTADO).

Seria um arquivo de texto que você quer acerta para o mesmo fique ajustado no excel (cada dado em coluna, linha e célula)?

Att

 
Postado : 13/03/2012 1:12 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Boa tarde!!

Até alguém melhor que eu resolva, gostaria que postasse um exemplo (COMPACTADO).

Seria um arquivo de texto que você quer acerta para o mesmo fique ajustado no excel (cada dado em coluna, linha e célula)?

Att

Então, não posso enviar nada desse tipo! No caso, foi até difícil fazer o exemplo, por que os códigos de cliente que eu utilizei, tive que alterar para uns que não existissem!

 
Postado : 15/03/2012 8:24 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Vc pode "preparar" um arquivo com alguns exemplos ficticios, não é necessario dados reais, porem a estrutura do txt e do excel são fundamentais, para que não precisemos tentar adivinhar como os dados se alinham.

Esse arquivo txt, os "registros" são separados par algum identificador do tipo "#" ou ";", ou é por tamanho fixo de registros?

 
Postado : 15/03/2012 9:26 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Vc pode "preparar" um arquivo com alguns exemplos ficticios, não é necessario dados reais, porem a estrutura do txt e do excel são fundamentais, para que não precisemos tentar adivinhar como os dados se alinham.

Esse arquivo txt, os "registros" são separados par algum identificador do tipo "#" ou ";", ou é por tamanho fixo de registros?

Fala Reinaldo, tudo bom? É por tamanho fixo dos registros.

Atualmente eu refiz o código e ficou algo assim:

ImportaN

Sub ImportaN()
'On Error GoTo trata_erro

Dim caixa As FileDialog
Dim i As Integer
Dim cliente
Dim contrato
Dim isin
Dim dist
Dim pregão As Date
Dim vencimento As Date
Dim qtdori As Long
Dim qtdajust As Long
Dim qtddispo As Long
Dim pretax As Currency
Dim vol As Currency
Dim contrap As String

Set caixa = Application.FileDialog(msoFileDialogFilePicker)
caixa.Title = "Selecione o arquivo NORMAL"
    If caixa.Show = -1 Then
        For Each caminho In caixa.SelectedItems
        i = 1
    
        Dim fs, f
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.OpenTextFile(caminho, 1)
    
        linha = f.readline
    
        'Procura data
        Data = Mid(linha, 5, 10)
    
        linha = f.readline
        Worksheets("Principal").Cells(2, 1).Value = Data
        
        Worksheets("BaseN").Activate
        Do While f.AtEndOfStream <> True
        
            linha = f.readline
        
            'Acha um cliente
            
            If Mid(linha, 8, 7) = "CLIENTE" Then
            cliente = Trim(Mid(linha, 16, 173))
                
            'linha = f.readline
            Else
                Do While Mid(linha, 16, 2) = "BR"
                    
                    'Acha o termo do cliente.
                    contrato = Trim(Mid(linha, 4, 11))
                    isin = Trim(Mid(linha, 15, 13))
                    dist = Trim(Mid(linha, 29, 3))
                    pregão = Trim(Mid(linha, 34, 10))
                    vencimento = Trim(Mid(linha, 46, 10))
                    qtdori = Trim(Mid(linha, 60, 13))
                    qtdajust = Trim(Mid(linha, 76, 13))
                    qtddispo = Trim(Mid(linha, 92, 13))
                    pretax = Trim(Mid(linha, 106, 14))
                    vol = Trim(Mid(linha, 139, 14))
                    'contrap = Trim(Mid(linha, 182, 7))
                    contrap = " " & Trim(Mid(linha, 178, 9))
                    
                    
                    linha = f.readline
                   
                    
                    'Escreve no excel
                    Worksheets("BaseN").Cells(i, 1).Value = cliente
                    Worksheets("BaseN").Cells(i, 2).Value = contrato
                    Worksheets("BaseN").Cells(i, 3).Value = isin
                    Worksheets("BaseN").Cells(i, 4).Value = dist
                    Worksheets("BaseN").Cells(i, 5).Value = pregão
                    Worksheets("BaseN").Cells(i, 6).Value = vencimento
                    Worksheets("BaseN").Cells(i, 7).Value = qtdori
                    Worksheets("BaseN").Cells(i, 8).Value = qtdajust
                    Worksheets("BaseN").Cells(i, 9).Value = qtddispo
                    Worksheets("BaseN").Cells(i, 10).Value = pretax
                    Worksheets("BaseN").Cells(i, 11).Value = vol
                    Worksheets("BaseN").Cells(i, 12).Value = contrap
                    
                    
                    
                    'Ajusta o i e pula linha
                    i = i + 1
                    
                    Loop
                End If
            Loop
        Next
    End If
End Sub

ImportaF

Sub ImportaF()
'On Error GoTo trata_erro

Dim caixa As FileDialog
Dim i As Integer
Dim codigo As String
Dim nome As String
Dim contrato
Dim isin
Dim dist
Dim pregão As Date
Dim vencimento As Date
Dim qtdori As Long
Dim qtdajust As Long
Dim qtddispo As Long
Dim pretax As Currency
Dim vol As Currency
Dim contrap As Integer

Set caixa = Application.FileDialog(msoFileDialogFilePicker)
caixa.Title = "Selecione o arquivo FLEX"
    If caixa.Show = -1 Then
        For Each caminho In caixa.SelectedItems
        i = 1
    
        Dim fs, f
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.OpenTextFile(caminho, 1)
    
        linha = f.readline
    
        'Procura data
        Data = Mid(linha, 5, 10)
    
        linha = f.readline
        Worksheets("Principal").Cells(2, 2).Value = Data
        
        Worksheets("BaseF").Activate
        Do While f.AtEndOfStream <> True
        
            linha = f.readline
        
            'Acha um cliente
            
            If Mid(linha, 2, 7) = "CLIENTE" Then
            codigo = Trim(Mid(linha, 13, 7))
            nome = Trim(Mid(linha, 24, 199))
                
            'linha = f.readline
            Else
                Do While Mid(linha, 13, 2) = "BR"
                    
                    'Acha o termo do cliente.
                    contrato = Trim(Mid(linha, 3, 9))
                    isin = Trim(Mid(linha, 13, 12))
                    dist = Trim(Mid(linha, 26, 3))
                    pregão = Trim(Mid(linha, 30, 10))
                    vencimento = Trim(Mid(linha, 41, 10))
                    qtdori = Trim(Mid(linha, 57, 14))
                    qtdajust = Trim(Mid(linha, 74, 14))
                    qtddispo = Trim(Mid(linha, 93, 14))
                    pretax = Trim(Mid(linha, 114, 9))
                    vol = Trim(Mid(linha, 136, 13))
                    contrap = " " & Trim(Mid(linha, 180, 4))
                    
                    
                    linha = f.readline
                   
                    
                    'Escreve no excel
                    Worksheets("BaseF").Cells(i, 1).Value = codigo
                    Worksheets("BaseF").Cells(i, 2).Value = nome
                    Worksheets("BaseF").Cells(i, 3).Value = contrato
                    Worksheets("BaseF").Cells(i, 4).Value = isin
                    Worksheets("BaseF").Cells(i, 5).Value = dist
                    Worksheets("BaseF").Cells(i, 6).Value = pregão
                    Worksheets("BaseF").Cells(i, 7).Value = vencimento
                    Worksheets("BaseF").Cells(i, 8).Value = qtdori
                    Worksheets("BaseF").Cells(i, 9).Value = qtdajust
                    Worksheets("BaseF").Cells(i, 10).Value = qtddispo
                    Worksheets("BaseF").Cells(i, 11).Value = pretax
                    Worksheets("BaseF").Cells(i, 12).Value = vol
                    Worksheets("BaseF").Cells(i, 13).Value = contrap
                    
                    
                    
                    'Ajusta o i e pula linha
                    i = i + 1
                    
                    Loop
                End If
            Loop
        Next
    End If
End Sub

Funciona relativamente bem, mas é um pouco lento! Quem me ajudou com isso foi um outro rapaz aqui do trabalho e que também é user do fórum.

 
Postado : 20/03/2012 6:28 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

thelol, não entendi se quer dizer que com as duas rotinas resolveu a questão ou se ainda precisa de algo, se foi concluído, assinale o Tópico com Resolvido.

Quanto as rotinas que postou, percebe-se que se tratam de dois arquivos textos diferentes :
"Selecione o arquivo NORMAL" e
"Selecione o arquivo FLEX", com variações nas Referências e Variáveis, por isso que se torna imprenscindivel o envio destes arquivos, mesmo que com dados ficticios, com isto evitamos erros se tivermos de criar os Txts, uma vez que poderiamos estar criando campos totalmente diferentes do que consta nos arquivos originais.

[]s

 
Postado : 20/03/2012 7:07 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

thelol, não entendi se quer dizer que com as duas rotinas resolveu a questão ou se ainda precisa de algo, se foi concluído, assinale o Tópico com Resolvido.

Quanto as rotinas que postou, percebe-se que se tratam de dois arquivos textos diferentes :
"Selecione o arquivo NORMAL" e
"Selecione o arquivo FLEX", com variações nas Referências e Variáveis, por isso que se torna imprenscindivel o envio destes arquivos, mesmo que com dados ficticios, com isto evitamos erros se tivermos de criar os Txts, uma vez que poderiamos estar criando campos totalmente diferentes do que consta nos arquivos originais.

[]s

Desculpe, foi um grande erro meu! Foi resolvido.

Novamente desculpem a falta de informação, mas não consegui fazer upload nem enviar algo fictício, o compliance não me permitiu.

 
Postado : 20/03/2012 8:16 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Fala gente!!! Coloquei o tópico como não resolvido por que eu estou no fim dessa macro e me surgiu outra dúvida, é possível fazer o seguinte:

        If Sheet2.Cells(i, 1) NOT LIKE "123456-7*" Then
        outros = outros + Sheet2.Cells(i, 11)
        Else

Aqui não funfa o NOT LIKE.

 
Postado : 29/03/2012 7:44 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Experimente assim:
If Not Sheet2.Cells(i, 1) Like "123456-7*" ....

 
Postado : 29/03/2012 7:52 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Experimente assim:
If Not Sheet2.Cells(i, 1) Like "123456-7*" ....

Funciona que é uma beleza! Obrigado! Acabou passando batido.

 
Postado : 29/03/2012 8:03 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Vixi, acabei de verificar, não funciona! Eu queria que a fórmula fosse assim:

 If Sheet2.Cells(i, 1) NOT LIKE "123456-7*" Then
outros = outros + Sheet2.Cells(i, 11)
Else

IF NOT funciona, porém, o LIKE teria que ser também, ou algum LIKE <> é possível?

 
Postado : 29/03/2012 8:41 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Thelol,
A sintaxe para "not like" é not a sua variavel ou campo like "qq". Ou seja deveria funcionar.
Como vc que que o valor seja diferente de algo, pode utilizar tb
If left(Sheet2.Cells(i,1),8) <> "123456-7"

 
Postado : 29/03/2012 8:51 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
Topic starter
 

Thelol,
A sintaxe para "not like" é not a sua variavel ou campo like "qq". Ou seja deveria funcionar.
Como vc que que o valor seja diferente de algo, pode utilizar tb
If left(Sheet2.Cells(i,1),8) <> "123456-7"

Valeu Reinaldo, novamente, muito obrigado! Exatamente o que eu precisava.

 
Postado : 29/03/2012 12:26 pm