/ / Excel 2013 VBA vários userforms para preencher a tabela - excel, vba, excel-vba

Excel 2013 VBA vários userforms para preencher a tabela - excel, vba, excel-vba

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:

insira a descrição da imagem aqui

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:

  1. MOVIE START: Criando a entrada na tabela com o título do filme, a data e a hora quando ela é iniciada.
  2. 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).
  3. 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.
  4. MOVIE ABORT Quando filme (data e hora) foi cancelado (sem intenção de continuar).
  5. MOVIE FINISHED Quando o filme (data e hora) terminar.

Onde os problemas ocorreram (perguntas):

  1. 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?
  2. 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 № 1

No 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