Poniższy artykuł pokazuje, jak zaznaczyć i przesłuchać kalendarz za pomocą mysz. 
*W prawdziwym świecie otworzylibyśmy formularz, aby odczytywać i zapisywać znaczące wpisy w dzienniku w bazie danych. To ćwiczenie po prostu ujawnia mechanikę kliknięcia prawym przyciskiem myszy i wyszukuje szczegóły z samego arkusza.
Zanim zaczniemy, kilka słów wyjaśnienia na temat arkusza kalkulacyjnego, którego działający model można znaleźć w tym miejscu.
Proces
Kliknięcie komórki w siatce podświetli tę komórkę i zmieni jej wartość. Kliknij i przeciągnij, aby podświetlić zakres i zmienić jego wartości. Jeśli komórka jest wypełniona, zostanie wyczyszczona, w przeciwnym razie zostanie wypełniona, w tym przypadku przez „*”.
Natomiast prawy_kliknięcie to żądanie informacji z wybranej komórki.
Zasadniczo używane są dwa zdarzenia wraz z kilkoma modułami.
- Arkusz_WybórZmiana która jest wywoływana po wybraniu komórki lub komórek.
- Arkusz_przed kliknięciem prawym przyciskiem który jest wywoływany przez prawy przycisk myszy.
Problem
Kliknięcie komórki prawym przyciskiem myszy również stanowi zaznaczenie, wyzwalanie WybórZmiana. Będziemy musieli pozwolić, aby to wydarzenie dobiegło końca, usuwając wybraną komórkę, zanim przekaże kontrolę Przed prawym kliknięciemk, kiedy ponownie wypełnimy wyczyszczoną komórkę. Ale to działanie spowoduje wywołanie WybórZmieniony ponownie zdarzenie, które należy powstrzymać przed jego ponownym wyczyszczeniem.
Zrobimy to za pomocą flagi boolowskiej o nazwie blnLoading.
Wydarzenia
Wprowadź następujące informacje w oknie kodu za arkuszem (tj. nie w module).
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
To zajmuje się dwoma zdarzeniami.
Odnośny kod
Dołącz do kodu następujące zakresy wypełniające i wyludniające:
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
Konserwacja linii siatki
Wstaw moduł do aplikacji. Dodaj następujący kod, aby zachować wygląd siatki. Zostało to skopiowane z rejestratora makr, redundancji i całej reszty.
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
Ochrona przed katastrofą
Każdy, kto dużo programuje w Excelu, wie, że złożone arkusze kalkulacyjne XLSM mogą od czasu do czasu ulegać awarii, uszkadzając otwarty dokument. W większej liczbie przypadków niż można by się spodziewać, uszkodzonego skoroszytu nie da się odzyskać za pomocą procedur odzyskiwania danych w Excelu. Brak kopii zapasowych powoduje utratę wykonanej pracy. Można temu zapobiec, korzystając z narzędzi zaprojektowanych do… Poprawka programu Excel.
Wprowadzenie autora:
Felix Hooker jest ekspertem w dziedzinie odzyskiwania danych w DataNumen, Inc., która jest światowym liderem w technologiach odzyskiwania danych, w tym naprawa rar i oprogramowanie do odzyskiwania sql. po więcej informacji odwiedź www.datanumen.com
