Vídeo recomendado
https://youtu.be/diWPPPhW-9E

ModeloCadastro3ListView

Fórum para dúvidas sobre os fundamentos da linguagem de programação Visual Basic no contexto do VBA
Diovanino Cassio
Colaborador
Colaborador
Mensagens: 53
Registrado em: Qua Mar 15, 2017 11:31 am

Re: ModeloCadastro3ListView - Resolvido

Mensagem por Diovanino Cassio »

Valeu Saulo!
Obrigado mais uma vez pela ajuda.

Sds,
Diovanino Cássio


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Diovanino Cassio
Colaborador
Colaborador
Mensagens: 53
Registrado em: Qua Mar 15, 2017 11:31 am

Re: ModeloCadastro3ListView

Mensagem por Diovanino Cassio »

Senhores,

Como já disse aqui, sempre estou criando os meus formulários para o meu sistema, usando o modelo supra citado, ok?
Criei um formulário recentemente, para inserir as minhas despesas com manutenções dos nossos equipamentos, onde o mesmo busca informações sobre o equipamento em manutenção, de uma planilha de controle dos equipamentos (em anexo parte do meu formulário).
Estou necessitando fazer o seguinte:
Assim que o equipamento a ser enviado para manutenção for escolhido, preciso mostrar no campo ao lado o seu número de série, que também consta na planilha de controle de equipamentos.
como eu conseguiria mostrar este serial no meu formulário?
Segue abaixo, o código para carregar a relação dos equipamentos, que eu escolho em uma combo de equipamentos:
Private Sub UserForm_Activate()
Dim SourceWB As Workbook
Dim ListItems As Variant
Dim i As Integer

Application.ScreenUpdating = False

Call LimpaControles
Call HabilitaBotoesAlteracao

With Me.cboEquipto
.Clear ' Limpa a combobox

' Abre arquivo de origem com somente leitura

Set SourceWB = Workbooks.Open("\\140.1.0.222\Base de Dados NGLPA\Controles TI\Planilhas\CTHS.xlsx", _
False, True)

ListItems = SourceWB.Worksheets(1).Range("e2", Range("e400").End(xlUp)).Value
SourceWB.Close False ' fechar o Arquivo de origem sem salvar as alterações
Set SourceWB = Nothing
ListItems = Application.WorksheetFunction.Transpose(ListItems)

For i = 1 To UBound(ListItems)
.AddItem ListItems(i)
Next i
.ListIndex = -1
End With
Call OrdenaComboEquipto

End Sub

Sds,
Diovanino Cássio
Anexos
Formulario.jpg
Formulario.jpg (22.27 KiB) Exibido 5953 vezes


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: ModeloCadastro3ListView

Mensagem por srobles »

Diovanino,

Primeiro, adicione um novo módulo á sua pasta de trabalho e nele, cole o que segue :

Código: Selecionar todos

Public ListSeriais As Variant
Public retornoSerial As String
Function retornaSerial (ByVal CodEquip As Long)
   For vID = 1 To Ubound(ListSeriais)
      If vID = CodEquip Then
          retornoSerial = ListSeriais(vID)
          Exit For
      End If
   Next
End Function
Agora, no seu formulário, experimente substituir a rotina existente pela que deixo abaixo:

Código: Selecionar todos

Private Sub UserForm_Activate()
Dim SourceWB As Workbook
Dim ListItems As Variant
Dim i As Integer

Application.ScreenUpdating = False

Call LimpaControles
Call HabilitaBotoesAlteracao

With Me.cboEquipto
.Clear ' Limpa a combobox

' Abre arquivo de origem com somente leitura

Set SourceWB = Workbooks.Open("\\140.1.0.222\Base de Dados NGLPA\Controles TI\Planilhas\CTHS.xlsx", _
False, True)

ListItems = SourceWB.Worksheets(1).Range("e2", Range("e400").End(xlUp)).Value

'Aqui criamos a lista com os seriais
'Mude a letra da coluna para a correspondente na planilha
ListSeriais = SourceWB.Worksheets(1).Range("e2", Range("e400").End(xlUp)).Value

SourceWB.Close False ' fechar o Arquivo de origem sem salvar as alterações
Set SourceWB = Nothing
ListItems = Application.WorksheetFunction.Transpose(ListItems)

'Criação da nova lista, que contem os seriais
ListSeriais = Application.WorksheetFunction.Transpose(ListSeriais)

For i = 1 To UBound(ListItems)
.AddItem ListItems(i)
Next i
.ListIndex = -1
End With
Call OrdenaComboEquipto
End Sub
E no evento Change do ComboBox :

Código: Selecionar todos

Private Sub ComboBox1_Change()
    'Se o valor do combo for diferente de nulo
    If ComboBox1 <> "" Then
        'Chamamos a função para retornar os dados do equipamento
        'com base no Indice do combobox +1
        'Pois a listagem no combobox começa em 0
        'e para retornar os dados começamos em 1
        retornaSerial ComboBox1.ListIndex + 1
        With Me
            'Preenchemos os campos com os dados obtidos na função
            .TextBox1 = retornoSerial
        End With
    Else
        'Se o valor do combo for nulo
        'Limpamos os campos
        TextBox1 = ""
    End If
End Sub    
Espero ter ajudado.

Abs


Diovanino Cassio
Colaborador
Colaborador
Mensagens: 53
Registrado em: Qua Mar 15, 2017 11:31 am

Re: ModeloCadastro3ListView

Mensagem por Diovanino Cassio »

Saulo, bom dia!

Na solução apresentada por você, estou tendo problema na execução do módulo, pois está me retornando uma mensagem de "tipos incompatíveis", veja o anexo:

Sds,
Diovanino Cássio
Anexos
ErroExecModulo.jpg
ErroExecModulo.jpg (50.19 KiB) Exibido 5926 vezes


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: ModeloCadastro3ListView

Mensagem por srobles »

Diovanino,

Estranho amigo, pois copiei e colei os códigos em uma nova pasta para testes e não enfrentei o problema.

Todavia, experimente o que segue abaixo.

Código: Selecionar todos

Public ListSeriais As Variant
Public retornoSerial As String
Function retornaSerial(ByVal CodEquip As Long)
    Dim vID As Long
    For vID = 1 To UBound(ListSeriais)
       If vID = CodEquip Then
           retornoSerial = ListSeriais(vID)
           Exit For
       End If
    Next
End Function
Espero que te ajude.

Abs


Diovanino Cassio
Colaborador
Colaborador
Mensagens: 53
Registrado em: Qua Mar 15, 2017 11:31 am

Re: ModeloCadastro3ListView - [Resolvido]

Mensagem por Diovanino Cassio »

Saulo,

Me desculpe, mas o erro estava acontecendo porquê eu tinha colocado o BLOCO do CHANGE, em local incorreto. Estava sendo executado antes da abertura da planilha contendo os dados, ok?

Mais uma vez, te agradeço muito pela ajuda.

Sds,
Diovanino Cássio


Diovanino Cassio
Colaborador
Colaborador
Mensagens: 53
Registrado em: Qua Mar 15, 2017 11:31 am

Re: ModeloCadastro3ListView

Mensagem por Diovanino Cassio »

Saulo, boa tarde!

Já estou em fase final do meu sistema, e gostaria de aproveitar os vossos conhecimentos, para tentar solucionar um problema que tenho:
A maioria dos meus formulários, possui COMBOX que efetua o carregamento de informações, provenientes de outras planilhas (Exemplo: formulário custo de manutenção, tem COMBOX que busca dados da planilha contendo as informações dos equipamentos (campo codigoequipamento).
Gostaria que sempre que estivesse no formulário de controle dos custos das manutenções, e eu clicasse no botão de VOLTAR, estas planilhas abertas forem fechadas. No print acima, necessito fechar a planilha customanut.xlsx.
Estou lhe enviando um print da tela para evidenciar melhor o que estou necessitando, ok?

Sds,
Diovanino Cássio
Anexos
CodigoVBA.jpg
CodigoVBA.jpg (294.53 KiB) Exibido 5890 vezes


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: ModeloCadastro3ListView

Mensagem por srobles »

Diovanino,

Se as demais pastas de trabalho estiverem abertas na mesma instância do Excel, basta que você adicione ao código do botão voltar, a instrução :

Código: Selecionar todos

'Fechar pasta de trabalho
'True = Fecha a pasta salvando alterações
'False = Fecha a pasta sem salvar as alterações
WorkBooks("nomedapastaafechar.xlsx").Close , True
Creio que isso resolva seu problema.

Abs


Diovanino Cassio
Colaborador
Colaborador
Mensagens: 53
Registrado em: Qua Mar 15, 2017 11:31 am

Re: ModeloCadastro3ListView

Mensagem por Diovanino Cassio »

Saulo, bom dia!

Mais uma vez conto com a vossa ajuda para resolver os meus problemas de VBA, ok?

Tenho um problema no meus formulários de pesquisas, que é o ordenamento dos dados das colunas em ASCENDENTE e DESCENDENTE.
Uso o código VBA abaixo, para fazer ordenação de uma determinada coluna, quando clicar sobre ela.

Private Sub lstLista_ColumnClick(ByVal ColumnHeader As MSComctlLib.ColumnHeader)
' ordena a coluna ao clicar no título da mesma
lstLista.Sorted = False
lstLista.SortKey = ColumnHeader.Index - 1

If lstLista.SortOrder = lvwAscending Then
lstLista.SortOrder = lvwDescending
Else
lstLista.SortOrder = lvwAscending
End If

lstLista.Sorted = True
End Sub

Acontece que funciona bem, quando o dado é ALFA, mas quando é NÚMERO, ele não ordena na sequencia que pretendo que fique ordenado (ver arquivo em anexo).

Uma outra coisa que necessito, é que ao abrir o LISTVIEW, o meu último registro, seja o primeiro a ser mostrado, na primeira linha do LISTVIEW.

Sds,
Diovanino Cássio
Anexos
PrintTelaListView.jpg
PrintTelaListView.jpg (391.55 KiB) Exibido 5802 vezes


srobles
Jedi
Jedi
Mensagens: 805
Registrado em: Qua Mai 06, 2015 7:39 pm

Re: ModeloCadastro3ListView

Mensagem por srobles »

Diovanino,

Desculpe a demora amigo.

Creio que se você formatar sua coluna Registro da planilha como texto e modificar sua rotina de Cadastro para adicionar o 0 (zero) em índices menores que 10, resolva seu problema.

A forma como a classificação desta coluna no ListView está sendo feita no momento, está correta, pois ela classifica na ordem numérica mesmo. Como o número 19 começa em 1, sempre virá á frente do 2 e assim por diante.

Agora, se você acrescentar o 0 (zero) nos registros menores que 10, verá que os dados serão carregados da forma que deseja.

Para exibir sempre o último registro como sendo o primeiro da lista, após adicionar os dados ao ListView, faça:

Código: Selecionar todos

    With nomeSeuFormulario.ListView
         .Sorted = False
         'Informe qual coluna devemos ordenar
         .SortKey = 0 'Primeira coluna
         'Ou se preferir, use o indice do ComboBox Campo
         '.SortKey = nomeComboxCampo.ListIndex
        
         'Informe qual a forma de classificação
         .SortOrder = lvwAscending
         'Ou se preferir, use o indice do ComboBox Ordem
        '.SortOrder = nomeCombox.ListIndex
        'Classificamos os dados
        .Sorted = True
    End With
Todavia, deixo abaixo um modelo de exemplo.

Abs
Anexos
ordenar_ListView.zip
(33.91 KiB) Baixado 242 vezes


Disable adblock

This site is supported by ads and donations.
If you see this text you are blocking our ads.
Please consider a Donation to support the site.


Responder