Het volgende artikel laat zien hoe je een kalender kunt markeren en ondervragen 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.
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
