hoangvuluan
Thành viên tích cực
- Tham gia
- 2/11/08
- Bài viết
- 983
- Được thích
- 2,723
- Nghề nghiệp
- Chuyên viên Phòng Đào tạo ĐH
Nhân có người đặt vấn đề cần thiết có giải pháp phân vùng dữ liệu có cài password để nhập liệu chung, tôi mở topic này để triển khai một số ý về nội dung này.
Có thể trên diễn đàn đã có các giải pháp khác nhau, nếu ý ở đây trùng lặp, các Mod có thể xóa topic này.
Vấn đề cụ thể như sau:
Cần tổ chức 1 sheet nhập liệu dùng chung cho nhiều người, ví dụ: nhập điểm.
Yêu cầu: mỗi người sẽ được cấp 1 PW để làm việc.
Công việc có thể: Nhập dữ liệu - Xác nhận hoàn thành nhập liệu - Chỉnh sửa dữ liệu...
Trong bài này, tôi trình bày nội dung cụ thể để bước đầu xây dựng quy trình tổ chức dữ liệu và tiến hành nhập liệu.
1. Xây dựng dữ liệu:
Tổ chức 1 sheet (tôi đặt tên là BangMa), gồm các thông tin sau:
- Danh sách giáo viên, gồm các thông tin: Mã giáo viên, Họ tên GV, PassWord mặc định (default) - sau này có thể thay đổi ... (đặt tên là DsGV). Trong DS này đưa vào dòng cuối mã Admin để mở pass của sheet ...
- Danh sách lớp: Mã lớp (tên lớp); Mã giáo viên đứng lớp ... (đặt tên là DsLop)
- Nội dung các hành động: Nhập điểm; Xác nhận điểm; Sửa điểm... (tên: HDong)
- Ngoài ra, căn cứ vào mã giáo viên đang thực hiện sẽ lọc ra danh sách lớp tương ứng của GV đó, phục vụ việc chọn lớp để hành động.
2. Bảng nhập liệu:
Tổ chức sheet nhập liệu (đặt tên là DIEM08), với các nội dung sau:
- Một validation để chọn mã giáo viên (ô có tên: nMaGV), và tương ứng với mã GV sẽ lọc ra danh sách các lớp mà GV đó tham gia dạy (ở 1 validation bên dưới - name: lMaGV)
- Một validation để chọn hành động (name: vHDong), tương ứng với nó là ô thể hiện chỉ số hành động (iHDong) (phục vụ việc mã hóa)
- Và vùng dữ liệu nhập điểm (name DIEM08 - trùng tên sheet), gồm: Mã lớp; Họ tên học sinh của lớp; Các field môn học (Toán, Lý, Hóa...)
- Cuối cùng là 1 nút lệnh dùng để thực thi hành động đã chọn.
3. Quy trình Thực hiện:
Giải pháp này bước đầu chỉ xây dựng giả định một số thông tin, để áp dụng được vào nội dung cụ thể thì cần phải cung cấp dữ liệu đầy đủ, chính xác.
Đã xây dựng một số sự kiện như sau:
a. WorkBook_Open và BeforeClose(sheet ThisWorkBook):
trong đó thiết lập và hoàn trả môi trường.
b. Sheet DIEM08
Nội dung chủ yếu là xử lý sự kiện nhấn nút command
c. Module1
Gồm các khai báo hằng, các sub thiết lập trạng thái làm việc...
Các bước tiến hành như sau:
Khi mở workbook sẽ đưa về trạng thái khóa sheet, chuẩn bị làm việc.
- Với mỗi giáo viên, cần chọn mã giáo viên phù hợp, chọn lớp để thực hiện và nhấn nút Thực hiện (<!>) để bắt đầu. Sau khi nhập password thành công (đang mặc định là 1, 2, 3 tương ứng với các mã gv: gv01, gv02, gv03...) sẽ lọc ra danh sách học sinh tương ứng với lớp đã chọn để thực hiện công việc.
- Sau khi nhập điểm kết thúc, chọn hành động: Xác nhận và nhấn nút <!> để save và khóa dữ liệu.
- Với admin, chọn mã gv00 từ DS giáo viên, nhấn nút <!>, nhập PW: admin (mặc định) nhằm: hoàn trả môi trường, mở khóa bảo vệ... Sau khi hoàn tất có thể nhấn giữ phím Ctrl và chọn <!> để khóa sheet.
- Bước đầu có thể triển khai cơ bản như thế, sẽ tiếp tục bổ sung và hoàn thiện.
Các bạn có thể tham khảo file đính kèm.
Có thể trên diễn đàn đã có các giải pháp khác nhau, nếu ý ở đây trùng lặp, các Mod có thể xóa topic này.
Vấn đề cụ thể như sau:
Cần tổ chức 1 sheet nhập liệu dùng chung cho nhiều người, ví dụ: nhập điểm.
Yêu cầu: mỗi người sẽ được cấp 1 PW để làm việc.
Công việc có thể: Nhập dữ liệu - Xác nhận hoàn thành nhập liệu - Chỉnh sửa dữ liệu...
Trong bài này, tôi trình bày nội dung cụ thể để bước đầu xây dựng quy trình tổ chức dữ liệu và tiến hành nhập liệu.
1. Xây dựng dữ liệu:
Tổ chức 1 sheet (tôi đặt tên là BangMa), gồm các thông tin sau:
- Danh sách giáo viên, gồm các thông tin: Mã giáo viên, Họ tên GV, PassWord mặc định (default) - sau này có thể thay đổi ... (đặt tên là DsGV). Trong DS này đưa vào dòng cuối mã Admin để mở pass của sheet ...
- Danh sách lớp: Mã lớp (tên lớp); Mã giáo viên đứng lớp ... (đặt tên là DsLop)
- Nội dung các hành động: Nhập điểm; Xác nhận điểm; Sửa điểm... (tên: HDong)
- Ngoài ra, căn cứ vào mã giáo viên đang thực hiện sẽ lọc ra danh sách lớp tương ứng của GV đó, phục vụ việc chọn lớp để hành động.
2. Bảng nhập liệu:
Tổ chức sheet nhập liệu (đặt tên là DIEM08), với các nội dung sau:
- Một validation để chọn mã giáo viên (ô có tên: nMaGV), và tương ứng với mã GV sẽ lọc ra danh sách các lớp mà GV đó tham gia dạy (ở 1 validation bên dưới - name: lMaGV)
- Một validation để chọn hành động (name: vHDong), tương ứng với nó là ô thể hiện chỉ số hành động (iHDong) (phục vụ việc mã hóa)
- Và vùng dữ liệu nhập điểm (name DIEM08 - trùng tên sheet), gồm: Mã lớp; Họ tên học sinh của lớp; Các field môn học (Toán, Lý, Hóa...)
- Cuối cùng là 1 nút lệnh dùng để thực thi hành động đã chọn.
3. Quy trình Thực hiện:
Giải pháp này bước đầu chỉ xây dựng giả định một số thông tin, để áp dụng được vào nội dung cụ thể thì cần phải cung cấp dữ liệu đầy đủ, chính xác.
Đã xây dựng một số sự kiện như sau:
a. WorkBook_Open và BeforeClose(sheet ThisWorkBook):
Mã:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call setEnv(True)
End Sub
Private Sub Workbook_Open()
Call setEnv(False)
Call setStatus(0)
End Sub
b. Sheet DIEM08
Mã:
Private Sub cmdOK_Click()
Static nhDiem As Boolean
Dim rLopMaGV As Range
Dim rDiem As Range
Dim iRow As Long, iCol As Long, sRow As Long, eRow As Long
On Error Resume Next
If Me.Range(nMaGV) = Admin Then
If pwOK Then
MsgBox "Da mo mat khau sheet!"
Call setEnv(True)
Me.Unprotect Password:=pWord
Me.ShowAllData
End If
Exit Sub
End If
Set rLopMaGV = Me.Range(lMaGV)
If rLopMaGV = "" Then
MsgBox "Can chon lop de thuc hien!"
Exit Sub
End If
nhDiem = (Me.Range(iHDong) <> hdong_XacNhan)
If nhDiem Then
If Not pwOK Then
MsgBox Prompt:="Sai Mat Khau - Thu lai!", Buttons:=vbCritical + vbOKOnly
Exit Sub
End If
Else 'Xac nhan diem
ActiveWorkbook.Save
End If
Application.ScreenUpdating = False
Me.Unprotect Password:=pWord
Me.ShowAllData
Set rDiem = Me.Range(shDiem)
With rDiem
.Locked = True
Me.Range(nMaGV).Locked = (Me.Range(iHDong) <> hdong_XacNhan)
Me.Range(lMaGV).Locked = (Me.Range(iHDong) <> hdong_XacNhan)
Me.Range(vHDong).Locked = False
iRow = .Rows.Count - 1 ' tru dong dau
.Resize(, 1).AutoFilter field:=1, Criteria1:=rLopMaGV, visibledropdown:=False
End With
Set rDiem = Me.Range(nDiem)
iCol = rDiem.Columns.Count
Set rDiem = rDiem.Offset(1, 0).Resize(iRow, iCol)
'rDiem.Cells.Interior.ColorIndex = 4
rDiem.Locked = (Me.Range(iHDong) = hdong_XacNhan)
Me.Protect Password:=pWord, DrawingObjects:=True, Contents:=True, Scenarios:=True
Me.EnableSelection = xlUnlockedCells
rDiem(1, 1).Activate
Application.ScreenUpdating = True
End Sub
Private Function pwOK() As Boolean
pw = InputBox(Prompt:="Nhap Mat Khau: ")
pwOK = (pw = WorksheetFunction.VLookup(Me.Range(nMaGV), Sheets(shBangMa).Range("dsGV"), 3, 0) & "")
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range
Set r = Me.Range(nMaGV)
If Target.Address = r.Address Then
If Me.Range(iHDong) <> 1 Then Me.Range(vHDong) = Sheets(shBangMa).Range("HDong")(1, 1)
With Me.Range(lMaGV)
.Value = ""
.Activate
End With
End If
End Sub
Nội dung chủ yếu là xử lý sự kiện nhấn nút command
c. Module1
Mã:
' Cac name dat trong workbook
Public Const pWord = "123"
Public Const Admin = "gv00"
Public Const shDiem = "DIEM08"
Public Const shBangMa = "BangMa"
Public Const nDiem = "nDiem", lMaGV = "lMaGV", nMaGV = "nMaGV", _
vHDong = "vHDong", iHDong = "iHDong"
' Cac hang ve hanh dong cua giao vien
Public Const hdong_NhapDiem = 1
Public Const hdong_XacNhan = 2
Public Const hdong_SuaDiem = 3
Sub setStatus(id As Byte)
Dim sDiem As Worksheet
Set sDiem = Sheets(shDiem)
With sDiem
.Unprotect Password:=pWord
.Cells.Locked = True
.Range(nMaGV).Locked = False
.Range(lMaGV).Locked = False
.Range(vHDong) = Sheets(shBangMa).Range("HDong")(1, 1)
.Protect Password:=pWord, DrawingObjects:=True, Contents:=True, Scenarios:=True
.EnableSelection = xlUnlockedCells
.Activate
End With
End Sub
Sub setEnv(Optional Opt As Boolean = False)
Application.ScreenUpdating = False
With ActiveWindow
.DisplayGridlines = Opt
.DisplayHeadings = Opt
'.DisplayHorizontalScrollBar = Opt
'.DisplayVerticalScrollBar = Opt
.DisplayWorkbookTabs = Opt
End With
With Application
.DisplayFormulaBar = Opt
.DisplayStatusBar = Opt
.ShowStartupDialog = Opt
.ShowWindowsInTaskbar = Opt
End With
Dim cb As CommandBar
For Each cb In CommandBars
cb.Enabled = Opt
Next
CommandBars("Worksheet Menu Bar").Enabled = Opt
'CommandBars("Standard").Visible = Opt
'CommandBars("Formatting").Visible = Opt
Application.ScreenUpdating = True
End Sub
Private Sub EnableCommandBars()
Dim cb As CommandBar
For Each cb In CommandBars
cb.Enabled = True
Next
End Sub
Các bước tiến hành như sau:
Khi mở workbook sẽ đưa về trạng thái khóa sheet, chuẩn bị làm việc.
- Với mỗi giáo viên, cần chọn mã giáo viên phù hợp, chọn lớp để thực hiện và nhấn nút Thực hiện (<!>) để bắt đầu. Sau khi nhập password thành công (đang mặc định là 1, 2, 3 tương ứng với các mã gv: gv01, gv02, gv03...) sẽ lọc ra danh sách học sinh tương ứng với lớp đã chọn để thực hiện công việc.
- Sau khi nhập điểm kết thúc, chọn hành động: Xác nhận và nhấn nút <!> để save và khóa dữ liệu.
- Với admin, chọn mã gv00 từ DS giáo viên, nhấn nút <!>, nhập PW: admin (mặc định) nhằm: hoàn trả môi trường, mở khóa bảo vệ... Sau khi hoàn tất có thể nhấn giữ phím Ctrl và chọn <!> để khóa sheet.
- Bước đầu có thể triển khai cơ bản như thế, sẽ tiếp tục bổ sung và hoàn thiện.
Các bạn có thể tham khảo file đính kèm.