Tạo "vùng cấm địa" trong bảng tính (1 người xem)

Liên hệ QC

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

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,469
Nghề nghiệp
Công chức
Nếu bạn muốn bảo vệ một vùng nào đó trong bảng tính (chỉ được xem - không được nhập, sửa ...) thì ngoài các phương pháp Protect, Validation... bạn có thể tạo "vùng cấm địa" trong bảng tính bằng VBA theo cách sau:
Ví dụ: bạn muốn vùng C5:H20 của Sheet1 là bất khả xâm phạm thì bạn Pate Code sau vào Module của Sheet1 (bạn sửa lại vùng [c5:h20] hoặc chọn nhiều vùng theo theo ý của bạn).
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [c5:h20]) Is Nothing Then [a1].Select
End Sub
Xin nói thêm: Giải pháp nào cũng có 2 mặt, do đó đây cũng chỉ là thêm một cách cho sự lựa chọn của bạn.
 

File đính kèm

Nếu bạn muốn bảo vệ một vùng nào đó trong bảng tính (chỉ được xem - không được nhập, sửa ...) thì ngoài các phương pháp Protect, Validation... bạn có thể tạo "vùng cấm địa" trong bảng tính bằng VBA theo cách sau:
Ví dụ: bạn muốn vùng C5:H20 của Sheet1 là bất khả xâm phạm thì bạn Pate Code sau vào Module của Sheet1 (bạn sửa lại vùng [c5:h20] hoặc chọn nhiều vùng theo theo ý của bạn).
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [c5:h20]) Is Nothing Then [a1].Select
End Sub
Xin nói thêm: Giải pháp nào cũng có 2 mặt, do đó đây cũng chỉ là thêm một cách cho sự lựa chọn của bạn.
Muốn "hủy cấm vận" cũng khá dể dàng... Em làm như sau:
- Quét chọn A1:G1
- Click chuột phải, chọn Insert\Entire Column
- Vậy là "vùng cấm" ấy "trôi" ra khỏi cột H, và ta có thể "sờ mó" thoải mái
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
Em có thêm 1 cải tiến cho code của anh:
- Em tạo 1 name cho vùng dữ liệu mà anh muốn "cấm" ---> Ví dụ em đặt nó tên là CAM
- Em sẽ sửa code lại thành:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Range("Cam")
    If Not Intersect(Target, .Cells) Is Nothing Then
      .Offset(.Rows.Count, .Columns.Count)(1, 1).Select
    End If
  End With
End Sub
Giờ thì hãy "quên đi" vụ Insert Column hay Row đi nhé
 
Upvote 0
Muốn "hủy cấm vận" cũng khá dể dàng... Em làm như sau:
- Quét chọn A1:G1
- Click chuột phải, chọn Insert\Entire Column
- Vậy là "vùng cấm" ấy "trôi" ra khỏi cột H, và ta có thể "sờ mó" thoải mái
Ẹc... Ẹc...

Mục đích chính là đừng để người ngay vào nhầm phòng thôi bạn à.
Hôm nay tôi vừa làm cho nhân viên một File mẫu và phải dặn họ đừng nhập dữ liệu vào cột tổng vì máy sẽ tự xóa đi để cộng lại. Lúc đầu tôi định dùng Validation để khắc phục, sau đó thấy rằng cách tốt nhất là không cho người ta vào phòng thay vì vào rồi mới biết là nhầm phòng. Thấy cách này cũng hay nên post lên để chia xẻ cùng mọi người.

Hic... Nếu không xem bài này thì không phải ai cũng biết cách lôi vùng "vùng cấm" ấy ra ngoài đâu nha - Trước khi xem bài của bạn không nói tôi cũng không biết.
 
Lần chỉnh sửa cuối:
Upvote 0
Em có thêm 1 cải tiến cho code của anh:
- Em tạo 1 name cho vùng dữ liệu mà anh muốn "cấm" ---> Ví dụ em đặt nó tên là CAM
- Em sẽ sửa code lại thành:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Range("Cam")
    If Not Intersect(Target, .Cells) Is Nothing Then
      .Offset(.Rows.Count, .Columns.Count)(1, 1).Select
    End If
  End With
End Sub
Giờ thì hãy "quên đi" vụ Insert Column hay Row đi nhé
tôi thực hiện theo cách khóa này cho 1 vùng dữ liệu.
Sau đó, tôi muốn tạo 1 macro ghi nhận quá trình copy dữ liệu trong vùng dữ liệu này:
+ Làm sao macro có thể disable "vùng cấm" này để có thể thao tác copy vùng dữ liệu này (có công thức)
+ Sau khi copy xong thì thực hiện lại "vùng cấm" cho toàn bộ dữ liệu (dữ liệu cũ và dữ liệu vừa mới copy)
Mong mọi người giúp đỡ
 
Upvote 0
Em có thêm 1 cải tiến cho code của anh:
- Em tạo 1 name cho vùng dữ liệu mà anh muốn "cấm" ---> Ví dụ em đặt nó tên là CAM
- Em sẽ sửa code lại thành:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Range("Cam")
    If Not Intersect(Target, .Cells) Is Nothing Then
      .Offset(.Rows.Count, .Columns.Count)(1, 1).Select
    End If
  End With
End Sub
Giờ thì hãy "quên đi" vụ Insert Column hay Row đi nhé
Chào các bạn
Giả sử tôi muốn tạo nhiều vùng cấm trong 1 sheet như CAM, CAM1, CAM2
Thì code trên sửa như thế nào.Xin cảm ơn !
 
Lần chỉnh sửa cuối:
Upvote 0
tôi thực hiện theo cách khóa này cho 1 vùng dữ liệu.
Sau đó, tôi muốn tạo 1 macro ghi nhận quá trình copy dữ liệu trong vùng dữ liệu này:
+ Làm sao macro có thể disable "vùng cấm" này để có thể thao tác copy vùng dữ liệu này (có công thức)
+ Sau khi copy xong thì thực hiện lại "vùng cấm" cho toàn bộ dữ liệu (dữ liệu cũ và dữ liệu vừa mới copy)
Mong mọi người giúp đỡ
Bạn khai báo 1 biến public kiểu boolean. Tạo một sub thay đổi biến này. Ở sub cấm sẽ kiểm tra biến, nếu là true thì thực hiện, false thì end sub. Hoặc bạn có thể thay đổi property application.enableevents
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu bạn muốn bảo vệ một vùng nào đó trong bảng tính (chỉ được xem - không được nhập, sửa ...) thì ngoài các phương pháp Protect, Validation... bạn có thể tạo "vùng cấm địa" trong bảng tính bằng VBA theo cách sau:
Ví dụ: bạn muốn vùng C5:H20 của Sheet1 là bất khả xâm phạm thì bạn Pate Code sau vào Module của Sheet1 (bạn sửa lại vùng [c5:h20] hoặc chọn nhiều vùng theo theo ý của bạn).
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Not Intersect(Target, [c5:h20]) Is Nothing Then [a1].Select
End Sub
Xin nói thêm: Giải pháp nào cũng có 2 mặt, do đó đây cũng chỉ là thêm một cách cho sự lựa chọn của bạn.

Trong file BH của tôi có một số cột không muốn cho thay đổi, mà dùng Protect không được, không biết áp dụng cách này của bác Trung Chính có được không phải thử mới được.
Cảm ơn bác nhé
 
Upvote 0
Chào các bạn
Giả sử tôi muốn tạo nhiều vùng cấm trong 1 sheet như CAM, CAM1, CAM2
Thì code trên sửa như thế nào.Xin cảm ơn !
Bạn thử tham khảo

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Union(Range("CAM"), Range("CAM1"))
If Not Intersect(Target, .Cells) Is Nothing Then
.Offset(.Rows.Count, .Columns.Count)(1, 1).Select
End If
End With
End Sub
 
Upvote 0
Em có thêm 1 cải tiến cho code của anh:
- Em tạo 1 name cho vùng dữ liệu mà anh muốn "cấm" ---> Ví dụ em đặt nó tên là CAM
- Em sẽ sửa code lại thành:
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
  With Range("Cam")
    If Not Intersect(Target, .Cells) Is Nothing Then
      .Offset(.Rows.Count, .Columns.Count)(1, 1).Select
    End If
  End With
End Sub
Giờ thì hãy "quên đi" vụ Insert Column hay Row đi nhé
Nhờ thầy chỉnh giúp công thức để khi nhấp chuột vào ô nào của cột A thì chuột nhảy sang bên cạnh ví dụ bấm vào A4 thì chuột nhảy sang B4, nhấp vào A10 thì chuột nhảy sang B10
 

File đính kèm

Upvote 0
Nhờ thầy chỉnh giúp công thức để khi nhấp chuột vào ô nào của cột A thì chuột nhảy sang bên cạnh ví dụ bấm vào A4 thì chuột nhảy sang B4, nhấp vào A10 thì chuột nhảy sang B10

Mục đích chính của bạn là không cho chọn hay không cho thao tác, vd. paste?
Tôi nghĩ là không cho thao tác chứ chọn thì đã là gì đâu.

Vì cột A thì dễ nhưng do bạn nói trong bài #8 là
tôi có một số cột không muốn cho thay đổi

nên code bạn trích không cấm được trong trường hợp bất kỳ

Giả dụ bạn có dữ liệu trong A1:C13. Vùng cấm là E1:F13.
Tôi copy dữ liệu trong A1:C13 --> chọn D1 --> paste
Như thế là toàn bộ vùng cấm đã được nhập dữ liệu từ B1:C13

Nếu G1:I13 rỗng thì tôi copy nó --> chọn D1 --> paste
Vùng cấm bị xóa hoàn toàn.
 
Upvote 0
Cám ơn bạn Siwtom, mục đích của tôi chỉ là không cho chuột vào được cột có công thức để đỡ bị nhầm khi nhập liệu bán hàng mà thôi, nhưng khi tôi bấm chuột vào 1 ô thì chuột lại chạy lên tận đầu trang, làm sao để cho nó chỉ chạy sang ngang 1 ô thôi
 
Upvote 0
Cám ơn bạn Siwtom, mục đích của tôi chỉ là không cho chuột vào được cột có công thức để đỡ bị nhầm khi nhập liệu bán hàng mà thôi, nhưng khi tôi bấm chuột vào 1 ô thì chuột lại chạy lên tận đầu trang, làm sao để cho nó chỉ chạy sang ngang 1 ô thôi

Tức cột B không cấm?
Mã:
Cam  =Sheet1!$A:$A

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim rng As Range
    Set rng = Intersect(Target, Range("Cam"))
    If Not rng Is Nothing Then rng(1).Offset(, 1).Select
End Sub

Viết trong notepad không test nên không biết có chính xác và lường mọi trường hợp không
 
Upvote 0
Cám ơn bạn Siwtom, mục đích của tôi chỉ là không cho chuột vào được cột có công thức để đỡ bị nhầm khi nhập liệu bán hàng mà thôi, nhưng khi tôi bấm chuột vào 1 ô thì chuột lại chạy lên tận đầu trang, làm sao để cho nó chỉ chạy sang ngang 1 ô thôi
Ái chà! quên, bạn sửa code như sau :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("d4:d6000")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
With Range("l4:l6000")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
With Range("a4:a5999")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
"Lão" sửa code như sau :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("d4:d6000")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
With Range("l4:l6000")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
With Range("a4:a5999")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
End Sub

Nếu IF đầu tiên đã được thực hiện thì sau khi select xong thì dọn luôn đồ chơi chứ kiểm tra 2 điều kiện sau làm gì cho tốn điện nước?
 
Upvote 0
Nếu IF đầu tiên đã được thực hiện thì sau khi select xong thì dọn luôn đồ chơi chứ kiểm tra 2 điều kiện sau làm gì cho tốn điện nước?
Cám ơn thày , nhà em chỉ sửa tí tẹo code của "lão" ấy, à bạn ấy để theo yêu cầu thôi ạ ! Theo nhắc nhở của thầy nhà em xin sửa lại như sau :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("d4:d6000,l4:l6000,a4:a5999")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
End Sub

code đúng còn một mẩu . cám ơn thày !
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn tất cả mọi người, vì chẳng học hành đến nơi đến chốn, chỉ là học lỏm nên "cấm" được 1 cột thì theo đó "cấm" cột 2, "cấm" cột 3 ... cho nên "cốt" mới dài lê thê mà lại không đạt ý.
May được các thầy, các bạn giúp, tôi cũng đã hiểu ra ít nhiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Cám ơn thày , nhà em chỉ sửa tí tẹo code của "lão" ấy, à bạn ấy để theo yêu cầu thôi ạ ! Theo nhắc nhở của thầy nhà em xin sửa lại như sau :

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
With Range("d4:d6000,l4:l6000,a4:a5999")
If Not Intersect(Target, .Cells) Is Nothing Then
ActiveCell.Offset(, 1).Select
End If
End With
End Sub

code đúng còn một mẩu . cám ơn thày !
Bạn copy cả cột C chứa dữ liệu, bấm nhanh vài lần vào chữ D trên đỉnh cột D. Sau vài lần nhảy sang cột E, excel sẽ cho ta chọn cột D, bấm Ctrl-V để paste vào cột D.
Cách 2 "chơi đúng luật" hơn bạn muốn nhập 1 vào A4, chỉ cần nhập vào ô ở trên rồi fill xuống.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn copy cả cột C chứa dữ liệu, bấm nhanh vài lần vào chữ D trên đỉnh cột D. Sau vài lần nhảy sang cột E, excel sẽ cho ta chọn cột D, bấm Ctrl-V để paste vào cột D.
Việc gì phải bấm nhanh vào đâu . Bạn cứ chọn A3 hoặc D3 hoặc L3 là dán vô tư . Có điều Bạn Thấy cần Mấy dòng trên để trình bày nội dung, mà chỉ tránh vô tình làm sai lệch dữ liệu thôi . Nếu muốn không cho dán dữ liệu copy thì chọn cả cột : Range("A:A,D:D,L:L").Nói chung chỉ "dọa" người không biết thôi . À mà đây là ý tưởng của thày Trung chính và Thày NDU, mình chỉ phát triển tí tẹo râu ria mà thôi .
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn tất cả mọi người, vì chẳng học hành đến nơi đến chốn, chỉ là học lỏm nên "cấm" được 1 cột thì theo đó "cấm" cột 2, "cấm" cột 3 ... cho nên "cốt" mới dài lê thê mà lại không đạt ý.
May được các thầy, các bạn giúp, tôi cũng đã hiểu ra ít nhiều.
Bạn Quang Hải có một câu mình thấy rất hay : Đi xa được ngàn dặm, khởi đầu một bước chân ! Ai chả bước từng bước, ai nhảy trăm bước một ?!
 
Upvote 0
Web KT

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

Back
Top Bottom