Aşağıdaki makale, bir takvimi nasıl işaretleyeceğinizi ve sorgulayacağınızı gösterir. fare. 
*Gerçek dünyada, bir veritabanına anlamlı günlük girişleri okumak ve yazmak için bir form açardık. Bu alıştırma, sağ_tıklamanın mekaniğini basitçe ortaya koyar ve ayrıntıları çalışma sayfasının kendisinden bulur.
Başlamadan önce, çalışma modelinin bulunabileceği elektronik tablo hakkında birkaç kelimelik açıklama okuyun.
Süreç
Izgara içindeki bir hücreye tıklamak, o hücreyi vurgulayacak ve değerini değiştirecektir. Tıkla ve sürükle, bir aralığı vurgulayacak ve değerlerini değiştirecektir. Bir hücre doluysa temizlenir, aksi takdirde bu durumda bir "*" ile doldurulur.
Bir right_click, aksine, seçilen hücreden bilgi talebidir.
Birkaç modülle birlikte kullanılan esasen iki olay vardır.
- Worksheet_SelectionChange bir hücre veya hücreler seçildiğinde çağrılır.
- Worksheet_BeforeRightClick sağ fare tuşu ile çağrılır.
Sorun
Bir hücreye sağ_tıklamak da bir seçim oluşturur, tetiklenir SeçimDeğiştirme. Kontrolü hücreye teslim etmeden önce seçilen hücreyi temizleyerek bu olayın kendi yolunda gitmesine izin vermemiz gerekecek. ÖnceRightClick olayı, temizlenen hücreyi yeniden dolduracağımız zaman. Ancak bu eylem, SeçimDeğiştirildi bir kez daha temizlenmesinin durdurulması gereken olay.
Bunu blnLoading adlı bir boole bayrağıyla yapacağız.
Olaylar
Çalışma sayfasının arkasındaki kod penceresine aşağıdakini girin (yani bir modülde değil).
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
Bu, iki Olayla ilgilenir.
Başvurulan Kod
Aşağıdaki doldurma ve doldurma aralıklarını koda ekleyin:
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
Kılavuz Çizgilerin Bakımı
Uygulamaya bir modül ekleyin. Kılavuzun görünümünü korumak için aşağıdaki kodu ekleyin. Bu, makro kaydediciden, fazlalıklardan ve hepsinden kopyalandı.
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
Afete karşı koruma
Excel ile çok fazla çalışma yapan herkes, karmaşık xlsm elektronik tablolarının zaman zaman çökerek açılan belgeyi bozabileceğini bilir. Beklenenden daha fazla durumda, hasar görmüş çalışma kitabı Excel'in kurtarma rutinleri tarafından kurtarılamaz. Yedekleme yoksa, yapılan çalışma kaybolur. Bu, özel olarak tasarlanmış araçlarla önlenebilir. Excel düzeltmesi.
Yazar Tanıtımı:
Felix Hooker, veri kurtarma uzmanıdır. DataNumendahil olmak üzere veri kurtarma teknolojilerinde dünya lideri olan , Inc. rar onarımı ve sql kurtarma yazılımı ürünleri. Daha fazla bilgi için ziyaret edin www.datanumen.com
