Následující článek ukazuje, jak označit a vyslýchat kalendář pomocí myš. 
* V reálném světě bychom otevřeli formulář pro čtení a zápis smysluplných záznamů deníku do databáze. Toto cvičení jednoduše odhalí mechaniku klikání vpravo a najde podrobnosti ze samotného listu.
Než začneme, několik slov o vysvětlení tabulky, jejíž pracovní model najdete zde.
Proces
Kliknutím na buňku v mřížce tuto buňku zvýrazníte a změníte její hodnotu. Kliknutím a tažením zvýrazníte rozsah a změníte jeho hodnoty. Pokud je buňka naplněna, bude vymazána, jinak bude vyplněna, v tomto případě znakem „*“.
Pravé kliknutí je naopak požadavek na informace z vybrané buňky.
Používají se v zásadě dvě události spolu s několika moduly.
- List_SelectionChange který se volá, když je vybrána buňka nebo buňky.
- List_BeforeRightClick který se volá pravým tlačítkem myši.
Problém
Kliknutím pravým tlačítkem na buňku se také vytvoří výběr, který se spustí SelectionChange. Budeme muset nechat tuto událost běžet, vymazat vybranou buňku, než se vzdá kontroly BeforeRightClick událost, kdy znovu osídlíme vymazanou buňku. Ale tato akce spustí Výběr změněn událost, kterou je třeba zastavit, aby ji znovu vyčistila.
To uděláme s logickou vlajkou zvanou blnLoading.
Události
V okně kódu za listem zadejte následující (tj. Ne v modulu).
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
To se postará o dvě události.
Odkazovaný kód
Připojte následující, vyplnění a vylidnění rozsahů do kódu:
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
Údržba mřížky
Vložte modul do aplikace. Přidejte následující kód pro zachování vzhledu mřížky. To bylo zkopírováno z makro rekordéru, propouštění a všeho.
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
Zabezpečení proti katastrofě
Každý, kdo se hodně věnuje vývoji v Excelu, ví, že složité tabulky xlsm mohou čas od času selhat a poškodit otevřený dokument. Ve větším počtu případů, než by se dalo očekávat, nelze poškozený sešit obnovit pomocí obnovovacích rutin Excelu. Pokud neexistují žádné zálohy, provedená práce se ztratí. Tomu lze zabránit pomocí nástrojů určených k provádění... Oprava aplikace Excel.
Úvod autora:
Felix Hooker je odborník na obnovu dat v oboru DataNumen, Inc., která je světovým lídrem v oblasti technologií pro obnovu dat, včetně oprava rar souborů a SQL softwarové produkty pro obnovu. Pro více informací navštivte www.datanumen.com
