Eu estou trabalhando em simples aplicativo excel paravários usuários que digitarão os dados durante os diferentes estágios do processo. Infelizmente eu encontrei os problemas com o armazenamento de dados de vários userforms em uma linha da tabela.
Vou tentar explicar o que é a coisa toda tão clara quanto posso.
Por exemplo, eu chamei o aplicativo "Movie Time Control". Vamos imaginar que é uma ferramenta para controlar os filmes assistidos com foco em:
- quando o filme começou
- se houve algumas pausas durante a exibição (e por quê)
- quando o filme foi reiniciado (quanto tempo durou o intervalo e quantas pausas houve e quais ações foram tomadas para continuar),
- no caso quando o filme foi abortado, quando e por quê?
- quando o filme terminou.
O MENU do segmento de aplicação será exibido na imagem abaixo:
Para cada botão, um userform diferente é atribuído. Os dados inseridos em cada formulário devem ser armazenados em uma linha na folha específica.
Funcionalidade dos userforms:
- MOVIE START: Criando a entrada na tabela com o título do filme, a data e a hora quando ela é iniciada.
- QUEBRA DE FILME: Com base no título do filme previamente definido, preenchendo a data e hora, motivo de quebra (a partir da lista suspensa ou caixa de texto, se não padrão). A função pode ser usada até três vezes (três quebras).
- REINICIAR FILME: Se a quebra ocorreu, preenchendo as informações sobre a data, a hora em que o filme foi reiniciado e qual ação foi tomada para lidar com o motivo de quebra previamente definido. Para cada pausa (possível três) a função pode ser usada.
- MOVIE ABORT Quando filme (data e hora) foi cancelado (sem intenção de continuar).
- MOVIE FINISHED Quando o filme (data e hora) terminar.
Onde os problemas ocorreram (perguntas):
- Quando os dados da primeira linha são inseridos, oA entrada com o título específico é criada na folha separada da tabela. Com base nessa entrada, o Title Combobox em todos os outros userforms deve listar os títulos que foram iniciados, mas não finalizados ou abortados - apenas para escolher rapidamente o "título aberto" e preencher outras informações relacionadas ao título. Como criar uma macro para listar os "casos abertos" na caixa de combinação?
- Eu não consegui descobrir como transferir o restoos dados para a mesma linha da tabela, mas colunas diferentes de todos os formulários depois de criar a entrada com o título do filme específico. O importante é que os dados podem ser adicionados apenas à linha com o título correspondente (escolhido da caixa de combinação da primeira pergunta). Você poderia me ajudar com a macro?
Macros Eu criei até agora (eu sou muito iniciante com o VBA, obrigado pela compreensão):
MOVIE START: Para criar a entrada com o título do filme.
Private Sub movie_start_save_Click()
If MsgBox("ARE YOU SURE?", vbYesNo, "Please confirm") = vbYes Then
Dim emptyRow As Long
"Make Sheet2 active
Sheet2.Activate
"Determine emptyRow
emptyRow = WorksheetFunction.CountA(Range("A:A")) + 1
"Transfer information
Cells(emptyRow, 1).Value = Movie_Title_Box.Value
Cells(emptyRow, 2).Value = Start_Date_Box.Value
Cells(emptyRow, 3).Value = Start_Time_Box.Value
"Closing the form
Unload Me
"Back to MENU
Sheet1.Select
End If
End Sub
Private Sub movie_start_cancel_Click()
Unload Me
End Sub
MOVIE BREAK: Para definir a hora e o motivo (não é possível transferir os dados):
Private Sub UserForm_Initialize()
"Fill ReasonComboBox
With ReasonComboBox
.AddItem "Tea"
.AddItem "Coffee"
.AddItem "Popcorn"
.AddItem "Dinner"
.AddItem "Not standard"
End With
"Default text in the reason box
ReasonTextBox.ForeColor = &HC0C0C0 "<~~ Grey Color
ReasonTextBox.Text = "In case of "not standard" reason leave your comment here"
movie_break_cancel.SetFocus "<~~ This is required so that the focus moves from TB
End Sub
"Default text in the reason box - disapearing when you want to edit
Private Sub ReasonTextBox_Enter()
With ReasonTextBox
If .Text = "In case of "not standard" reason leave your comment here" Then
.ForeColor = &H80000008 "<~ Black Color
.Text = ""
End If
End With
End Sub
"Default text in the reason box - somehow disappearing for good, but ok
Private Sub ReasonTextBox_AfterUpdate()
With ReasonTextBox
If .Text = "" Then
.ForeColor = &H80000008
.Text = ""
End If
End With
End Sub
"Cancel Button
Private Sub movie_break_cancel_Click()
Unload Me
End Sub
O resto é similar com algumas diferenças.
Link para baixar o arquivo excel:
https://drive.google.com/file/d/0BxFSL2h-9qflQjRzNTQ2ZlhJNjA/view?usp=sharing
Espero ter me expressado o suficiente para entender isso. Saudações!
Respostas:
0 para resposta № 1No meu exemplo abaixo, mostro como configurar umComboBox para armazenar várias colunas de dados e, posteriormente, recuperar os valores. Isso permitirá que você armazene o número da linha junto com os dados do filme na caixa de combinação.
"Filtrando para trabalhos não concluídos para combobox Private Sub UserForm_Initialize () Dim ws como planilha Dim x Quanto tempo
With Me.Movie_Title_ComboBox
.ColumnCount = 4
.ColumnWidths = "0 pt;250 pt;90 pt; 90 pt;"
".ListWidth = 500
.TextColumn = 2
.BoundColumn = 1
End With
Set ws = Sheet2
With ws
For x = 2 To .Range("A" & .Rows.Count).End(xlUp).Row
If .Cells(x, 4).Value = "" Then
AddItems Me.Movie_Title_ComboBox, x, .Cells(x, 1).Value, Format(.Cells(x, 3).Value, "MM/DD/YYYY"), Format(.Cells(x, 3).Value, "HH:MM")
End If
Next
End With
End Sub
Private Sub Movie_Title_ComboBox_Change()
With Me.Movie_Title_ComboBox
If .ListIndex > -1 Then
Finish_Date_Box.Value = .List(.ListIndex, 2)
End If
End With
End Sub
Private Sub movie_finished_save_Click()
With Sheet2
.Cells(Me.Movie_Title_ComboBox.Value, 4) = Me.Finish_Date_Box.Value
.Cells(Me.Movie_Title_ComboBox.Value, 5) = Me.Start_Time_Box.Value
End With
End Sub
Adicione esta função a um Módulo de Código Público para que fique disponível para todos os seus formulários de usuário.
Sub AddItems(oComboBox As MSForms.ComboBox, ParamArray Items() As Variant)
Dim x As Long
With oComboBox
.AddItem Items(0)
For x = 1 To UBound(Items)
.List(.ListCount - 1, x) = Items(x)
Next
End With
End Sub