Cấm không cho copy và paste

Liên hệ QC
Không nhất thiết phải mở file mới đâu, bạn chỉ cần chọn ô trong vùng "cấm địa". Sau đó copy dữ liệu từ 1 sheet khác trong file này, sau đó quay lại sheet lúc nãy (nhưng đừng chọn lại ô nhé, cứ để nguyên ô đã chọn lúc nãy và dán) thì vẫn dán như thường. Sở dĩ có hiện tượng này là vì code trên có tên là Workbook_SheetSelectionChange, có nghĩa là nó chỉ được kích hoạt khi có sự thay đổi ô/vùng chọn.
Để khắc phục hiện tượng này, bạn thêm 1 code sau cho đối tượng ThisWorkbook nhằm mục đích là mỗi lần chọn sheet có chặn thao tác dán thì sẽ chọn 1 ô nằm ngoài vùng "cấm địa" (ô A1 có thể thay bởi ô bất kỳ, miễn là ở ngoài vùng chặn thao tác dán).
PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select
End Sub
Vởi code này, mỗi lần muốn dán vào vùng "cấm địa" thì bắt buộc phải chọn lại ô. Và như vậy đồng nghĩa với việc kích hoạt Sub Workbook_SheetSelectionChange.

Nếu cần thiết (trường hợp copy từ file khác, dán sang file này) thì bạn thêm 1 code nữa cho đối tượng ThisWorkbook
PHP:
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
If InStr(".Sheet1.Sheet2.", "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select
End Sub
Thêm nữa, trong cả 3 sub có đề cập ở đây đều có sử dụng đến 1 danh sách các sheet muốn chặn thao tác dán. Do đó, ta có thể khai báo 1 hằng chung ShChan dạng String để lưu danh sách này. Mỗi lần muốn thay đổi danh sách, ta chỉ cần thay đổi 1 lần (thay vì phải thay đổi 3 vị trí trong 3 sub).
Cuối cùng, toàn bộ code cho đối tượng ThisWorkbook sẽ là:
PHP:
Const ShChan As String = ".Sheet1.Sheet2."
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select
End Sub 
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If InStr(ShChan, "." & Sh.Name & ".") = 0 Then Exit Sub
If Not Intersect(Target, Union(Sh.[C6:H55], Sh.[J6:N6])) Is Nothing Then Application.CutCopyMode = False
End Sub
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
If InStr(ShChan, "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select
End Sub

Hình như không khả thi lắm đó anh PHÚC.
 

File đính kèm

Các Bạn xem giúp mình có cách nào để chặn ko cho phép copy dữ liệu, để pase sang bất kỳ file 1 nào khác ko các Bạn. Tức là chỉ xem được thôi chứ ko copy được? Mong các Bạn nghĩ cách giúp đỡ. Cảm ơn các Bạn nhiều!
 
Hihi, hình như bác Bill mình khuyết chổ này chăng.
Bạn mô tả chi tiết việc bạn làm như thế nào để có giá trị tại ô E7 xem sao nhé. Có biết bệnh thì mới biết cách trị bệnh được...//**///**/
Liệu có "thủ thuật" gì đây không ta? Chẳng hạn như chuyển sang Design Mode hoặc sửa tên Sub, hoặc Disable Macro.

_____________________________________________________________________
Các Bạn xem giúp mình có cách nào để chặn ko cho phép copy dữ liệu, để pase sang bất kỳ file 1 nào khác ko các Bạn. Tức là chỉ xem được thôi chứ ko copy được? Mong các Bạn nghĩ cách giúp đỡ. Cảm ơn các Bạn nhiều!
Bạn thử nghiên cứu chức năng Protect Sheet xem sao. Chẳng hạn, bạn chọn Tools\Protection\Protect Sheet và bỏ luôn 2 tùy chọn trên cùng (Select locked cells và Select unlocked cells) --> Nhập Password --> OK. Sau đó thì người khác không chọn được ô thì mần răng mà copy, trừ trường hợp copy cả sheet (sử dụng Move or Copy) hoặc sử dụng VBA để lấy giá trị các ô trong sheet.
 
Lần chỉnh sửa cuối:
Bạn mô tả chi tiết việc bạn làm như thế nào để có giá trị tại ô E7 xem sao nhé. Có biết bệnh thì mới biết cách trị bệnh được...

100% là copy từ phần mềm khác không phải excel, hoặc từ excel chạy lần 2 (Khác Application)
Ngoài ra còn 1 cách là dùng 1 câu lệnh VBA gán giá trị cho ô đó (chạy trong cửa sổ Immediate, khỏi cần viết sub siếc gì cả)
Bạn thử nghiên cứu chức năng Protect Sheet xem sao. Chẳng hạn, bạn chọn Tools\Protection\Protect Sheet và bỏ luôn 2 tùy chọn trên cùng (Select locked cells và Select unlocked cells) --> Nhập Password --> OK. Sau đó thì người khác không chọn được ô thì mần răng mà copy, trừ trường hợp copy cả sheet (sử dụng Move or Copy) hoặc sử dụng VBA để lấy giá trị các ô trong sheet.
Không cho chọn ô, thì làm sao chọn 1 trong 4 số 6, 7, ,8 ,9 cho ô đó? Ô đó dùng để nhập liêu mà?

Theo tôi thì hễ có người cố tình phá kiểu có validation không xài, copy nơi khác đến, thì không lường trước sẽ bị phá kiểu nào đâu.
Trừ phi dùng sự kiện worksheet_Change, hễ ô đó mà có giá trị không hợp lệ là tắt excel, không save bất kỳ file nào đang mở, cho bỏ cái tật phá.

Các Bạn xem giúp mình có cách nào để chặn ko cho phép copy dữ liệu, để pase sang bất kỳ file 1 nào khác ko các Bạn. Tức là chỉ xem được thôi chứ ko copy được? Mong các Bạn nghĩ cách giúp đỡ. Cảm ơn các Bạn nhiều!
Làm cái này cũng bị phá nếu như người ta cố tình thôi.
 
Lần chỉnh sửa cuối:
Các Bạn xem giúp mình có cách nào để chặn ko cho phép copy dữ liệu, để pase sang bất kỳ file 1 nào khác ko các Bạn. Tức là chỉ xem được thôi chứ ko copy được? Mong các Bạn nghĩ cách giúp đỡ. Cảm ơn các Bạn nhiều!
Chỉ cần ghi nhớ 1 điều đơn giản rằng: 1 thứ gì đó, trừ phi bạn nuốt vào bụng thì thôi, còn nếu để cho ai đó "nhìn", "sờ mớ" được thì họ hoàn toàn có khả năng "lấy" như chính bạn vậy
Môt file được xem là "bảo mật" tốt nhất khi nó không có bất cứ "rào cản" nào... Thoải mái đi, đừng đặt nặng vấn đề bảo mật trong Excel
Thử nghĩ xem bao nhiêu phần mềm danh tiếng được viết bởi các nhà lập trình hàng đầu thế giới, vậy mà vẫn bị bọn hacker qua mặt
Xem ra làm như thằng google vậy mà hay: Mọi thứ đều miễn phí, ấy thế mà google vẫn giàu có như thường
Ẹc... Ẹc...
 
Theo em đây là 1 vấn đề không thể khắc phục được, mà mọi người có sữ dụng excell (validation) như trường hợp trên, em cũng có liên quan đến vấn đề này, ví dụ em có 1 file điểm, đưa cho giáo viên nhập vào, mà ông Gv này (làm biếng) chơi copy và dán qua, như vậy là sai với qui định bảng điểm của mình. Mình qui định nhập G,K,TB.Y,Kém. Ông Gv này copy dán qua là Giỏi,Khá, Trung Bình, Yếu, Kém. Thế là phần thống kê không thống kê được. Mời xem file. Tại ô d7
 

File đính kèm

Theo em đây là 1 vấn đề không thể khắc phục được, mà mọi người có sữ dụng excell (validation) như trường hợp trên, em cũng có liên quan đến vấn đề này, ví dụ em có 1 file điểm, đưa cho giáo viên nhập vào, mà ông Gv này (làm biếng) chơi copy và dán qua, như vậy là sai với qui định bảng điểm của mình. Mình qui định nhập G,K,TB.Y,Kém. Ông Gv này copy dán qua là Giỏi,Khá, Trung Bình, Yếu, Kém. Thế là phần thống kê không thống kê được. Mời xem file. Tại ô d7
Nhưng mà cuối cùng thì ai chịu trách nhiệm với những con điểm đó? Bạn hay là thầy giáo kia? Cứ báo với BGH, chắc chắn họ sẽ có cách yêu cầu thầy giáo kia nhập lại. Cứ cho nhập vài lần là nhớ liền thôi mà.
 
Nhưng mà cuối cùng thì ai chịu trách nhiệm với những con điểm đó? Bạn hay là thầy giáo kia? Cứ báo với BGH, chắc chắn họ sẽ có cách yêu cầu thầy giáo kia nhập lại. Cứ cho nhập vài lần là nhớ liền thôi mà.
Hihi. Hẳn nhiên là em rồi. Tuy nhiên mục đích cuối cùng, mình làm sao cho giáo viên của mình sử dụng được bảng điểm của mình mà không bị chục trặc. Tóm lại vẫn chưa giải quyết được vấn đề. Thân
 
Hihi. Hẳn nhiên là em rồi. Tuy nhiên mục đích cuối cùng, mình làm sao cho giáo viên của mình sử dụng được bảng điểm của mình mà không bị chục trặc. Tóm lại vẫn chưa giải quyết được vấn đề. Thân
Nghe như vậy khiến tôi nhớ đến câu chuyện của thằng con tôi khi nó 1 tuổi. Nó rất thích đồ chơi (đặc biệt là xe) nhưng mua cho nó thì chỉ trong vòng sáng đến chiều đã hư. Bực mình, tôi đến hỏi cha chủ tiệm xem có đồ nào thật bền không. Đương nhiên đồ tốt cũng có (đắt tiền), nhưng tôi mua cho nó chơi thì cũng chỉ "bền" được thêm vài ngày nữa rồi cũng đâu vào đấy, lại hư tiếp.
Tôi lại ghế tiệm phàn nàn với cha chủ tiệm. Cha này bổng nghĩ ra gì đó và hỏi lại:
- Thế con ông mấy tuổi?
- 1 tuổi! Sao chứ?
- Ha... ha... Đồ chơi muốn lâu hư thì phải dành cho trẻ nào biết chơi chứ. Con ông mới 1 tuổi, nó chỉ biết phá là điều đương nhiên. Thôi, đợi vài năm nữa đi cha nội

Uh nhỉ? Sao mình lại quên mất thằng con mình nó chưa biết gì thì làm sao nó xài đồ lâu hư được!
-------------------------------
Vậy đấy! Công cụ là dành cho người biết xài. Giáo viên của bạn không biết thì bạn phải huấn luyện. Còn không thì... NGHỈ XÀI CHO KHỎE ---> Mang cái điện thoại đi đóng đinh thì bố ai chịu nỗi
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Tôi có 1 file excel số liệu gồm 3 trang của 1 người bạn gửi cho, nhưng không hiểu sao không thể nào in được trang thứ 3 trong file này? Có phải do người lập mặc định không? Nhờ các anh chị chỉ giúp. Xin cảm ơn.
 
Bạn gửi file lên nhé.
 
Tôi có 1 file excel số liệu gồm 3 trang của 1 người bạn gửi cho, nhưng không hiểu sao không thể nào in được trang thứ 3 trong file này? Có phải do người lập mặc định không? Nhờ các anh chị chỉ giúp. Xin cảm ơn.
Không biết giờ này trả lời còn có ý nghĩa với bạn nữa không. Thôi kệ, biết đâu lại có ích cho người khác!
Bạn thử chọn File\Page setup, chọn tab Sheet và nhìn tại mục Print area xem có gì bất thường không. Bạn xóa nội dung chỗ này hoặc đưa con trỏ vào đó, quét chọn toàn bộ vùng dữ liệu cần in, nhấn OK rồi thử in lại xem có được không.
 
Dear các anh chị,

Em đang làm một bảng tính cho phép người nhập chỉ có thể nhập dữ liệu ô Visit Date trước ngày hiện tại 1 ngày nhưng cũng như trên nếu họ copy và paste vào ô Data/Validation vẫn được. Nhờ mọi người giúp đỡ em có 1 cách tối ưu. Xin cảm ơn rất nhiều.
 

File đính kèm

Không nhất thiết phải mở file mới đâu, bạn chỉ cần chọn ô trong vùng "cấm địa". Sau đó copy dữ liệu từ 1 sheet khác trong file này, sau đó quay lại sheet lúc nãy (nhưng đừng chọn lại ô nhé, cứ để nguyên ô đã chọn lúc nãy và dán) thì vẫn dán như thường. Sở dĩ có hiện tượng này là vì code trên có tên là Workbook_SheetSelectionChange, có nghĩa là nó chỉ được kích hoạt khi có sự thay đổi ô/vùng chọn.
Để khắc phục hiện tượng này, bạn thêm 1 code sau cho đối tượng ThisWorkbook nhằm mục đích là mỗi lần chọn sheet có chặn thao tác dán thì sẽ chọn 1 ô nằm ngoài vùng "cấm địa" (ô A1 có thể thay bởi ô bất kỳ, miễn là ở ngoài vùng chặn thao tác dán).
PHP:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select
End Sub
Vởi code này, mỗi lần muốn dán vào vùng "cấm địa" thì bắt buộc phải chọn lại ô. Và như vậy đồng nghĩa với việc kích hoạt Sub Workbook_SheetSelectionChange.

Nếu cần thiết (trường hợp copy từ file khác, dán sang file này) thì bạn thêm 1 code nữa cho đối tượng ThisWorkbook
PHP:
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    If InStr(".Sheet1.Sheet2.", "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select
End Sub
Thêm nữa, trong cả 3 sub có đề cập ở đây đều có sử dụng đến 1 danh sách các sheet muốn chặn thao tác dán. Do đó, ta có thể khai báo 1 hằng chung ShChan dạng String để lưu danh sách này. Mỗi lần muốn thay đổi danh sách, ta chỉ cần thay đổi 1 lần (thay vì phải thay đổi 3 vị trí trong 3 sub).
Cuối cùng, toàn bộ code cho đối tượng ThisWorkbook sẽ là:
PHP:
Const ShChan As String = ".Sheet1.Sheet2."
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
    If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If InStr(ShChan, "." & Sh.Name & ".") = 0 Then Exit Sub
    If Not Intersect(Target, Union(Sh.[C6:H55], Sh.[J6:N6])) Is Nothing Then Application.CutCopyMode = False
End Sub
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
    If InStr(ShChan, "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select
End Sub
Anh có thể cho em Code để áp dụng "Vùng Cấm" riêng cho từng sheet được không ạ, vì nếu code vào "ThisWorkBook" thì khi qua "Sheet 2" hoặc "Sheet 3" em muốn thay đổi "Vùng Cấm" (mỗi sheet có 1 vùng cấm khác nhau) thì không được.
 
Anh có thể cho em Code để áp dụng "Vùng Cấm" riêng cho từng sheet được không ạ, vì nếu code vào "ThisWorkBook" thì khi qua "Sheet 2" hoặc "Sheet 3" em muốn thay đổi "Vùng Cấm" (mỗi sheet có 1 vùng cấm khác nhau) thì không được.
Được chứ! cứ mỗi sheet bạn làm cho vùng cấm riêng cho nó là được thôi!
Bài đã được tự động gộp:

Nhân nói đến chuyện tắt - mở Cut-Copy-Paste mình có cái code này... nó làm tê liệt hoàn toàn việc Cut-Copy-Paste cho Cell /Range.
nhưng cái này nếu vào edit Cell rùi thì Cut-Copy-Paste vẫn bình thường nha!
Chú ý cái code này nguy hiểm khi sử dụng nó, nếu không thì các workbook khác củng bị vô tình tê liệt luôn đó nha! hahahaha....
Mã:
Sub DisableOrEnable_CutCopyPaste(ByVal blEnable As Boolean)
Dim oCtrl As Office.CommandBarControl
    If blEnable Then
        Application.CellDragAndDrop = True
      'for KEY
        Application.OnKey "^{c}" 'Copy
        Application.OnKey "^{x}" 'Cut
        Application.OnKey "^{v}" 'Paste
      'for MENU
        For Each oCtrl In Application.CommandBars.FindControls(ID:=19) 'Copy
            oCtrl.Enabled = True
        Next oCtrl
        For Each oCtrl In Application.CommandBars.FindControls(ID:=21) 'Cut
            oCtrl.Enabled = True
        Next oCtrl
    Else
        Application.CellDragAndDrop = False
      'for KEY
        Application.OnKey "^{c}", "" 'Copy
        Application.OnKey "^{v}", "" 'Paste
        Application.OnKey "^{x}", "" 'Cut
      'for MENU
        For Each oCtrl In Application.CommandBars.FindControls(ID:=19) 'Copy
            oCtrl.Enabled = False
        Next oCtrl
        For Each oCtrl In Application.CommandBars.FindControls(ID:=21) 'Cut
            oCtrl.Enabled = False
        Next oCtrl
    End If
End Sub
 
Lần chỉnh sửa cuối:
Web KT

Bài viết mới nhất

Back
Top Bottom