Giải pháp phân vùng nhập liệu - sử dụng PassWord

Liên hệ QC

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):
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
trong đó thiết lập và hoàn trả môi trường.
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
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.
 

File đính kèm

Bác ơi! Vấn đề sau khi nhập đúng Pass rồi thì làm sao để nhập điểm đây? Và việc chuyển bảo mật của Excel thì đâu có mạnh đâu bác. Chỉ là tạm thời thôi! Nên việc tạo Form hay đại khái giống kiểu này thì nên lập trình ở các trình lập trình khác thì hơn. Tốt nhất làm luôn trên VB.NET Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhập điểm

Bác ơi! Vấn đề sau khi nhập đúng Pass rồi thì làm sao để nhập điểm đây?
Và việc chuyển bảo mật của Excel thì đâu có mạnh đâu bác. Chỉ là tạm thời thôi!
Nên việc tạo Form hay đại khái giống kiểu này thì nên lập trình ở các trình lập trình khác thì hơn. Tốt nhất làm luôn trên VB.NET
Thân.

Mới chỉ là giải pháp cơ bản, cho nên sau khi nhập đúng PW rồi thì đã mở khóa vùng điểm bảo vệ của lớp và cứ thế mà gõ điểm trực tiếp vào! --=0
 
Upvote 0
Thank bạn đã đưa ra vấn đề mình đang làm.
Tiện đây mình muốn 1vấn đề. Đó là khi mình share workbook mình tạo ra với password cho từng người và mọi người truy cập qua mạng LAN thì tốc độ rất chậm. Mặc dù file khá nhỏ và đơn giản.
Đọc trực tiếp trên máy mình thì không vấn đề j.
Ai có kinh nghiệm vui lòng góp ý nhé.
Tks in advance
 
Upvote 0
Không ý em nói là trường hợp của gv01: Nguyễn Văn An với Lớp 7B với pass: 1 thì có chỗ nào để nhập điểm cho lớp ấy không? Xin lỗi vì không nói rõ cụ thể tình huống! Bác xem lại xem nha! Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Không ý em nói là trường hợp của gv01: Nguyễn Văn An với Lớp 7B với pass: 1 thì có chỗ nào để nhập điểm cho lớp ấy không? Xin lỗi vì không nói rõ cụ thể tình huống!
Bác xem lại xem nha!
Thân.
Hì hì!
Tại vì, là tại vì chưa có dữ liệu í mà.
Tại vì lười nên mới lấy file mẫu của bạn xichdragon, trong đó mới có 3 lớp 6A, 7A, 8A. Nhưng vì tôi muốn triển khai tổng quát khi 1 giáo viên dạy nhiều hơn 1 lớp (6A, 7B, 8E chẳng hạn) nên trong phần BangMa đã khai báo 1 Gv dạy nhiều hơn 1 lớp nhưng trng phần dữ liệu lại chưa tạo ra cho nên khi lọc theo ~ lớp này thì chẳng có 1 HS nào là thế.

Thank bạn đã đưa ra vấn đề mình đang làm.
Tiện đây mình muốn 1vấn đề. Đó là khi mình share workbook mình tạo ra với password cho từng người và mọi người truy cập qua mạng LAN thì tốc độ rất chậm. Mặc dù file khá nhỏ và đơn giản.
Đọc trực tiếp trên máy mình thì không vấn đề j.
Ai có kinh nghiệm vui lòng góp ý nhé.
Tks in advance
Nếu muốn xây dựng 1 chương trình như thế thì đòi hỏi phải thay giải pháp. Khi đó mỗi người sẽ được cấp 1 bản sao để nhập liệu và 1 chương trình tổng hợp sẽ tự động kết nối các file lại với nhau. Cuối mỗi kỳ nhập điểm sẽ tạo nút UpLoad để chuyển file từ máy client lên server, từ đó chương trình tổng hợp sẽ xác nhận việc hoàn tất nhập liệu để tổng hợp cuối kỳ.

Thân!
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Vậy bác nên làm theo Table List của Excel (giống như Table của Access vậy!) kết hợp với mã lớp và mã giáo viên để quy định dữ liệu xuất ra. Và nếu như vậy thì sẽ phải cần thêm 1 sheet lưu từng List của mỗi lớp. Để làm cơ sở dữ liệu nguồn. Thân. Vậy là tạo nhiều file khác nhau cho từng giáo viên và tạo 1 nút Load dữ liệu ở cuối mỗi học kỳ! Đây là cách chúng em thường dùng.... Vậy chúc mọi người thành công nha! Thân.Chào.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhập điểm

Vậy bác nên làm theo Table List của Excel (giống như Table của Access vậy!) kết hợp với mã lớp và mã giáo viên để quy định dữ liệu xuất ra. Và nếu như vậy thì sẽ phải cần thêm 1 sheet lưu từng List của mỗi lớp. Để làm cơ sở dữ liệu nguồn.
Thân.
Thật ra vì bài toán nhập điểm ở đây (xuất phát từ yêu cầu đơn giản) không đòi hỏi cao nên tôi chỉ đưa ra 1 giải pháp cơ bản. Để triển khai thành 1 ứng dụng cần sự phân tích kỹ lưỡng hơn. Chẳng hạn, hiện tôi đang triển khai hệ hỗ trợ nhập điểm học phần (không phải nhập điểm theo lớp như ở phổ thông) theo môn học về cho các đơn vị cấp Khoa, khi đó việc chuẩn bị dữ liệu sẽ phức tạp hơn nhiều.
Mỗi người học sẽ có 1 chương trình học khác nhau, do đó phần nhập điểm sẽ nhập theo môn học.
Nói tóm lại, đây chỉ mới là 1 giải pháp sơ khởi. Nếu muốn triển khai hệ đầy đủ thì cần nhiều thời gian hơn.
Thân!
 
Upvote 0
Nếu muốn xây dựng 1 chương trình như thế thì đòi hỏi phải thay giải pháp. Khi đó mỗi người sẽ được cấp 1 bản sao để nhập liệu và 1 chương trình tổng hợp sẽ tự động kết nối các file lại với nhau. Cuối mỗi kỳ nhập điểm sẽ tạo nút UpLoad để chuyển file từ máy client lên server, từ đó chương trình tổng hợp sẽ xác nhận việc hoàn tất nhập liệu để tổng hợp cuối kỳ.
__________________
-hvl-

Đấy cũng là giải pháp mà mình quay lại sử dụng dù không muốn vì người sử dụng có thể cài lại máy, thay đổi computer name, thay đổi đường dẫn....
Ở đây mình muốn hỏi nguyên nhân khiến 1workbook khi shared lại có tốc độ chậm khi truy cập qua LAN
Tks
 
Upvote 0
Em gởi file này lên anh xem và giúp đỡ cho em xin ý kiến, để khác phục được những ý tưởng của anh đưa ra
 

File đính kèm

Upvote 0
Nếu tôi mở file mà không Enable macro thì sao ta?
 
Upvote 0
Vậy có cách nào khắc phục tình trạng đó không anh, em chỉ làm thủ công là vào Tool --> Macro ,.... và chọn Lows
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy có cách nào khắc phục tình trạng đó không anh, em chỉ làm thủ công là vào Tool --> Macro ,.... và chọn Lows
Cách thì tôi không biết, nhưng nếu bạn đặt Security ở mức Low thì có mấy chuyện cần bàn:
- Chỉ máy bạn chạy được chương trình
- Máy bạn có thể dể dàng bị nhiểm virus mà bạn không hề hay biết ---> Đến 1 ngày nào đó bạn tình cờ phát hiện ra thì... ôi thôi... cả ngàn file trên máy đã nhiểm sạch ---> Lúc này bạn tính sao? ---> Quét virus thì đồng nghĩa macro của bạn cũng đi tong...
 
Upvote 0
Vậy em có thể chuyển toàn bộ các macro đó về VBA được không vậy?
 
Upvote 0
Web KT

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

Back
Top Bottom