Cấm không cho copy và paste (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

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:
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:

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

Back
Top Bottom