Không cho phép chỉnh sửa những ô chứa dữ liệu cách ngày hiện tại từ 3 ngày trở về trước

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

syquyen1987

Thành viên hoạt động
Tham gia
8/7/18
Bài viết
188
Được thích
43
Kính gửi các Anh/Chị trên diễn đàn

Em có một vấn đề mong muốn được các Anh/Chị trên diễn đàn hỗ trợ giúp ạ

Hiện tại nhóm em có 6 người đang dùng chung OneDrive, trong đó có file Database. Em đang muốn làm thế nào để người khác không thể chỉnh sửa dữ liệu từ 3 ngày trở về trước ạ. Như hình ảnh đính kèm là một ví dụ ạ:
Hôm nay là ngày 03/09, cách 3 ngày trở về trước tức là từ ngày 31/8 trở về trước là không được chỉnh sửa dữ liệu những ô bôi đỏ, còn cột H, I, J là được phép chỉnh sửa bất kì thời gian nào. Ngày hôm sau thì tịnh tiến 1 ngày và vẫn theo quy luật đó ạ

Em xin cảm ơn Anh/Chị đã giúp đỡ ạ
1693724120038.png
 
Gợi ý cho bạn:
Dùng sự kiện worksheet change, kiểm tra cột D dòng chứa Target, so với today, nếu >=2 thì hiển thị msgbox, đồng thời "undo" phục hồi giá trị cũ, không cho cập nhật giá trị mới
(Mình đang lu bu, hy vọng bạn làm được hay bạn nào đi ngang qua giúp bạn)
 
Upvote 0
Kính gửi các Anh/Chị trên diễn đàn

Em có một vấn đề mong muốn được các Anh/Chị trên diễn đàn hỗ trợ giúp ạ

Hiện tại nhóm em có 6 người đang dùng chung OneDrive, trong đó có file Database. Em đang muốn làm thế nào để người khác không thể chỉnh sửa dữ liệu từ 3 ngày trở về trước ạ. Như hình ảnh đính kèm là một ví dụ ạ:
Hôm nay là ngày 03/09, cách 3 ngày trở về trước tức là từ ngày 31/8 trở về trước là không được chỉnh sửa dữ liệu những ô bôi đỏ, còn cột H, I, J là được phép chỉnh sửa bất kì thời gian nào. Ngày hôm sau thì tịnh tiến 1 ngày và vẫn theo quy luật đó ạ

Em xin cảm ơn Anh/Chị đã giúp đỡ ạ
View attachment 294463

Gợi ý cho bạn:
Dùng sự kiện worksheet change, kiểm tra cột D dòng chứa Target, so với today, nếu >=2 thì hiển thị msgbox, đồng thời "undo" phục hồi giá trị cũ, không cho cập nhật giá trị mới
(Mình đang lu bu, hy vọng bạn làm được hay bạn nào đi ngang qua giúp bạn)
Thực hiện lệnh "Undo" trong Code VBA là làm thế nào ạ, em bị mắc chỗ này ạ, mong anh hướng dẫn em với ạ
 
Upvote 0
Thực hiện lệnh "Undo" trong Code VBA là làm thế nào ạ, em bị mắc chỗ này ạ, mong anh hướng dẫn em với ạ
Chịu khó google nhé. Đây là 1 vi dụ:
Mã:
Sub UndoExample2()
    ' Lưu dữ liệu dòng 2 vào biến
    Dim Data As Variant
    Data = Rows(2).Value
    
    ' Xóa dòng 2
    Rows(2).Delete
    
    ' Sử dụng lệnh Undo để hoàn tác việc xóa dòng
    Application.Undo
    
    ' Dữ liệu của dòng 2 sẽ được khôi phục lại
    Rows(2).Value = Data
End Sub
Bạn tự làm nhé, đối đế thì quay lại hỏi tiếp.
 
Upvote 0
Chịu khó google nhé. Đây là 1 vi dụ:
Mã:
Sub UndoExample2()
    ' Lưu dữ liệu dòng 2 vào biến
    Dim Data As Variant
    Data = Rows(2).Value
   
    ' Xóa dòng 2
    Rows(2).Delete
   
    ' Sử dụng lệnh Undo để hoàn tác việc xóa dòng
    Application.Undo
   
    ' Dữ liệu của dòng 2 sẽ được khôi phục lại
    Rows(2).Value = Data
End Sub
Bạn tự làm nhé, đối đế thì quay lại hỏi tiếp.
Em tìm toi google mấy ngày nay rồi ạ, có thời gian rảnh là em vào google tìm nhưng chưa được ạ
Anh ơi, khi sự kiện Worksheet_Change thì khi gán dữ liệu là dữ liệu đã sửa ạ, vì sự kiện là thay đổi ô mới chạy code ạ (Em muốn dữ liệu gốc ban đầu ạ). Em nghĩ phải có sự kiện Worksheet_BeforeChange nhưng mà không có ạ. Mà em thấy bị lỗi dòng code "Application.Undo" ạ. Anh có ý kiến nào thêm cho em xin với ạ. Em cảm ơn anh đã dành thời gian cho em ạ
 
Upvote 0
Kính gửi các Anh/Chị trên diễn đàn

Em có một vấn đề mong muốn được các Anh/Chị trên diễn đàn hỗ trợ giúp ạ

Hiện tại nhóm em có 6 người đang dùng chung OneDrive, trong đó có file Database. Em đang muốn làm thế nào để người khác không thể chỉnh sửa dữ liệu từ 3 ngày trở về trước ạ. Như hình ảnh đính kèm là một ví dụ ạ:
Hôm nay là ngày 03/09, cách 3 ngày trở về trước tức là từ ngày 31/8 trở về trước là không được chỉnh sửa dữ liệu những ô bôi đỏ, còn cột H, I, J là được phép chỉnh sửa bất kì thời gian nào. Ngày hôm sau thì tịnh tiến 1 ngày và vẫn theo quy luật đó ạ

Em xin cảm ơn Anh/Chị đã giúp đỡ ạ
View attachment 294463
Nếu tôi hiểu đúng ý bạn thì Theo thiển ý của tôi thì :có thể dùng cách củ chuối là dùng code để khóa các ô theo điều kiện. Như trong bài bạn nêu thì sẽ khóa A6:G7, K6:O7 và chỉ có bạn có Pass thì mới mở ra và sửa được. ngày hôm sau, khóa thêm các dòng có ngày tương ứng ở cột D cộng thêm 1. đại loại là Khi mở file, code ở open_Workbook chạy: mở khóa các ô=> kiểm tra ngày hiện tại với ngày cuối cùng trong Sheet (dữ liệu), nếu ngày cuối cùng đó < ngày hiện tại -3 thì khóa từ dòng cuối đến dòng đầu. nếu ngày cuối +3 < ngày hiện tại thì tìm trong cột D có giá trị =ngày hiện tại -3 và lấy dòng cuối cùng của ngày đó (sử dụng tìm từ dưới lên). (ví dụ tìm thấy ngày 31/8 thỏa, thì dòng cuối cùng có ngày 31/8 là dòng 7) và code sẽ khóa từ dòng cuối vừa tìm được ấy đến dòng đầu của dữ liệu.
 
Upvote 0
Nếu tôi hiểu đúng ý bạn thì Theo thiển ý của tôi thì :có thể dùng cách củ chuối là dùng code để khóa các ô theo điều kiện. Như trong bài bạn nêu thì sẽ khóa A6:G7, K6:O7 và chỉ có bạn có Pass thì mới mở ra và sửa được. ngày hôm sau, khóa thêm các dòng có ngày tương ứng ở cột D cộng thêm 1. đại loại là Khi mở file, code ở open_Workbook chạy: mở khóa các ô=> kiểm tra ngày hiện tại với ngày cuối cùng trong Sheet (dữ liệu), nếu ngày cuối cùng đó < ngày hiện tại -3 thì khóa từ dòng cuối đến dòng đầu. nếu ngày cuối +3 < ngày hiện tại thì tìm trong cột D có giá trị =ngày hiện tại -3 và lấy dòng cuối cùng của ngày đó (sử dụng tìm từ dưới lên). (ví dụ tìm thấy ngày 31/8 thỏa, thì dòng cuối cùng có ngày 31/8 là dòng 7) và code sẽ khóa từ dòng cuối vừa tìm được ấy đến dòng đầu của dữ liệu.
Trước em cũng có ý tưởng đó, nhưng em mắc 1 chỗ là không sử dụng được chức năng "Filter" được anh ạ, mà bên em hay sử dụng chức năng "Filter" ạ. A có ý tưởng nào thêm không cho em xin với ạ. Em cảm ơn anh
 
Upvote 0
Trước em cũng có ý tưởng đó, nhưng em mắc 1 chỗ là không sử dụng được chức năng "Filter" được anh ạ, mà bên em hay sử dụng chức năng "Filter" ạ. A có ý tưởng nào thêm không cho em xin với ạ. Em cảm ơn anh
Nếu vậy viết code cho chức năng filter (để điều kiện filter vào trong 1 inputbox có thể 1, 2 hoặc nhiều điều kiện , cách nhau bằng dấu ";" hay dấu"," hay dấu "-"...), khi nhấn nút OK thì: chạy Sub mở khóa cell---> filter theo điều kiện----> chạy sub khóa.
Bạn biết VBA nhiều hơn tôi nhiều lần, tôi tin là bạn làm được.
chúc thành công.
 
Upvote 0
Trước em cũng có ý tưởng đó, nhưng em mắc 1 chỗ là không sử dụng được chức năng "Filter" được anh ạ, mà bên em hay sử dụng chức năng "Filter" ạ. A có ý tưởng nào thêm không cho em xin với ạ. Em cảm ơn anh

Nếu vậy viết code cho chức năng filter (để điều kiện filter vào trong 1 inputbox có thể 1, 2 hoặc nhiều điều kiện , cách nhau bằng dấu ";" hay dấu"," hay dấu "-"...), khi nhấn nút OK thì: chạy Sub mở khóa cell---> filter theo điều kiện----> chạy sub khóa.
Bạn biết VBA nhiều hơn tôi nhiều lần, tôi tin là bạn làm được.
chúc thành công.
Cảm ơn anh ạ, anh khiêm tốn chứ anh biết nhiều hơn em gấp trăm lần ấy ạ. Em là dân tuyển khoáng (tuyển tách khoáng sản), nhưng em lại có một đam mê lập trình ạ, nên em học mót trên mạng thêm ít nào đó thôi để thỏa mãn niểm đam mê thôi ạ, chứ em cũng không biết mấy đâu ạ.
Hiện tại em đang sử dụng chức năng là bấm chọn ô trong vùng không được phép thì tự động chọn sang ô trống luôn ạ (cái này em đã làm được vài ngày rồi), nhưng vừa rồi em bị phản hồi lại là không sử dụng được chức năng ẩn cột, ẩn dòng, và bất tiện khi không chọn được dữ liệu của các ngày cũ trước. Và em vừa viết thêm một chức năng nữa là copy toàn bộ dữ liệu sang file mới, và các bạn ấy tùy thích thao tác trên file mới đó ạ. Xem các bạn đó có gì phản hồi nữa không thì em lại tính bước nữa ạ, có gì khó khăn em lại viết lên đây để nhờ các anh giúp ạ

Code em như sau ạ:
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Len(ActiveCell) > 0 Then Application.CutCopyMode = False

If Sheet1.Name <> "RawData" Then
    Sheet1.Name = "RawData"
    MsgBox ("You can not change sheet name")
End If

Dim i1
Dim i
i1 = Cells(Rows.Count, 1).End(xlUp).Row
For i = i1 To 10 Step -1
    If Cells(i, 2).Value = Date - 3 Then Exit For
Next

If Target.Column <> 8 And Target.Column <> 23 And Target.Column <> 4 And Target.Column < 26 And Target.Row < i Then Cells(i1 + 1, 2).Select

End Sub

Mã:
Sub CopyToNewFile(control As IRibbonControl)
Sheet1.Select
Cells.Copy
Workbooks.Add
Range("A1").Select
ActiveSheet.Paste
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub

1693883892611.png
 
Upvote 0
Trước em cũng có ý tưởng đó, nhưng em mắc 1 chỗ là không sử dụng được chức năng "Filter" được anh ạ, mà bên em hay sử dụng chức năng "Filter" ạ. A có ý tưởng nào thêm không cho em xin với ạ. Em cảm ơn anh
Bấm chọn chức năng filter được hoạt động khi khóa sheet
 
Upvote 0
Chức năng Filter bị ẩn mờ khi khóa Sheet mà anh, chỉ có Advance Filter thôi ạ. Trường hợp của em không sử dụng Advance Filter ạ
'Viết Function này ra 1 Module
Function Nhanh(YoN As Boolean)
With Application
.ScreenUpdating = Not (YoN)
.EnableEvents = Not (YoN)
.DisplayAlerts = Not (YoN)
.Calculation = IIf(YoN, xlCalculationManual, xlCalculationAutomatic)
End With
End Function

'tại đầu mỗi sub thì
Nhanh True
On Error Resume Next
...
Nhanh False
End Sub
Chức năng Filter nên dùng thoải mái, Filter xong lỡ quên thì trả lại = lệnh ShowAllData, khóa làm gì
Không cho delete dòng thì dùng sự kiện Selection Change hoặc kèm điều kiện đại khái là
If Not Intersect(Target, Columns(1)) Is Nothing And Selection.Cells.Count > 255 Then Msgbox ...
 
Upvote 0
Web KT
Back
Top Bottom