Notifications
Clear all

Código XLARRUDA gostaria de entender como funciona

23 Posts
4 Usuários
0 Reactions
2,747 Visualizações
(@jnexcel)
Posts: 298
Reputable Member
Topic starter
 

o meu código eu sei como funciona, mas o código do xlarruda eu gostaria de entender como ele funciona (apenas as linhas que ele acrescentou ao meu código)

eu ia postar no tópico que ele respondeu, porém eu não consegui.

MEU CÓDIGO

If Range("A2") = 123456789 Then
            
    MsgBox "Pode continuar", vbInformation, "aviso"
    
    Range("Tabela1").Select
    Selection.Copy
    Sheets("Plan3").Select
    Range("A2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Cells.Select
    Cells.EntireColumn.AutoFit
    Range("A1").Select
    
    Else
    
    Application.Visible = False
    
    MsgBox "atenção! você não tem uma licença válida para usar esse sistema.", vbCritical, "erro"
           
    Application.DisplayAlerts = False
    
    Application.Quit
    
    End If

CÓDIGO XLARRUDA

'gostaria de ajuda para entender o que cada linha do código do xlarruda está fazendo :)

Sub Macro1()
   Dim ul As Long
   ul = Plan2.Range("A" & Rows.Count).End(xlUp).Row
   
    Sheets("BASE DE DADOS").Select
    For i = 2 To ul
    If Plan2.Range("A" & i).Value <> "123456789" Then
    Application.Visible = False
      
    Application.DisplayAlerts = False
    MsgBox "atenção! você não tem uma licença válida para usar esse sistema.", vbCritical, "erro"
    Application.Quit
    Exit Sub
    End If
    Next i
    Range("Tabela1").Select
    Selection.Copy
    Sheets("Plan3").Select
    Range("A2").Select
    ActiveSheet.Paste
    Application.CutCopyMode = False
    Cells.Select
    Cells.EntireColumn.AutoFit
    Range("A1").Select
    
End Sub

agradeço muito a quem colaborar e dispor de tempo para me explicar

 
Postado : 09/05/2018 10:45 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

acredito que ela não seja o fator. Essa parte apenas força uma comparação de texto.

Fiquei com uma dúvida e queria saber quais das situações é a correta.

SITUAÇÃO 1
Inicialmente esses dados já estarão na planilha.
Faz uma verificação para achar o nome "MANOEL"
Se todos forem MANOEL é então feita a importação

SITUAÇÃO 2
Inicialmente a planilha não terá nenhum dado (Apenas Cabeçalho)
É feita a importação dos dados
Se todos os nomes forem MANOEL termina a sub mas se houver algum diferente de MANOEL deleta todos os dados e deixa apenas o cabeçalho.

Além disso, por favor, me diga em que parte do texto está dando erro. Aguardo sua resposta.

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 24/05/2018 5:54 am
(@jnexcel)
Posts: 298
Reputable Member
Topic starter
 

Eu vou enviar o meu arquivo original para um melhor entendimento.

Eu usei um exmplo no txt pois a regra de validação é a mesma se a coluna não for manoel os dados não serão importados

aqui eu estou usando um arquivo xml ao invés de um txt (PORÉM A REGRA DE VALIDAÇÃO É A MESMA DO TXT)

Código completo

Sub importardados()
    Sheets("Base de Dados").Select
    MsgBox "Você clicou em Importar dados em XML." & Chr(13) & "O sistema validará se você é o MANOEL", vbInformation, "Aviso"
    ActiveSheet.Unprotect "123"
    ActiveWorkbook.XmlMaps("nfeProc_Mapa").Import URL:= _
        "C:ARQUIVOS XMLxml teste.xml"
    If Range("B8") <> "MANOEL" Then ' aqui eu preciso apenas aumentar o campo de validação DEIXAR A COLUNA INTEIRA AO INVÉS DE APENAS A CÉLULA B8
    Application.Visible = False
    MsgBox "Atencão! Você não é o MANOEL." & Chr(13) & "Os dados não foram importados para o sistema", vbCritical, "ERRO DE ACESSO"
    Rows("8:8").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("Tabela1[FORNECEDOR]").Select
    End If
    ActiveSheet.Protect "123"
    Application.Visible = True
End Sub

parte do código que eu estou tentando modificar

If Range("B8") <> "MANOEL" Then ' aqui eu preciso apenas aumentar o campo de validação até a última célula preenchida da coluna B. 

exemplo: se a partir de B8 até a última célula preenchida da cluna B não for todos "MANOEL" então.......

hoje está apenas no B8 e eu preciso que seja até a última célula preenchida da coluna B

Link da planilha para um melhor entendimento:

https://drive.google.com/file/d/1GO32wp ... sp=sharing

Muito obrigado MESMO pela sua colaboração e atenção.

 
Postado : 24/05/2018 8:22 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Aqui pra mim, esse funcionou ...
Tente e me diga:

Option Compare Text
Sub importardados()
    Dim UL As Long
    ActiveSheet.Unprotect "123"
    Sheets("Base de Dados").Select
    MsgBox "Você clicou em Importar dados em XML." & Chr(13) & "O sistema validará se você é o MANOEL", vbInformation, "Aviso"
    UL = Plan1.Range("B" & Rows.Count).End(xlUp).Row
    'If UL <= 1 Then
    'UL = 9
    'End If
    For i = 8 To UL
    If Plan1.Range("B" & i).Value <> "MANOEL" And Plan1.Range("B" & i).Value <> "" Then   ' aqui eu preciso apenas aumentar o campo de validação DEIXAR A COLUNA INTEIRA AO INVÉS DE APENAS A CÉLULA B8
    Application.Visible = False
    MsgBox "Atencão! Você não é o MANOEL." & Chr(13) & "Os dados não foram importados para o sistema", vbCritical, "ERRO DE ACESSO"
    Plan1.Range("B8:F" & UL).Clear
    ActiveSheet.Protect "123"
    Application.Visible = True
    Exit Sub
    End If
    Next i
    Application.Visible = False
    'ActiveWorkbook.XmlMaps("nfeProc_Mapa").Import URL:= _
    "C:usersandre.arrudaDesktopARQUIVOS XLARRUDAxml teste.xml"
    ActiveWorkbook.XmlMaps("nfeProc_Mapa").Import URL:= _
        "C:ARQUIVOS XMLxml teste.xml"
    ActiveSheet.Protect "123"
    Application.Visible = True
End Sub

Caso dê erro. Por favor, me dia em que linha o erro está.

Abrç!

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 24/05/2018 9:45 am
(@jnexcel)
Posts: 298
Reputable Member
Topic starter
 

Vamos lá.
Eu estou desenvolvendo essa planilha para importar dados de arquivos xml
Eu tenho uma condição: o Excel só vai manter as informações se todas forem iguais ao nome: MANOEL (a partir de B8)
No Excel através da guia Desenvolvedor, aba XML, função Importar, é possível importar vários arquivos xml (o usuário poderá selecionar a pasta e quantos arquivos ele quer importar)
Se eu utilizar essa função do Excel acima, o seu código não valida a coluna B.
Atualmente eu faço assim:

If Range("b8") <> "MANOEL" Then
' aqui será minha condição caso seja diferente
End If

Porém assim meu IF fica fixo na célula b8 (eu preciso que ele percorra toda a coluna B a partir de B8 e verifique se todas as informações são realmente do MANOEL)
Eu vou enviar dois arquivos xml diferente para você testar ai.
Um do Manoel e outro do José (nessa situação o excel não deveria manter as informações pois são dois arquivos diferentes)
Por favor, faça um teste ai (importe os arquivos através da guia desenvolvedor e não pelo meu atalho criado no excel) Com relação ao meu atalho criado, eu vou mudar depois :)
Quando você realizar o teste verá que o excel vai importar os dois e o que eu estou querendo fazer é ao contrário (se haver dois arquivos xml diferentes, o excel não vai importar nenhum)

 
Postado : 24/05/2018 11:03 am
xlarruda
(@xlarruda)
Posts: 732
Honorable Member
 

Veja se é isso:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim UL As Long
    If Target.Column = 2 Then
    ActiveSheet.Unprotect "123"
    Sheets("Base de Dados").Select
    MsgBox "Você clicou em Importar dados em XML." & Chr(13) & "O sistema validará se você é o MANOEL", vbInformation, "Aviso"
    UL = Plan1.Range("B" & Rows.Count).End(xlUp).Row
    For i = 8 To UL
    If Plan1.Range("B" & i).Value <> "MANOEL" And Plan1.Range("B" & i).Value <> "" Then   ' aqui eu preciso apenas aumentar o campo de validação DEIXAR A COLUNA INTEIRA AO INVÉS DE APENAS A CÉLULA B8
    Application.Visible = False
    MsgBox "Atencão! Você não é o MANOEL." & Chr(13) & "Os dados não foram importados para o sistema", vbCritical, "ERRO DE ACESSO"
    Plan1.Range("B8:F" & UL).Clear
    ActiveSheet.Protect "123"
    Application.Visible = True
    Exit Sub
    End If
    Next i
    End If
 End Sub

___________________________________________________________________________________________
Se a resposta atendeu sua dúvida, por favor, clique no Gostei e marque o Tópico como [Resolvido].

Att.

André Arruda

 
Postado : 24/05/2018 12:42 pm
EdsonBR
(@edsonbr)
Posts: 1057
Noble Member
 

Se me permitem a intromissão...

Dá pra usar também a função de planilha CONT.SE no VBA e contar quantos "Manoéis" tem (inclusive dá pra usar coringa nela) e comparar com o número de células contadas. Além disso, como o intervalo de saída é uma tabela (ListObject), existem propriedades e métodos que facilitam na contagem de linhas e até na eliminação das células (registros) posteriormente.

Aproveitando seu código, JNEXCEL:

Sub importardados()
  Sheets("Base de Dados").Select
  MsgBox "Você clicou em Importar dados em XML." & Chr(13) & "O sistema validará se você é o MANOEL", vbInformation, "Aviso"
    ActiveSheet.Unprotect "123"
    ActiveWorkbook.XmlMaps("nfeProc_Mapa").Import URL:= _
        "C:ARQUIVOS XMLxml teste.xml"
    Dim rg As Range: Set rg = ActiveSheet.Range("Tabela1[FORNECEDOR]") 'Alteração
    If Application.CountIf(rg, "MANOEL") < rg.Cells.Count Then         'Alteração
      Application.Visible = False
      MsgBox "Atencão! Você não é o MANOEL." & Chr(13) & "Os dados não foram importados para o sistema", vbCritical, "ERRO DE ACESSO"
      ActiveSheet.ListObjects("Tabela1").DataBodyRange.Delete          'Alteração
    End If
    ActiveSheet.Protect "123"
    Application.Visible = True
  Set rg = Nothing                                                     'Alteração
End Sub

Obs.: criei a variável rg (Range) só pra expressão não ficar tão longa e ficar mais clara, mas é dispensável.

 
Postado : 24/05/2018 1:10 pm
(@jnexcel)
Posts: 298
Reputable Member
Topic starter
 

Bom dia!

Agradeço pela sugestão Edson :)

xlarruda

aqui o código só deu certo assim:

Sub importardados()
    Dim UL As Long
'''''''If Target.Column = 2 Then
    ActiveSheet.Unprotect "123"
    Sheets("Base de Dados").Select
    MsgBox "Você clicou em Importar dados em XML." & Chr(13) & "O sistema validará se você é o MANOEL", vbInformation, "Aviso"
    UL = Plan1.Range("B" & Rows.Count).End(xlUp).Row
    For i = 8 To UL
    If Plan1.Range("B" & i).Value <> "MANOEL" And Plan1.Range("B" & i).Value <> "" Then   ' aqui eu preciso apenas aumentar o campo de validação DEIXAR A COLUNA INTEIRA AO INVÉS DE APENAS A CÉLULA B8
    Application.Visible = False
    MsgBox "Atencão! Você não é o MANOEL." & Chr(13) & "Os dados não foram importados para o sistema", vbCritical, "ERRO DE ACESSO"
    Rows("8:8").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("Tabela1[FORNECEDOR]").Select
'''''''Plan1.Range("B8:F" & UL).Clear
    ActiveSheet.Protect "123"
    Application.Visible = True
    Exit Sub
    End If
    Next i
''''''End If

muito obrigado!

 
Postado : 25/05/2018 6:06 am
(@jnexcel)
Posts: 298
Reputable Member
Topic starter
 

Bom dia!

Agradeço pela sugestão Edson :)

xlarruda

aqui o código só deu certo assim:

Sub importardados()
    Dim UL As Long
'''''''If Target.Column = 2 Then
    ActiveSheet.Unprotect "123"
    Sheets("Base de Dados").Select
    MsgBox "Você clicou em Importar dados em XML." & Chr(13) & "O sistema validará se você é o MANOEL", vbInformation, "Aviso"
    UL = Plan1.Range("B" & Rows.Count).End(xlUp).Row
    For i = 8 To UL
    If Plan1.Range("B" & i).Value <> "MANOEL" And Plan1.Range("B" & i).Value <> "" Then   ' aqui eu preciso apenas aumentar o campo de validação DEIXAR A COLUNA INTEIRA AO INVÉS DE APENAS A CÉLULA B8
    Application.Visible = False
    MsgBox "Atencão! Você não é o MANOEL." & Chr(13) & "Os dados não foram importados para o sistema", vbCritical, "ERRO DE ACESSO"
    Rows("8:8").Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Delete Shift:=xlUp
    Range("Tabela1[FORNECEDOR]").Select
'''''''Plan1.Range("B8:F" & UL).Clear
    ActiveSheet.Protect "123"
    Application.Visible = True
    Exit Sub
    End If
    Next i
''''''End If

muito obrigado!

 
Postado : 25/05/2018 6:07 am
Página 2 / 2