Cấm không cho copy và paste

Liên hệ QC

minhhangg

Thành viên hoạt động
Tham gia
4/5/11
Bài viết
197
Được thích
61
Chào các anh chị, em có 1 file Excell. Em đã dùng Data/Validation. Tuy nhiên vẫn copy và paste vào ô Data/Validation vẫn được. Nhờ các anh chị giúp dùm em, chân thành cảm ơn anh chị nhiều.
 

File đính kèm

Bài này có giải quyết được không hé các anh chị, thành viên GPE. Cảm ơn
 
Bài này có giải quyết được không hé các anh chị, thành viên GPE. Cảm ơn

Ô có List nó không cho giá trị khác nhập vào là do bạn lựa chọn trong List, tuy nhiên bạn copy cell khác vào thì được, nhưng List sẽ bị mất! Không cho copy chỉ có nước khóa sheet, nhưng cái này lại không cho sử dụng giá trị thay đổi trong ô.
 
Tắt chức năng paste trong sheet này luôn được hông?

Bác ơi, nên chọn vùng hạn chế chứ! Như vầy đi:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Target.Row > 16 Or Target.Column > 6 Then Exit Sub
  Application.CutCopyMode = False
End Sub
 
Bác ơi, nên chọn vùng hạn chế chứ! Như vầy đi:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row > 16 Or Target.Column > 6 Then Exit Sub
Application.CutCopyMode = False
End Sub
Cảm ơn anh. Em thì không rành VBA. Tuy nhiên là không cho copy 1 vùng c6:h55 và vùng và j6:N6 thì có sửa code lại không anh và đặc biệt là có nhiều sheet giống như vậy, cảm ơn anh
 
Cảm ơn anh. Em thì không rành VBA. Tuy nhiên là không cho copy 1 vùng c6:h55 và vùng và j6:N6 thì có sửa code lại không anh và đặc biệt là có nhiều sheet giống như vậy, cảm ơn anh
Xem thử file này đi.
Nếu có nhiều sheet cần tác dụng tương tự thì chép code này vào từng sheet.
HTML:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Union([C6:H55], [J6:N6])) Is Nothing Then
Application.CutCopyMode = False
Else
Exit Sub
End If
End Sub
 

File đính kèm

Xem thử file này đi.
Nếu có nhiều sheet cần tác dụng tương tự thì chép code này vào từng sheet.
HTML:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Union([C6:H55], [J6:N6])) Is Nothing Then
Application.CutCopyMode = False
Else
Exit Sub
End If
End Sub
Chỉ cần như vầy thôi anh ơi: Đưa code này vào đối tượng ThisWorkbook
PHP:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Intersect(Target, Union(Sh.[C6:H55], Sh.[J6:N6])) Is Nothing Then Exit Sub
    Application.CutCopyMode = False
End Sub
Thêm nữa, trong code của anh thì 2 dòng này chẳng để làm gì cả:
PHP:
Else
Exit sub
 
Xem thử file này đi.
Nếu có nhiều sheet cần tác dụng tương tự thì chép code này vào từng sheet.
HTML:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Union([C6:H55], [J6:N6])) Is Nothing Then
Application.CutCopyMode = False
Else
Exit Sub
End If
End Sub

Bác Ba Tê hay nhỉ!!! Nhưng cho em "chotter" một chút nữa nhé!

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  If Not Intersect(Target, Union([C6:H55], [J6:N6])) Is Nothing Then Application.CutCopyMode = False
End Sub
Đâu cần chi phải thêm Exit Sub Bác!

Chỉ cần như vầy thôi anh ơi: Đưa code này vào đối tượng ThisWorkbook
PHP:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If Intersect(Target, Union(Sh.[C6:H55], Sh.[J6:N6])) Is Nothing Then Exit Sub
    Application.CutCopyMode = False
End Sub

Tôi nghĩ hạn chế sheet nào thì làm sheet đó, chứ đưa vào ThisWorkbook nó triệt tiêu hết tất cả các sheet thì ẹc... ẹc...
 
Lần chỉnh sửa cuối:
Tôi nghĩ hạn chế sheet nào thì làm sheet đó, chứ đưa vào ThisWorkbook nó triệt tiêu hết tất cả các sheet thì ẹc... ẹc...
Cái này thì xử lý dễ ẹc chứ khó gì đâu. Chẳng hạn bạn chỉ muốn áp dụng code cho các sheet: Sheet1, Sheet3, Sheet10 thì code sẽ như vầy nè:
PHP:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If InStr(".Sheet1.Sheet3.Sheet10.", "." & 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
Muốn thêm danh sách Sheet áp dụng code thì cứ thêm vào trong hàm InStr là xong.
 
Cái này thì xử lý dễ ẹc chứ khó gì đâu. Chẳng hạn bạn chỉ muốn áp dụng code cho các sheet: Sheet1, Sheet3, Sheet10 thì code sẽ như vầy nè:
PHP:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
    If InStr(".Sheet1.Sheet3.Sheet10.", "." & 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
Muốn thêm danh sách Sheet áp dụng code thì cứ thêm vào trong hàm InStr là xong.

OK "concogia" ủa quên "con gà đen"! Đúng là vậy đó Anh, tôi làm gì cũng muốn một cách tổng quát. Thanks!
 
Vậy có cách nào để ko copy được dữ liệu trong 1 sheet ko các Bác? Tức là khi kích chuột phải thì nó không hiện copy lên hoặc thực hiện thao tác Ctrl +C thì nó ko có tác dụng ?
 
Lần chỉnh sửa cuối:
Trước hết cảm ơn mấy và sorry nhiều lắm, Mấy anh làm sao chứ, em làm rồi không được. ví dụ mở 1 file excell mới bắt đầu copy và paste vào vẫn bình thường. Mấy anh thí nghiệm thử dùm em. Cảm ơn
 
Vậy có cách nào để ko copy được dữ liệu trong 1 sheet ko các Bác? Tức là khi kích chuột phải thì nó không hiện copy lên hoặc thực hiện thao tác Ctrl +C thì nó ko có tác dụng ?

Cũng dễ thôi. Đại khái là cho copy, nhưng qua sheet khác thì chặn lại:
PHP:
Private Sub Worksheet_Deactivate()
  Application.CutCopyMode = False
End Sub

Trước hết cảm ơn mấy và sorry nhiều lắm, Mấy anh làm sao chứ, em làm rồi không được. ví dụ mở 1 file excell mới bắt đầu copy và paste vào vẫn bình thường. Mấy anh thí nghiệm thử dùm em. Cảm ơn
Vậy thì em gửi File lên đi và nói rõ sheet nào cần không cho copy vào vùng "cấm địa", Bác Ba Tê, Anh NghiaPhuc sẳn sàng giúp đỡ em liền!!!
 
Lần chỉnh sửa cuối:
Thì cũng cái file em gữi ở trên đó anh. Anh mở file của em và mở thêm 1 file mới nữa và dùng lệnh copy /paste được bình thường đó anh.
 
Thì cũng cái file em gữi ở trên đó anh. Anh mở file của em và mở thêm 1 file mới nữa và dùng lệnh copy /paste được bình thường đó anh.

Sau khi em tải về, mở ra, rồi bấm Alt+F11, click vào ThisWorkbook sẽ thấy code của NghiaPhuc trong đó. Ở đấy, anh chỉ chọn 2 sheet, nghiền ngẫm thử xem.
 

File đính kèm

Em đồng ý với anh là không copy trên file này thì không được, nhưng mở 1 file mới anh copy và paste vào là bình thường.
 
Cũng dễ thôi. Đại khái là cho copy, nhưng qua sheet khác thì chặn lại:
PHP:
Private Sub Worksheet_Deactivate()
  Application.CutCopyMode = False
End Sub


Mình thấy code này chỉ ko cho copy và pase trong cùng 1 file thôi. Chứ mình mà mở file mới thì vẫn pase được. Có cách nào để mở file mới hoặc file khác thì vẫn ko copy được ko bạn?
 
Em đồng ý với anh là không copy trên file này thì không được, nhưng mở 1 file mới anh copy và paste vào là bình thường.
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
 

File đính kèm

Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom