Como criar um cronograma de projeto com "clique e arraste" no Excel

Compartilhe agora:

O seguinte artigo mostra como marcar e interrogar um calendário com o mouse. Marque e interrogue 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..Algumas palavras de explicação sobre a planilha

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).

Option Explicit

    Dim blnLoading As Boolean
    Dim sPhase As String
    Dim currCellValue As String
    Dim dDate As Date

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     If ActiveCell.Row > 14 And ActiveCell.Row < 25 Then
         If ActiveCell.Column > 4 And ActiveCell.Column < 47 Then 'selection is valid
 
             On Error Resume Next
             currCellValue = Target.Value 'get the target value from (ByVal Target As Range)
 
             If blnLoading = True Then 'a value of True will force an exit from this event
                 blnLoading = False
                 Exit Sub
             End If
 
             sPhase = Cells(ActiveCell.Row, 1)
             If sPhase = "" Then Exit Sub
 
             If ActiveCell = "*" Then 'if the cell is populated, clear the selected range
                 Call ClearRange
                 Call UnblockCalendar
             Else
                 Call PopulateRange
             End If
 
             Call RedrawCells
             Range("A1").Select 'revive the SelectionChange event by changing selection.
             Exit Sub
         End If
     End If
End Sub

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
     If currCellValue = "*" Then   'picked up by the previous event BEFORE it cleared it;
                                     'This means this is a valid diary entry with detail.
        blnLoading = True    'this will prevent the SelectionChange event (above) from running.
        Target.Select
        'currCell = Target.Address
        'Range(currCell).Select

            Target.Value = "*" 're-instate the value of the cell, since SelectionChange has cleared it
            Call PopulateRange
            dDate = Cells(13, ActiveCell.Column)
            sPhase = Cells(ActiveCell.Row, 1)
            MsgBox dDate & " - " & sPhase
        Cancel = True 'suppress Excel’s standard right_click menus
    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 = ""
     With Selection.Interior
         .Pattern = xlNone
         .TintAndShade = 0
         .PatternTintAndShade = 0
     End With
End Sub

Sub PopulateRange()
     Selection.FormulaR1C1 = "*"
     With 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.

Option Explicit

Sub UnblockCalendar()
     Selection.FormulaR1C1 = ""
     With Selection
         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

Quem trabalha com desenvolvimento em Excel sabe que planilhas complexas em formato XLSM podem travar ocasionalmente, corrompendo o documento aberto. Em muitos casos, a pasta de trabalho danificada não pode ser recuperada pelas rotinas de recuperação do Excel. Se não houver backups, todo o trabalho realizado estará perdido. Isso pode ser evitado com ferramentas desenvolvidas para realizar essa tarefa. 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 reparo rar e produtos de software de recuperação SQL. Para mais informações visite www.datanumen.com

Compartilhe agora:

Comentários estão fechados.