paulocezar,
Ok, vamos lá :
Primeiramente, alterei a rotina no evento Initialize do formulário, que era:
totaldelinhas = Worksheets("BancodeDados").UsedRange.Rows.Count
CAIXA_LOCALIZA.RowSource = "BancodeDados!e2:e" & totaldelinhas
Por esta :
With CAIXA_LOCALIZA
.Clear
Dim linhaAtual As Long
linhaAtual = 8
ThisWorkbook.Sheets("BancodeDados").Activate
While ActiveSheet.Cells(linhaAtual, 5) <> ""
.AddItem ActiveSheet.Cells(linhaAtual, 5)
linhaAtual = linhaAtual + 1
Wend
End With
limparCampos
Que faz basicamente a mesma coisa, porém, menos suscetível á erros.
E depois, foram alteradas as rotinas contidas no ComboBox CAIXA_LOCALIZA:
Que era :
Private Sub CAIXA_LOCALIZA_Click()
totalregistro = Worksheets("BancodeDados").UsedRange.Rows.Count
For i = 2 To totalregistro
If CAIXA_LOCALIZA.ListIndex = i Then
nome_encontrado = i
LISTA_ELETRICISTA1 = Cells(i + 2, 2)
LISTA_ELETRICISTA2 = Cells(i + 2, 3)
DATA_ENTREGA = Cells(i + 2, 4)
NUMERO_OS = Cells(i + 2, 5)
STATUS = Cells(i + 2, 6)
Exit Sub
End If
Next
End Sub
Que foi alterado para :
Private Sub CAIXA_LOCALIZA_Click()
With ThisWorkbook.Sheets("BancodeDados")
.Activate
Dim vBusca
Set vBusca = Nothing
With .Range("A:Z")
Set vBusca = .Find(CAIXA_LOCALIZA, LookIn:=xlValues, LookAt:=xlWhole)
If Not vBusca Is Nothing Then
.Range(vBusca.Address).Select
LISTA_ELETRICISTA1 = Cells(ActiveCell.Row, 2)
LISTA_ELETRICISTA2 = Cells(ActiveCell.Row, 3)
DATA_ENTREGA = Cells(ActiveCell.Row, 4)
NUMERO_OS = Cells(ActiveCell.Row, 5)
STATUS = Cells(ActiveCell.Row, 6)
Else
MsgBox "OS não encontrada!", vbExclamation, "Erro"
LISTA_ELETRICISTA1 = ""
LISTA_ELETRICISTA2 = ""
DATA_ENTREGA = ""
NUMERO_OS = ""
STATUS = ""
End If
Set vBusca = Nothing
End With
End With
End Sub
Que nada mais é, que a chamada da função localizar do Excel, porém, se encontrar o valor, preenche os campos com os valores da linha onde o mesmo foi encontrado e, caso contrário, limpa os campos.
E no botão 3 (Inserir OS), que era :
Private Sub CommandButton3_Click()
Application.ScreenUpdating = False
'Cria a variavel linhavazia
Dim Irow As Long
'Confere se o campo nome foi preenchido
If LISTA_ELETRICISTA1.Value = "" Then
If LISTA_ELETRICISTA2.Value = "" Then
MsgBox ("Os campos nomes dos eletricistas são obrigatórios")
LISTA_ELETRICISTA1.SetFocus
Exit Sub
Else
End If
'seleciona a aba "BancodeDados"
Sheets("BancodeDados").Select
With Sheets("BancodeDados")
'conta quantas informações foram inseridas na coluna B da aba prestacoes
Irow = .Cells(.Rows.Count, "B").End(xlUp).Row + 1
'Insere informações da aba prestacoes
Cells(Irow, 2).Value = LISTA_ELETRICISTA1.Value
Cells(Irow, 3).Value = LISTA_ELETRICISTA2.Value
Cells(Irow, 4).Value = Format(DATA_ENTREGA.Value, "mm/dd/yyyy")
Cells(Irow, 5).Value = NUMERO_OS.Value
Cells(Irow, 6).Value = STATUS.Value
End With
'Volta para a aba MENU
Sheets("BancodeDados").Select
End If
End Sub
E ficou assim :
Private Sub CommandButton3_Click()
Application.ScreenUpdating = False
'Cria a variavel linhavazia
Dim Irow As Long
'Confere se o campo nome foi preenchido
If LISTA_ELETRICISTA1.Value = "" Or LISTA_ELETRICISTA2.Value = "" Then
MsgBox ("Os campos nomes dos eletricistas são obrigatórios")
LISTA_ELETRICISTA1.SetFocus
Exit Sub
Else
'seleciona a aba "BancodeDados"
Sheets("BancodeDados").Select
With Sheets("BancodeDados")
'conta quantas informações foram inseridas na coluna B da aba prestacoes
Irow = .Cells(.Rows.Count, "B").End(xlUp).Row
'Insere informações da aba prestacoes
Cells(Irow, 2).Value = LISTA_ELETRICISTA1.Value
Cells(Irow, 3).Value = LISTA_ELETRICISTA2.Value
Cells(Irow, 4).Value = Format(DATA_ENTREGA.Value, "mm/dd/yyyy")
Cells(Irow, 5).Value = NUMERO_OS.Value
Cells(Irow, 6).Value = STATUS.Value
End With
'Volta para a aba MENU
Sheets("BancodeDados").Select
End If
Application.ScreenUpdating = True
UserForm_Initialize
End Sub
Onde apenas recarregamos o formulário ao final da rotina.
Basicamente, refiz algumas das rotinas (que ficaram mais extensas, porém com menor probabilidade á erros) que você havia feito (mais simples, porém, com maior probabilidade á erros) apenas para manipularmos os dados sem que erros pudessem ocorrer.
Espero ter ajudado e sanado suas dúvidas.
Abs
Espero ter ajudado.
Abs.
Saulo Robles
Postado : 15/03/2018 2:10 pm