Nasledujúci článok ukazuje, ako označiť a interogovať kalendár pomocou myš. 
* V skutočnom svete by sme otvorili formulár na čítanie a zápis zmysluplných záznamov do denníka. Toto cvičenie jednoducho odhalí mechaniku klikania doprava a nájde podrobnosti zo samotného pracovného hárka.
Než začneme, niekoľko vysvetlení k tabuľke, ktorej funkčný model nájdete tu.
Proces
Kliknutím na bunku v mriežke sa táto bunka zvýrazní a zmení sa jej hodnota. Kliknutím a ťahaním zvýrazníte rozsah a zmeníte jeho hodnoty. Ak je bunka vyplnená, vymaže sa, inak sa vyplní, v tomto prípade znakom „*“.
Kliknutie vpravo je naopak požiadavkou na informácie z vybranej bunky.
Používajú sa v podstate dve udalosti spolu s niekoľkými modulmi.
- Worksheet_SelectionChange ktorý sa volá, keď sa vyberie bunka alebo bunky.
- Pracovný list_BeforeRightClick ktorá sa volá pravým tlačidlom myši.
Problém
Kliknutie doprava predstavuje tiež výber, ktorý sa spustí SelectionChange. Budeme musieť nechať tejto udalosti voľný priebeh, vyčistiť vybranú bunku skôr, ako odovzdá kontrolu nad BeforeRightClick udalosti, keď znovu osídlime vyčistenú bunku. Ale táto akcia spustí Výber zmenený udalosti, ktorej zastavenie je potrebné ešte raz vyčistiť.
Urobíme to s logickou vlajkou zvanou blnLoading.
Udalosti
Do okna s kódom za pracovným hárkom (tj. Nie do modulu) zadajte toto.
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
Toto sa postará o dve udalosti.
Odkazovaný kód
Pripojte k kódu nasledujúce vyplňovacie a vyľudňujúce rozsahy:
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 mriežky
Vložte modul do aplikácie. Pridajte nasledujúci kód na zachovanie vzhľadu mriežky. Toto bolo skopírované z makro rekordéra, prepúšťania a všetkého.
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
Ochrana pred katastrofou
Každý, kto sa venuje vývoju v Exceli, vie, že zložité tabuľky xlsm môžu z času na čas zlyhať a poškodiť otvorený dokument. Vo viacerých prípadoch, ako by sa dalo očakávať, sa poškodený zošit nedá obnoviť pomocou obnovovacích rutín programu Excel. Ak neexistujú žiadne zálohy, vykonaná práca sa stratí. Tomu sa dá zabrániť pomocou nástrojov určených na vykonávanie... Oprava programu Excel.
Úvod autora:
Felix Hooker je expert na obnovu dát v DataNumen, Inc., ktorá je svetovým lídrom v oblasti technológií obnovy dát, vrátane oprava súboru RAR a softvérové produkty na obnovenie sql. Pre viac informácií navštívte www.datanumen. S
