Giúp sửa code hiểu nhầm File cần chạy code (1 người xem)

Liên hệ QC

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

minhtuan55

Thành viên bị đình chỉ hoạt động
Thành viên bị đình chỉ hoạt động
Tham gia
23/3/16
Bài viết
705
Được thích
52
Chào cả Nhà GPE !. Em có tạo 1 file excel và dùng đoạn code để không chó xóa bằng phím Delete tại Sheet1

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B9:H108")) Is Nothing Then
    Application.OnKey "{DELETE}", ""
End If
End Sub

Code chạy trên File excel mà em dùng code thì Ok. Nhưng khi em mở 1 file excel khác lên nữa thì Code lại áp dụng cho file đó luôn.Giờ em chỉ muốn Code chỉ chạy trong file mà em dùng code thì Phải làm sao. Xin chân thành cảm ơn
 
Bạn sử dụng code này xem nhé, chú ý đổi tên sheet đúng với sheet bạn đang cần khóa:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("tên sheet")
If Not Intersect(Target, sh.Range("B9:H108")) Is Nothing Then
    Application.OnKey "{DELETE}", ""
End If
End Sub
 
Upvote 0
Bạn đã thử nghiệm code của mình chưa?
Khỏi cần test nhìn đã biết kết quả rồi bác.
Chào cả Nhà GPE !. Em có tạo 1 file excel và dùng đoạn code để không chó xóa bằng phím Delete tại Sheet1

Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B9:H108")) Is Nothing Then
    Application.OnKey "{DELETE}", ""
End If
End Sub

Code chạy trên File excel mà em dùng code thì Ok. Nhưng khi em mở 1 file excel khác lên nữa thì Code lại áp dụng cho file đó luôn.Giờ em chỉ muốn Code chỉ chạy trong file mà em dùng code thì Phải làm sao. Xin chân thành cảm ơn
Bạn sửa code như sau:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B9:H108")) Is Nothing Then
    Application.OnKey "{DEL}", ""
Else
    Application.OnKey "{DEL}"
End If
End Sub
Sau đó thêm code này cho ThisWorkbook, chổ "Sheet1" bạn thay bằng tên sheet của bạn là được,.
Mã:
Private Sub Workbook_Deactivate()
Application.OnKey "{DEL}"
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Sheet1" Then
    If Not Intersect(ActiveCell, Sh.Range("B9:H108")) Is Nothing Then
        Application.OnKey "{DEL}", ""
    Else
        Application.OnKey "{DEL}"
    End If
Else
        Application.OnKey "{DEL}"
End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Muốn phân biệt file nào chạy code nào thì bảo caller nó cho biết parent của nó là ai.

Lưu ý: Quý vị làm việc với chủ thớt này nhiều rồi thì phải chấp nhận rằng công việc sẽ không đơn giản. Chủ thớt này có một hệ thống làm việc rất khác đời, files và applications mở tùm lum lên hết. Máy phục vụ công việc đem ra chơi game bình thường.
 
Upvote 0
Bạn sử dụng code này xem nhé, chú ý đổi tên sheet đúng với sheet bạn đang cần khóa:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim sh As Worksheet
Set sh = ThisWorkbook.Sheets("tên sheet")
If Not Intersect(Target, sh.Range("B9:H108")) Is Nothing Then
    Application.OnKey "{DELETE}", ""
End If
End Sub
Em xin cảm ơn anh. Em đã test code của anh rồi. File mình đang dùng Code thì Ok mà mở File khác lên thì nó cũng hiểu luôn. Anh sửa lại giúp em nhé. ý em làm sao làm miễn sao file khác mở lên thì đừng có hiểu như file có code
 
Upvote 0
Khỏi cần test nhìn đã biết kết quả rồi bác.

Bạn sửa code như sau:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, Range("B9:H108")) Is Nothing Then
    Application.OnKey "{DEL}", ""
Else
    Application.OnKey "{DEL}"
End If
End Sub
Sau đó thêm code này cho ThisWorkbook, chổ "Sheet1" bạn thay bằng tên sheet của bạn là được,.
Mã:
Private Sub Workbook_Deactivate()
Application.OnKey "{DEL}"
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Sheet1" Then
    If Not Intersect(ActiveCell, Sh.Range("B9:H108")) Is Nothing Then
        Application.OnKey "{DEL}", ""
    Else
        Application.OnKey "{DEL}"
    End If
Else
        Application.OnKey "{DEL}"
End If
End Sub

Em cảm ơn nhiều lắm. Code anh em đã Test chính xác 100%. Mà sao em thử nghiệm chỉ cần ở trong wordbook

Mã:
Private Sub Workbook_Deactivate()
Application.OnKey "{DEL}"
End Sub

Em thấy vậy cũng đúng mà anh. có nhất thiết cần đoạn bên dưới không anh. Vì trường hợp em có 20 sheet mổi sheet em chỉ xóa delete 1 vùng khác nhau. Vậy code trong workbook chắc dài lắm anh nhĩ.
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Sheet1" Then
    If Not Intersect(ActiveCell, Sh.Range("B9:H108")) Is Nothing Then
        Application.OnKey "{DEL}", ""
    Else
        Application.OnKey "{DEL}"
    End If
Else
        Application.OnKey "{DEL}"
End If
End Sub
 
Upvote 0
Muốn phân biệt file nào chạy code nào thì bảo caller nó cho biết parent của nó là ai.

Lưu ý: Quý vị làm việc với chủ thớt này nhiều rồi thì phải chấp nhận rằng công việc sẽ không đơn giản. Chủ thớt này có một hệ thống làm việc rất khác đời, files và applications mở tùm lum lên hết. Máy phục vụ công việc đem ra chơi game bình thường.

Mong anh chỉ em chổ ( caller nó cho biết parent của nó là ai. ) giúp em. Em xin chân thành cảm ơn.
 
Upvote 0
Tôi chỉ gợi ý cách tìm caller và parent thôi chứ tôi có bảo nó sẽ giải quyết vấn đề đâu.

Ở tầng application, 2 workbooks đều nằm cùng app. Khi chuyển từ wb này sang wb kia có nghĩa là deactivate cái này và activate cái kia.
Muốn giai quyết vấn đề này thì có thể thử events workbook activate và deactivate
lúc deactivate thì tháo key ra; lúc activate thì gài trở lại.

Lưu ý là tôi chỉ dùng kinh nghiệm để nói chuyện "có thể", không hề bảo đảm là giải pháp thực tế.
Máy mó với key là trình độ cao của ngừoi có nhiều thì giờ vọc code và debug code. Tôi hì khong có nhiều thì giờ thế nên không thích thử viết code.
 
Upvote 0
Em cảm ơn nhiều lắm. Code anh em đã Test chính xác 100%. Mà sao em thử nghiệm chỉ cần ở trong wordbook

Mã:
Private Sub Workbook_Deactivate()
Application.OnKey "{DEL}"
End Sub

Em thấy vậy cũng đúng mà anh. có nhất thiết cần đoạn bên dưới không anh. Vì trường hợp em có 20 sheet mổi sheet em chỉ xóa delete 1 vùng khác nhau. Vậy code trong workbook chắc dài lắm anh nhĩ.
Mã:
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
If Sh.Name = "Sheet1" Then
    If Not Intersect(ActiveCell, Sh.Range("B9:H108")) Is Nothing Then
        Application.OnKey "{DEL}", ""
    Else
        Application.OnKey "{DEL}"
    End If
Else
        Application.OnKey "{DEL}"
End If
End Sub
Tùy bạn thôi, nếu bạn thấy không cần thì đừng sử dụng nó. Giả sử bạn bỏ code đó và bây giờ bạn chọn một ô ở sheet1 và nằm trong vùng B9:H108 (lúc này nhấn delete sẽ không xóa được), bạn qua sheets khác và cũng chọn một ô trong vùng B9:H108 và nhấn thử delete, xong trở lại sheets1 và nhấn Delete thử xem (Chú ý là nháy chuột vào sheets1 thôi, không chọn ô nào cả, lúc này ô đang chọn nằm trong vùng B9:H108), làm ngược lại những bước trên chọn một ô ở sheets khác và nằm trong vùng B9:H108 (nhưng ô đó có chứa dữ liệu), bạn qua sheets1 và cũng chọn một ô trong vùng B9:H108 và nhấn thử delete, xong trở lại sheets khác và nhấn Delete thử xem.
 
Lần chỉnh sửa cuối:
Upvote 0
Không hiểu khóa phím Delete làm chi. Chọn vùng B9:H108, nhấn spacebar rồi ctrl + enter xem.
Mà sao không cậy cái nút Delete cất đi hoặc đổ 502 vô cho nhanh...
 
Upvote 0
Không hiểu khóa phím Delete làm chi. Chọn vùng B9:H108, nhấn spacebar rồi ctrl + enter xem {1}.
Mà sao không cậy cái nút Delete cất đi {2} hoặc đổ 502 vô cho nhanh...

1. Sau khi sử lý xong Delete rồi thì sẽ tính đến các thao tác khác. Khi hoàn thành thì có lẽ khi file này mở lên, sẽ có 50% số phím, và 90% tổ hợp phím bị khoá.
2. Chỉ áp dụng cho 1 file, các files khác không ảnh hưởng. Nhưng khi hoàn thành thì có lẽ sẽ có thêm cái tuỳ chọn "import" khoá phím sang file khác.

Ở đây, chủ thớt chỉ mới khởi đầu ý tưởng của mình, đâu đã biết kết quả cuối cùng là cái gì.
Code do các bạn cung cấp, đâu có mất công viết mà phải dè dặt suy nghĩ cho kỹ. Xài không được thì bỏ, có tốn xu teng nào mà sợ. (có thể tốn vài xu điện, không đáng kể)

xóa ô nào đó đâu chỉ là phím delete?

Đôi khi ngừoi ta chỉ muốn tránh trường hợp lỡ tay, chứ cố ý thì chấp nhận.

Tuy nhiên, câu trên tôi chỉ giải thích cho các thành viên muốn học hỏi.
Nếu các bạn theo dõi những bài của chủ thớt thì đã biết chủ thớt có những nhu cầu/yêu cầu kỳ quặc lắm. Và luôn luôn nằng nặc muốn giải theo ý tưởng mình chứ khong bao giờ chấp nhận phương án thứ hai.
 
Upvote 0
Web KT

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

Back
Top Bottom