Il seguente articolo mostra come contrassegnare e interrogare un calendario con il topo. 
*Nel mondo reale, apriremmo un modulo per leggere e scrivere voci di diario significative in un database. Questo esercizio rivela semplicemente i meccanismi del clic con il tasto destro e trova i dettagli dal foglio di lavoro stesso.
Prima di iniziare, alcune parole di spiegazione sul foglio di calcolo, di cui è possibile trovare un modello funzionante Qui..
Come funziona
Facendo clic su una cella all'interno della griglia, la evidenzierà e ne modificherà il valore. Fare clic e trascinare evidenzierà un intervallo e ne modificherà i valori. Se una cella è popolata, verrà cancellata, altrimenti verrà popolata, in questo caso da un “*”.
Un clic destro invece è una richiesta di informazioni dalla cella selezionata.
Vengono utilizzati essenzialmente due eventi, insieme a diversi moduli.
- Foglio di lavoro_Cambia selezione che viene chiamato quando vengono selezionate una o più celle.
- Foglio di lavoro_prima del clic destro che viene richiamato dal tasto destro del mouse.
Il problema
Fare clic con il tasto destro su una cella costituisce anche una selezione, triggering SelezioneCambia. Dovremo lasciare che l'evento faccia il suo corso, liberando la cella selezionata prima che ceda il controllo al Prima di destraClick evento, quando ripopoleremo la cella cancellata. Ma questa azione attiverà il SelezioneModificata nuovamente l'evento, che deve essere impedito di cancellarlo ancora una volta.
Lo faremo con un flag booleano chiamato blnLoading.
Gli eventi
Immettere quanto segue nella finestra del codice dietro il foglio di lavoro (cioè non in un modulo).
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
Questo si prende cura dei due eventi.
Codice di riferimento
Aggiungi i seguenti intervalli di popolamento e spopolamento al codice:
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
Manutenzione delle linee della griglia
Inserire un modulo nell'applicazione. Aggiungere il codice seguente per mantenere l'aspetto della griglia. Questo è stato copiato dal registratore di macro, ridondanze e tutto il resto.
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
Salvaguardia contro la catastrofe
Chiunque si occupi di sviluppo Excel sa che i fogli di calcolo xlsm complessi possono a volte bloccarsi, corrompendo il documento aperto. In più casi di quanto ci si potrebbe aspettare, la cartella di lavoro danneggiata non può essere recuperata dalle routine di ripristino di Excel. Se non ci sono backup, il lavoro svolto andrà perso. Questo può essere evitato con strumenti progettati per eseguire Correzione di Excel.
Introduzione dell'autore:
Felix Hooker è un esperto di recupero dati in DataNumen, Inc., che è il leader mondiale nelle tecnologie di recupero dati, tra cui riparazione rar e prodotti software di recupero SQL. Per maggiori informazioni visita www.datanumen.com
