minhhangg
Thành viên hoạt động



- Tham gia
- 4/5/11
- Bài viết
- 197
- Được thích
- 61
Tắt chức năng paste trong sheet này luôn được hông?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
Bạn hướng dẫn thêm cho mình tắt chức năng paste, Cảm ơn BATETắt chức năng paste trong sheet này luôn được hông?
Tắt chức năng paste trong sheet này luôn được hông?
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 anhBá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
Xem thử file này đi.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
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 ThisWorkbookXem 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
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
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
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
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
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è: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...
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
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è:
Muốn thêm danh sách Sheet áp dụng code thì cứ thêm vào trong hàm InStr là xong.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
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 ?
Private Sub Worksheet_Deactivate()
Application.CutCopyMode = False
End Sub
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!!!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
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.
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?
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.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.
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select
End Sub
Private Sub Workbook_WindowActivate(ByVal Wn As Window)
If InStr(".Sheet1.Sheet2.", "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select
End Sub
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
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).
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.PHP:Private Sub Workbook_SheetActivate(ByVal Sh As Object) If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select End Sub
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
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).PHP:Private Sub Workbook_WindowActivate(ByVal Wn As Window) If InStr(".Sheet1.Sheet2.", "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select End 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
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.Hình như không khả thi lắm đó anh PHÚC.
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...Hihi, hình như bác Bill mình khuyết chổ này chăng.
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.
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.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 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...
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à?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àm cái này cũng bị phá nếu như người ta cố tình thô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ậyCá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!
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à.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
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ânNhư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à.
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.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
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!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.
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.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).
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.PHP:Private Sub Workbook_SheetActivate(ByVal Sh As Object) If InStr(ShChan, "." & Sh.Name & ".") > 0 Then Sh.[A1].Select End Sub
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
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).PHP:Private Sub Workbook_WindowActivate(ByVal Wn As Window) If InStr(".Sheet1.Sheet2.", "." & ActiveSheet.Name & ".") > 0 Then ActiveSheet.[A1].Select End 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
Được chứ! cứ mỗi sheet bạn làm cho vùng cấm riêng cho nó là được thôi!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.
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