Sljedeći članak pokazuje kako označiti i ispitati kalendar s miš. 
*U stvarnom svijetu, otvorili bismo obrazac za čitanje i pisanje smislenih dnevničkih unosa u bazu podataka. Ova vježba jednostavno otkriva mehaniku desnog_klikanja i pronalazi detalje sa samog radnog lista.
Prije nego što počnemo, nekoliko riječi objašnjenja o proračunskoj tablici, čiji radni model možete pronaći ovdje.
Proces
Klikom na ćeliju unutar mreže označit ćete tu ćeliju i promijeniti njezinu vrijednost. Klikom i povlačenjem označit ćete raspon i promijeniti njegove vrijednosti. Ako je ćelija popunjena, bit će izbrisana, u protivnom će biti popunjena, u ovom slučaju sa “*”.
Za razliku od toga, desni klik je zahtjev za informacijama iz odabrane ćelije.
U osnovi se koriste dva događaja, zajedno s nekoliko modula.
- Worksheet_SelectionChange koji se poziva kada se odabere ćelija ili ćelije.
- Radni list_prije desnog klika koji se poziva desnom tipkom miša.
Problem
Desni klik na ćeliju također predstavlja odabir, okidanje Promjena izbora. Morat ćemo pustiti taj događaj da teče svojim tijekom, brišući odabranu ćeliju prije nego što prepusti kontrolu Prije desnog klikak događaj, kada ćemo ponovno popuniti očišćenu ćeliju. Ali ova će radnja pokrenuti OdabirPromijenjen ponovnog događaja, koji se mora zaustaviti kako bi se ponovno očistio.
To ćemo učiniti s Boolean oznakom koja se zove blnLoading.
Događaji
Unesite sljedeće u prozor koda iza radnog lista (tj. ne u 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
Ovo se brine za dva događaja.
Referentni kod
Kodu dodajte sljedeće raspone za popunjavanje i popunjavanje:
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
Održavanje mrežnih linija
Umetnite modul u aplikaciju. Dodajte sljedeći kod za održavanje izgleda mreže. Ovo je kopirano iz makro snimača, redundancije i sve.
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
Zaštita od katastrofe
Svatko tko se puno bavi razvojem u Excelu zna da se složene xlsm proračunske tablice s vremena na vrijeme mogu srušiti, oštećujući otvoreni dokument. U više slučajeva nego što bi se očekivalo, oštećena radna knjiga ne može se oporaviti Excelovim rutinama oporavka. Ako nema sigurnosnih kopija, obavljeni rad se gubi. To se može spriječiti alatima dizajniranim za izvođenje... Excel popravak.
Uvod za autora:
Felix Hooker je stručnjak za oporavak podataka u DataNumen, Inc., koji je svjetski lider u tehnologijama za oporavak podataka, uključujući popravak rar-a i softverski proizvodi za oporavak sql-a. Za više informacija posjetite www.datanumen.com
