Comment créer un calendrier de projet avec "Cliquer-glisser" dans Excel

Partage maintenant:

L'article suivant montre comment baliser et interroger un calendrier avec la souris. Marquer et interroger un calendrier avec la souris

* Dans le monde réel, nous ouvririons un formulaire pour lire et écrire des entrées de journal significatives dans une base de données. Cet exercice révèle simplement la mécanique du clic droit et trouve les détails de la feuille de calcul elle-même.

Avant de commencer, quelques mots d'explication sur la feuille de calcul, dont un modèle de travail peut être trouvé ici.Quelques mots d'explication sur la feuille de calcul

Le processus

Cliquer sur une cellule dans la grille mettra cette cellule en surbrillance et modifiera sa valeur. Cliquer et faire glisser mettra en surbrillance une plage et modifiera ses valeurs. Si une cellule est renseignée, elle sera effacée, sinon elle sera renseignée, en l'occurrence par un « * ».

Un clic droit, en revanche, est une demande d'informations à partir de la cellule sélectionnée.

Il y a essentiellement deux événements utilisés, ainsi que plusieurs modules.

  • Feuille de travail_SelectionChange qui est appelée lorsqu'une ou plusieurs cellules sont sélectionnées.
  • Feuille de calcul_AvantClic droit qui est appelé par le bouton droit de la souris.

Le problème

Un clic droit sur une cellule constitue également une sélection, déclenchant SélectionModifier. Nous devrons laisser cet événement suivre son cours, en effaçant la cellule sélectionnée avant qu'elle ne cède le contrôle au AvantClicDroitk événement, lorsque nous repeuplerons la cellule effacée. Mais cette action déclenchera le SélectionChangé événement à nouveau, qui doit être empêché de l'effacer une fois de plus.

Nous allons le faire avec un indicateur booléen appelé blnLoading.

Les événements

Entrez ce qui suit dans la fenêtre de code derrière la feuille de calcul (c'est-à-dire pas dans un module).

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

Cela prend soin des deux événements.

Code référencé

Ajoutez les plages de remplissage et de dépeuplement suivantes au code :

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

Entretien des quadrillages

Insérez un module dans l'application. Ajoutez le code suivant pour conserver l'apparence de la grille. Cela a été copié à partir de l'enregistreur de macros, des redondances et de tout.

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

Se prémunir contre la catastrophe

Quiconque développe régulièrement avec Excel sait que les feuilles de calcul xlsm complexes peuvent planter de temps à autre, corrompant le document ouvert. Plus souvent qu'on ne le pense, le classeur endommagé est irrécupérable par les fonctions de récupération d'Excel. Sans sauvegarde, tout le travail effectué est perdu. Il est possible d'éviter ce problème grâce à des outils conçus pour effectuer des sauvegardes. Correctif Excel.

Introduction de l'auteur:

Felix Hooker est un expert en récupération de données dans DataNumen, Inc., qui est le leader mondial des technologies de récupération de données, y compris réparation rar et produits logiciels de récupération sql. Pour plus d'informations, visitez www.datanumen.com

Partage maintenant:

Les commentaires sont fermés.