Czasami się zdarza, że w projekcie chcemy użytkownikom ograniczyć możliwość wpisywania konkretnych danych w komórkach arkusza. Może to być ograniczenie polegające np. na wyborze z listy rozwijanej dostępnych wpisów.
Walidacja Danych
W takich przypadkach do akcji wkracza mechanizm sprawdzania poprawności (w wersji Excela 2007 zmieniono nazwę na poprawność danych, ja preferuję walidację danych z ang. Validation).
Ma on jednak sporo niedoskonałości, które powielane są w następnych wersjach Excela. Komórki z walidacją można w bardzo prosty sposób nadpisać poprzez skopiowanie danych lub przeciągnięcie komórek. W takiej sytuacji nasze wysiłki związane z wprowadzaniem walidacji dla poszczególnych komórek wezmą w łeb.
Aby uniknąć nadpisywania danych w komórkach z walidacją często blokuje się kopiowanie i wklejanie danych w obszarze całego pliku, a także przeciąganie komórek. Jest to rozwiązanie, które w dużej mierze zdaje egzamin.
Kod Makra
Poniżej wklejam kod, który znalazłem w sieci, a z którego często korzystam.
W momencie otwarcia lub aktywacji pliku kopiowanie, wklejanie i przeciąganie jest zablokowane, przy próbie zamknięcia lub deaktywacji pliku jest włączone.
Poniższe makra są trochę uproszczone (domyślnie zaprojektowane dla Excela 2003) jednak myślę, że zdecydowanie wystarczą na początek zabawy z blokowaniem kopiowania i wklejania w pliku.
Moduł zwykły:
Sub ToggleCutCopyAndPaste(Allow As Boolean)
'Activate/deactivate cut, copy, paste and pastespecial menu items
Call EnableMenuItem(21, Allow) ' cut
Call EnableMenuItem(19, Allow) ' copy
Call EnableMenuItem(22, Allow) ' paste
Call EnableMenuItem(755, Allow) ' pastespecial
'Activate/deactivate drag and drop ability
Application.CellDragAndDrop = Allow
'Activate/deactivate cut, copy, paste and pastespecial shortcut keys
With Application
Select Case Allow
Case Is = False
.OnKey "^c", "CutCopyPasteDisabled"
.OnKey "^v", "CutCopyPasteDisabled"
.OnKey "^x", "CutCopyPasteDisabled"
.OnKey "^r", "CutCopyPasteDisabled"
.OnKey "+{DEL}", "CutCopyPasteDisabled"
.OnKey "^{INSERT}", "CutCopyPasteDisabled"
Case Is = True
.OnKey "^c"
.OnKey "^v"
.OnKey "^x"
.OnKey "^r"
.OnKey "+{DEL}"
.OnKey "^{INSERT}"
End Select
End With
End Sub
Sub EnableMenuItem(ctlId As Integer, Enabled As Boolean)
'Activate/Deactivate specific menu item
Dim cBar As CommandBar
Dim cBarCtrl As CommandBarControl
For Each cBar In Application.CommandBars
If cBar.Name <> "Clipboard" Then
Set cBarCtrl = cBar.FindControl(ID:=ctlId, recursive:=True)
If Not cBarCtrl Is Nothing Then cBarCtrl.Enabled = Enabled
End If
Next
End Sub
Sub CutCopyPasteDisabled()
'Inform user that the functions have been disabled
MsgBox "Kopiowanie i wklejanie zostało wyłączone w tym pliku.", vbCritical, "UWAGA"
End Sub
Moduł pliku (ThisWorkbook):
Private Sub Workbook_Open()
ToggleCutCopyAndPaste False
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ToggleCutCopyAndPaste True
End Sub
Private Sub Workbook_Activate()
ToggleCutCopyAndPaste False
End Sub
Private Sub Workbook_Deactivate()
ToggleCutCopyAndPaste True
End Sub