A következő cikk bemutatja, hogyan jelölhet ki és lekérdezhet egy naptárt a egér. 
*A valós világban megnyitunk egy űrlapot, hogy tartalmas naplóbejegyzéseket olvassunk és írjunk egy adatbázisba. Ez a gyakorlat egyszerűen feltárja a right_clicking mechanikáját, és magáról a munkalapról találja meg a részleteket.
Mielőtt elkezdenénk, néhány szó magyarázat a táblázatról, amelynek működő modellje megtalálható itt .
A folyamat
Ha rákattint egy cellára a rácson belül, az kijelöli azt a cellát, és megváltoztatja annak értékét. A kattintással és húzással kijelöl egy tartományt, és megváltoztatja annak értékeit. Ha egy cella kitöltve van, akkor törlődik, ellenkező esetben kitölti, ebben az esetben egy „*”.
Ezzel szemben a jobb_kattintás egy információ kérése a kiválasztott cellából.
Lényegében két eseményt használnak, valamint több modult.
- Worksheet_SelectionChange amelyet egy cella vagy cellák kiválasztásakor hívunk meg.
- Worksheet_BeforeRightClick amelyet a jobb egérgombbal hívunk meg.
A probléma
A cellára való jobb kattintás egyben kijelölést, kiváltást is jelent SelectionChange. Hagynunk kell, hogy az esemény lefusson, törölve a kiválasztott cellát, mielőtt átadná az irányítást BeforeRightClick esemény, amikor újratelepítjük a törölt cellát. De ez a művelet kiváltja a SelectionChanged ismételt eseményt, amelyet meg kell állítani, hogy ne törölje újra.
Ezt a blnLoading nevű logikai jelzővel fogjuk megtenni.
Az események
Írja be a következőt a munkalap mögötti kódablakban (tehát nem modulban).
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
Ez gondoskodik a két eseményről.
Hivatkozott kód
Adja hozzá a kódhoz a következő, feltöltő és kiürítő tartományokat:
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
Rácsvonalak karbantartása
Helyezzen be egy modult az alkalmazásba. Adja hozzá a következő kódot a rács megjelenésének megőrzéséhez. Ezt a makrórögzítőből másolták, redundanciák és minden.
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
A katasztrófa elleni védelem
Bárki, aki sokat fejleszt Excelben, tudja, hogy az összetett xlsm táblázatok időnként összeomolhatnak, és megrongálhatják a megnyitott dokumentumot. A vártnál több esetben a sérült munkafüzetet nem lehet helyreállítani az Excel helyreállítási rutinjaival. Ha nincsenek biztonsági mentések, az elvégzett munka elveszik. Ez megelőzhető olyan eszközökkel, amelyeket kifejezetten a következők végrehajtására terveztek: Excel javítás.
Szerző Bevezetés:
Felix Hooker adat-helyreállítási szakértő DataNumen, Inc., amely világelső az adat-helyreállítási technológiák területén, beleértve rar javítás és SQL helyreállítási szoftvertermékek. További információért látogasson el www.datanumen.com
