Järgmises artiklis kirjeldatakse, kuidas kalendrit märgistada ja päringuid teha hiir. 
*Reaalses maailmas avaksime vormi, et lugeda ja andmebaasi kirjutada sisukaid päevikukirjeid. See harjutus näitab lihtsalt paremklõpsamise mehhanismi ja leiab üksikasjad töölehelt endalt.
Enne alustamist paar sõna selgitust tabeli kohta, mille töötav mudel on leitav siin.
Process
Võrgustikus lahtril klõpsamine tõstab selle lahtri esile ja muudab selle väärtust. Klõpsamine ja lohistamine tõstab esile vahemiku ja muudab selle väärtusi. Kui lahter on täidetud, siis see tühjendatakse, vastasel juhul täidetakse see, antud juhul tähega *.
Paremklõps seevastu on teabepäring valitud lahtrist.
Põhimõtteliselt kasutatakse kahte sündmust koos mitme mooduliga.
- Worksheet_SelectionChange mida kutsutakse lahtri või lahtrite valimisel.
- Worksheet_BeforeRightClick mida kutsutakse hiire parema nupuga.
Probleem
Lahtri paremklõpsamine kujutab endast ka valikut, käivitamist ValikMuuda. Peame laskma sellel sündmusel kulgeda, tühjendades valitud lahtri, enne kui see loovutab kontrolli EnneRightClick sündmus, kui asustame puhastatud lahtri uuesti. Kuid see toiming käivitab ValikMuudetud sündmus uuesti, mille kustutamine tuleb uuesti peatada.
Seda teeme tõeväärtusliku lipuga nimega blnLoading.
Sündmused
Sisesta töölehe taga olevasse koodiaknasse (st mitte moodulisse) järgmine.
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
See hoolitseb kahe sündmuse eest.
Viidatud kood
Lisage koodile järgmised vahemikud, täites ja tühjendades:
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
Võrguliinide hooldus
Sisestage rakendusse moodul. Lisage ruudustiku välimuse säilitamiseks järgmine kood. See kopeeriti makrosalvestist, koondamised ja kõik.
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
Kaitse katastroofi eest
Igaüks, kes tegeleb palju Exceli arendamisega, teab, et keerulised xlsm-tabelid võivad aeg-ajalt kokku kukkuda, rikkudes avatud dokumendi. Oodatust sagedamini ei saa kahjustatud töövihikut Exceli taastamisrutiinidega taastada. Kui varukoopiaid pole, on tehtud töö lost. Seda saab vältida tööks mõeldud tööriistadega Exceli parandus.
Autori sissejuhatus:
Felix Hooker on andmete taastamise ekspert DataNumen, Inc., mis on maailmas juhtiv andmete taastamise tehnoloogiate, sealhulgas rar remont ja SQL-i taastamise tarkvaratooted. Lisateabe saamiseks külastage www.datanumenCom
