Hoe u een projectplanning maakt met "Klik-en-slepen" in Excel

Het volgende artikel laat zien hoe je een kalender kunt markeren en ondervragen met de muis. Markeer en ondervraag een kalender met de muis

* In de echte wereld openden we een formulier om zinvolle dagboekaantekeningen te lezen en in een database te schrijven. Deze oefening onthult eenvoudig de werking van rechtsklikken en vindt de details op het werkblad zelf.

Voordat we beginnen, een paar woorden uitleg over de spreadsheet, waarvan u een werkend model kunt vinden hier.Een paar woorden uitleg over de spreadsheet

Het proces

Als u op een cel in het raster klikt, wordt die cel gemarkeerd en verandert de waarde ervan. Met klikken en slepen wordt een bereik gemarkeerd en worden de waarden ervan gewijzigd. Als een cel is gevuld, wordt deze leeggemaakt, anders wordt deze gevuld, in dit geval met een "*".

Een right_click daarentegen is een verzoek om informatie uit de geselecteerde cel.

Er worden in wezen twee evenementen gebruikt, samen met verschillende modules.

  • Werkblad_SelectieWijzigen die wordt aangeroepen wanneer een cel of cellen zijn geselecteerd.
  • Werkblad_BeforeRightClick die wordt aangeroepen door de rechter muisknop.

Het probleem

Met de rechtermuisknop op een cel klikken vormt ook een selectie, een activering Selectie wijzigen. We zullen die gebeurtenis moeten laten verlopen en de geselecteerde cel moeten wissen voordat de controle wordt overgedragen aan de VoorRightClick-evenement, wanneer we de gewiste cel opnieuw zullen bevolken. Maar deze actie zal het Selectie gewijzigd gebeurtenis opnieuw, die moet worden gestopt om het opnieuw te wissen.

Dit zullen we doen met een booleaanse vlag genaamd blnLoading.

De evenementen

Typ het volgende in het codevenster achter het werkblad (dus niet in een 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

Dit zorgt voor de twee evenementen.

Code waarnaar wordt verwezen

Voeg de volgende bereiken toe aan de 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

Onderhoud van rasterlijnen

Voeg een module in de applicatie in. Voeg de volgende code toe om het uiterlijk van het raster te behouden. Dit werd gekopieerd van de macrorecorder, redundanties en zo.

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

Beveiliging tegen catastrofe

Iedereen die veel met Excel werkt, weet dat complexe XLSM-spreadsheets zo nu en dan kunnen vastlopen en het geopende document beschadigen. In meer gevallen dan je zou verwachten, kan de beschadigde werkmap niet worden hersteld door de herstelfuncties van Excel. Zonder back-ups gaat het werk verloren. Dit kan worden voorkomen met tools die speciaal zijn ontworpen om dit te voorkomen. Excel-oplossing.

Auteur Introductie:

Felix Hooker is een expert op het gebied van gegevensherstel DataNumen, Inc., de wereldleider in technologieën voor gegevensherstel, waaronder zeldzame reparatie en sql-herstelsoftwareproducten. Voor meer informatie bezoek www.datanumen.com

Reacties zijn gesloten.