Chương trình quản lý điểm học sinh (3 người xem)

  • Thread starter Thread starter huyenah
  • Ngày gửi Ngày gửi
Liên hệ QC

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

huyenah

Thành viên mới
Tham gia
2/5/09
Bài viết
4
Được thích
0
Mình được giao quản lý điểm của học sinh toàn trường bằng excel
Tuy nhiên có yêu cầu là khi nhập điểm vào rồi thì những điểm đó không sửa hay xóa được nữa. Chỉ có người quản lý chương trình mới có thế thay đổi được.
Vậy làm thế nào để những ô đã nhập dữ liệu vào thì không sửa hay xóa được, những ô còn lại vẫn nhập được bình thường, không cần phải khóa Sheet.
Mong các thành viên diễn đàn ra tay chỉ giúp.
Nếu có thể xin làm ơn gửi File qua hòm thư : Dungled73@yahoo.com.vn
Xin cảm ơn
 
Mình được giao quản lý điểm của học sinh toàn trường bằng excel
Tuy nhiên có yêu cầu là khi nhập điểm vào rồi thì những điểm đó không sửa hay xóa được nữa. Chỉ có người quản lý chương trình mới có thế thay đổi được.
Vậy làm thế nào để những ô đã nhập dữ liệu vào thì không sửa hay xóa được, những ô còn lại vẫn nhập được bình thường, không cần phải khóa Sheet.
Mong các thành viên diễn đàn ra tay chỉ giúp.
Nếu có thể xin làm ơn gửi File qua hòm thư : Dungled73@yahoo.com.vn
Xin cảm ơn

Đòi hỏi này hơi oái oăm, nếu không dùng protect toàn bộ ô thì không ổn, vì cần thay đổi giá trị điểm thì tự động tính lại.

Nói chung phải dùng khoá Sheet thôi.
 
Yêu cầu này có thể thực hiện bằng cách dùng sự kiện Worksheet_SelectionChange Kết hợp với Protect Sheet. Khi SelectionChange, Target có data thì ProctectSheet và ngược lại thì UnProtect. Như vậy điểm đã nhập rồi là không thể sửa.

TDN
 
Đây là code:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
Me.Unprotect "GPE"
Target.Locked = True
Me.Protect "GPE"
End Sub
 
Bác phải thêm DK rỗng nữa mới đầy đủ!
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
IF Target <> "" Then
Me.Unprotect "GPE"
Target.Locked = True
Me.Protect "GPE"
End If
End Sub
 
cám ơn bác, nhưng cụ thể thế nào bác chỉ giúp đi. Em còn mù mờ về macro lắm
 
Yêu cầu này có thể thực hiện bằng cách dùng sự kiện Worksheet_SelectionChange Kết hợp với Protect Sheet. Khi SelectionChange, Target có data thì ProctectSheet và ngược lại thì UnProtect. Như vậy điểm đã nhập rồi là không thể sửa.

TDN

Em nghĩ Worksheet_Change thì đúng hơn, nhưng có lẽ cũng không đúng theo ý đồ, vì điểm vẫn có thể sửa được. Mà còn yêu cầu người quản lý vẫn sửa được nữa.
 
Code bác giúp đỡ mới giải quết được 50 phần trăm vì những ô trống khii muốn nhập đều yêu cầu mở khóa. Các bác cố gắng giúp em nữa đi
 
Code bác giúp đỡ mới giải quết được 50 phần trăm vì những ô trống khii muốn nhập đều yêu cầu mở khóa. Các bác cố gắng giúp em nữa đi
Quên dặn 1 điều quan trọng. Đầu tiên phải bỏ chọn Lock cho toàn bộ bảng tính.
Ctrl + 1 | Tab Protection | Bỏ chọn Locked | ok
 
Em nghĩ Worksheet_Change thì đúng hơn, nhưng có lẽ cũng không đúng theo ý đồ, vì điểm vẫn có thể sửa được.
Mình nghĩ dùng sự kiện SelectionChange vì nếu dùng Change thì giả sử ô đang nhập liệu là B5 thì khi Enter sẽ xuống ô B6 như vậy Target là trong sự kiện Change là B5 chứ không phải B6
Mà còn yêu cầu người quản lý vẫn sửa được nữa.
Vẫn có thể thực hiện được bằng cách người quản lý UnProtect hoặc tạo thêm 1 nút lệnh làm công việc này...

TDN
 
Lần chỉnh sửa cuối:
Mình nghĩ dùng sự kiện SelectionChange vì nếu dùng Change thì giả sử ô đang nhập liệu là B5 thì khi Enter sẽ xuống ô B6 như vậy Target là trong sự kiện Change là B5 chứ không phải B6
Bạn text bằng Code này xem sự kiện Change thì Target là B5 hay B6 khi nhập liệu vào B5 và Enter.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address
End Sub
 
Quên dặn 1 điều quan trọng. Đầu tiên phải bỏ chọn Lock cho toàn bộ bảng tính.
Ctrl + 1 | Tab Protection | Bỏ chọn Locked | ok
Ồ, không cần đâu. Nếu bạn dùng sự kiện SelectionChange thì bạn có thể làm như sau
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target = "" Then Me.Unprotect Else Me.Protect
End Sub
TDN
 

File đính kèm

Dùng SelectionChange() có cần thiết ko bác? Vì nó chỉ cần xác nhận việc khóa cho việc nhập liệu thôi. Còn các tình huống di chuyển con trỏ đâu cần phải chạy code làm gì nhỉ? Làm vậy chỉ tổ nặng máy thôi.
<Một chút ý kiến riêng!>
 

Ồ, không cần đâu. Nếu bạn dùng sự kiện SelectionChange thì bạn có thể làm như sau
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target = "" Then Me.Unprotect Else Me.Protect
End Sub
TDN
Nếu sử dụng sự kiện SelectionChange thì mỗi khi bạn "nhúc nhích" Macro sẽ chạy. Như thế sẽ ảnh hưởng đến tốc độ và tài nguyên.
Hơn nữa code này có lỗ hổng. Nếu một ai đó chọn 1 ô trống. Rồi save file lại. Rồi disable macro sau đó mở file lên. Như thế là unprotect được rồi.
 
Bạn text bằng Code này xem sự kiện Change thì Target là B5 hay B6 khi nhập liệu vào B5 và Enter.
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address
End Sub
Bạn đã Test chưa ? Khi đang ở B5 và bạn nhập liệu vào rồi Enter thì Msgbox Target.Address cho kết quả là B5 nhưng trong lúc này ô hiện hành của bạn là B6 mà và như vậy B6 là rỗng hay đã có điểm số thì bạn đâu có biết. Như vậy Target không đúng ý đồ rồi.
Nếu sử dụng sự kiện SelectionChange thì mỗi khi bạn "nhúc nhích" Macro sẽ chạy. Như thế sẽ ảnh hưởng đến tốc độ và tài nguyên.
Hơn nữa code này có lỗ hổng. Nếu một ai đó chọn 1 ô trống. Rồi save file lại. Rồi disable macro sau đó mở file lên. Như thế là unprotect được rồi.
Nếu nói đến tốc độ và tài nguyên thì mình nghĩ còn nhiều chuyện phải bàn lắm
+ Dùng gì đi nữa thì phải đạt được mục đích rồi mới tính tới chuyện khác
+ Dùng SelectionChange thì bảng tính không Calculate nhưng dùng sự kiện Change thì mỗi lần Change bảng tính sẽ Calculate toàn bộ; không khéo có những trường hợp phải chờ nó Calculate miệt mài luôn á

Tóm lại, với mình thì trong trường hợp này cần phải dùng SelectionChange. Nếu yêu cầu chỉ có vậy thì tốc độ vẫn đảm bảo, nếu thêm gì đó thì bẫy lỗi thêm.

Đó chỉ là hướng gợi ý, thực tế thế nào thì thêm thắt vào cho phù hợp thôi.

Chúc vui
TDN
 
Lần chỉnh sửa cuối:
Bạn đã Test chưa ? Khi đang ở B5 và bạn nhập liệu vào rồi Enter thì Msgbox Target.Address cho kết quả là B5 nhưng trong lúc này ô hiện hành của bạn là B6 mà và như vậy B6 là rỗng hay đã có điểm số thì bạn đâu có biết. Như vậy Target không đúng ý đồ rồi.

Chúc vui
TDN
Không hiểu ý bạn lắm. Nhưng hình như bạn nhầm lẫn. Đâu cần quan tâm B6 rỗng hay không rỗng đâu. Chỉ biết trong code Target chính là B5 là đủ.
 
À thì ra bác bị rối ở chổ con trỏ hiện ở đây mà lại xữ lý dữ liệu ở kia phải ko?
Đúng vậy, lệnh Change() nó xữ lý ô dữ liệu mà bạn mới nhập xong chứ ko phải tính sao khi nhấn Enter nên ko liên quan gì cái Enter kia cả.
Vậy bác nhập dữ liệu ở ô nào thì nó tính rằng mình đang thao tác trên ô đó thôi.
Tóm lại, bác nhập liệu (hay ko) vào ô B5 thì lệnh Change() chỉ chạy cho ô B5 thôi, ô B6 chỉ là hình thức cho việc nhấn Enter xuống dòng thôi. Vậy cứ yên tâm rằng luôn đúng ý đồ mà, vì việc nhập dữ vào ô B5 đã an toàn và được khóa cẩn thận rồi, ha!

Chúc hiểu! hì hì hì
 

+ Dùng SelectionChange thì bảng tính không Calculate nhưng dùng sự kiện Change thì mỗi lần Change bảng tính sẽ Calculate toàn bộ; không khéo có những trường hợp phải chờ nó Calculate miệt mài luôn á
Calculate là do bạn thay đổi dữ liệu. Nếu không dùng Macro, khi bạn thay đổi giá trị một ô nào đó. Bảng tính của bạn vẫn Calculate như thường. Vì vậy, bạn nói "Dùng SelectionChange thì bảng tính không Calculate" là chưa đúng. Nó chỉ không Calculate khi bạn không nhập gì hết, chỉ chọn qua chọn lại các cell khác nhau thôi, một khi bạn đã nhập liệu thì chắc chắn nó sẽ Calculation nếu File đang ở chế độ Calculation = Automatic.
 
Calculate là do bạn thay đổi dữ liệu. Nếu không dùng Macro, khi bạn thay đổi giá trị một ô nào đó. Bảng tính của bạn vẫn Calculate như thường. Vì vậy, bạn nói "Dùng SelectionChange thì bảng tính không Calculate" là chưa đúng. Nó chỉ không Calculate khi bạn không nhập gì hết, chỉ chọn qua chọn lại các cell khác nhau thôi, một khi bạn đã nhập liệu thì chắc chắn nó sẽ Calculation nếu File đang ở chế độ Calculation = Automatic.
Tất nhiên là bạn hiểu đúng nhưng một khi đã nhập liệu thì nó lại là sự kiện Change chứ không thuộc về Select rồi, hi hi

TDN
 
Tất nhiên là bạn hiểu đúng nhưng một khi đã nhập liệu thì nó lại là sự kiện Change chứ không thuộc về Select rồi, hi hi

TDN
Vậy theo bạn thì sử dụng sự kiện SelectionChange để làm gì?!
Chỉ để chọn qua chọn lại cho vui thôi sao :-=
 
Web KT

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

Back
Top Bottom