O seguinte artigo mostra como marcar e interrogar um calendário com o mouse.
*No mundo real, abriríamos um formulário para ler e gravar entradas de diário significativas em um banco de dados. Este exercício simplesmente revela a mecânica de clicar com o botão direito do mouse e encontra os detalhes na própria planilha.
Antes de começar, algumas palavras de explicação sobre a planilha, cujo modelo de trabalho pode ser encontrado aqui.
O Processo
Clicar em uma célula dentro da grade destacará essa célula e alterará seu valor. Clicar e arrastar destacará um intervalo e alterará seus valores. Se uma célula for preenchida, ela será apagada, caso contrário será preenchida, neste caso por um “*”.
Um clique com o botão direito do mouse, por outro lado, é uma solicitação de informações da célula selecionada.
Existem essencialmente dois eventos usados, juntamente com vários módulos.
- Worksheet_SelectionAlterar que é chamado quando uma célula ou células são selecionadas.
- Planilha_BeforeRightClick que é chamado pelo botão direito do mouse.
O Problema
Clicar com o botão direito em uma célula também constitui uma seleção, acionando Alteração de seleção. Teremos que deixar esse evento seguir seu curso, limpando a célula selecionada antes que ela entregue o controle ao AntesRightClick evento, quando vamos repovoar a célula limpa. Mas essa ação acionará o Seleção alterada evento novamente, que deve ser impedido de limpá-lo novamente.
Faremos isso com um sinalizador booleano chamado blnLoading.
Os eventos
Digite o seguinte na janela de código atrás da planilha (ou seja, não em um módulo).
Opção Explícita Dim blnLoading As Boolean Dim sPhase As String Dim currCellValue As String Dim dDate As Date Private Sub Worksheet_SelectionChange(ByVal Target As Range) Se ActiveCell.Row > 14 E ActiveCell.Row < 25 Then If ActiveCell.Column > 4 E ActiveCell.Column < 47 Then 'selection is valid On Error Resume Next currCellValue = Target.Value 'obter o tarobter valor de (ByVal Target As Range) If blnLoading = True Then 'um valor True forçará uma saída deste evento blnLoading = False Exit Sub End If sPhase = Cells(ActiveCell.Row, 1) If sPhase = "" Then Exit Sub If ActiveCell = " *" Then 'se a célula estiver preenchida, limpe o intervalo selecionado Call ClearRange Call UnblockCalendar Else Call PopulateRange End If Call RedrawCells Range("A1").Select 'revive o evento SelectionChange alterando a seleção. Sair Sub End If End If End Sub Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) If currCellValue = "*" Then 'colhido pelo evento anterior ANTES de limpá-lo; 'Isso significa que esta é uma entrada de diário válida com detalhes. blnLoading = True 'isso impedirá que o evento SelectionChange (acima) seja executado. Target.Select 'currCell = Target.Address 'Range(currCell).Selecione Target.Value = "*" 'reinstaura o valor da célula, já que SelectionChange a limpou Call PopulateRange dDate = Cells(13, ActiveCell.Column) sPhase = Cells(ActiveCell.Row, 1) MsgBox dDate & " - " & sPhase Cancel = True 'suprime os menus de atalho padrão do Excel End If Range("A1").Select blnLoading = False End Sub
Isso cuida dos dois Eventos.
Código referenciado
Anexe os seguintes intervalos de preenchimento e despovoamento ao código:
Sub ClearRange() Selection.FormulaR1C1 = "" Com Selection.Interior .Pattern = xlNone .TintAndShade = 0 .PatternTintAndShade = 0 End With End Sub Sub PopulateRange() Selection.FormulaR1C1 = "*" Com Selection.Interior .Pattern = xlSolid . PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorLight2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With End Sub
Manutenção de Linhas de Grade
Insira um módulo no aplicativo. Adicione o código a seguir para manter a aparência da grade. Isso foi copiado do gravador de macro, redundâncias e tudo.
Opção explícita Sub UnblockCalendar() Selection.FormulaR1C1 = "" Com seleção Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone Selection.Borders(xlEdgeLeft).LineStyle = xlNone Selection.Borders(xlEdgeTop) .LineStyle = xlNone Selection.Borders(xlEdgeBottom).LineStyle = xlNone Selection.Borders(xlEdgeRight).LineStyle = xlNone Selection.Borders(xlInsideVertical).LineStyle = xlNone Selection.Borders(xlInsideHorizontal).LineStyle = xlNone End With End Sub Sub RedrawCells () Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection. Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection. Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection. Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With End Sub
Proteção contra catástrofes
Qualquer pessoa que desenvolve muito Excel sabe que planilhas xlsm complexas podem travar de vez em quando, corrompendo o documento aberto. Em mais casos do que o esperado, a pasta de trabalho danificada não pode ser recuperada pelas rotinas de recuperação do Excel. Se não houver backups, o trabalho feito é lost. Isso pode ser evitado com ferramentas projetadas para executar Correção do Excel.
Introdução do autor:
Felix Hooker é um especialista em recuperação de dados em DataNumen, Inc., líder mundial em tecnologias de recuperação de dados, incluindo rar reparar e produtos de software de recuperação SQL. Para mais informações visite www.datanumen.com