Cảnh báo thay đổi dữ liệu và ghi tên ... của những lần thay đổi đó vào comment của ô

Liên hệ QC

Ng_Duy_Long

Thành viên mới
Tham gia
7/2/07
Bài viết
47
Được thích
24
Tôi có câu hỏi như sau: Làm thế nào chỉ cho nhập liệu vào ô trống, những ô đã có dữ liệu thì ko cho nhập. Nếu nhập vào ô đã có dữ liệu thì hiện lên thông báo, có muốn thay đổi dữ liệu ko đồng thời hiện lên 1 bảng có nội dung: ngày giờ thay đổi dữ liệu, lý do thay đổi dữ liệu, tên người thay đổi dữ liệu và bảng này được nhập vào comment của ô đó?
 
Cái này bạn làm theo nguyên tắc sau:
-Chọn toàn bộ cells và bỏ thuộc tính Locked
-Ctrl + G\Special\Constants, OK
-Ctrl + 1 và chọn thuộc tính Locked
vân vân và vân vân
Toàn bộ quá trình bạn thu lại thành 1 macro rồi xem lại code, chỉnh sửa cho hợp lý. Tiếp theo cải tiến và nâng cấp chương trình
Tóm lại vẫn bám vào Goto là chính
 
Upvote 0
, những ô đã có dữ liệu thì ko cho nhập.
: Câu này dư rồi!
Theo mình nghỉ, các bước sẽ phải, như sau:
1*/ Tìm xem ô đang & sẽ nhập đã có dữ liệu hay chưa;
Mình chưa biết cách nào khác hơn là bãy sự kiện Change cho dữ liệu ni vô biến Public khai báo ở module 1
Mã:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
     vLuu = Target.Value
End Sub
2*/ Ghi lại ngày giờ hiện hành. Còn lý do thì phải Người dùng đầu cuối tự giác nhập thôi
3*/ Gắn thêm hay đổi nội dung Comments của Target;
4*/ Hiện câu hỏi dạng Yes/No để thực thi đường hướng thích hợp.

Chúc bạn thành công!
 
Upvote 0
Tôi có câu hỏi như sau: Làm thế nào chỉ cho nhập liệu vào ô trống, những ô đã có dữ liệu thì ko cho nhập. Nếu nhập vào ô đã có dữ liệu thì hiện lên thông báo, có muốn thay đổi dữ liệu ko đồng thời hiện lên 1 bảng có nội dung: ngày giờ thay đổi dữ liệu, lý do thay đổi dữ liệu, tên người thay đổi dữ liệu và bảng này được nhập vào comment của ô đó?

Bác thử xem :

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub
    Dim ThongBao As String, Old As String
    ThongBao = "Vao luc " & Format(Now(), "hh:ss  dd/mm/yyyy") & Chr(10) & _
                "User : " & Application.UserName & Chr(10) & _
                "da chinh sua thanh :  " & Target.Value
    MsgBox ThongBao, vbInformation, "Canh Bao"
    
    Target.AddComment
    Old = Target.Comment.Text
    Target.Comment.Text Text:=ThongBao & Chr(10) & Old
End Sub
Thân!
 
Upvote 0
Bác thử xem :

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    If Target.Value = "" Then Exit Sub
    Dim ThongBao As String, Old As String
    ThongBao = "Vao luc " & Format(Now(), "hh:ss  dd/mm/yyyy") & Chr(10) & _
                "User : " & Application.UserName & Chr(10) & _
                "da chinh sua thanh :  " & Target.Value
    MsgBox ThongBao, vbInformation, "Canh Bao"
 
    Target.AddComment
    Old = Target.Comment.Text
    Target.Comment.Text Text:=ThongBao & Chr(10) & Old
End Sub
Thân!

Thế này chỉ ghi được User chỉnh sử cuối cùng thôi
Bác cho những User chỉnh sửa sau add thêm vào comment thì hay hơn và khóa luôn không cho delete hay chỉnh sửa comment thì mới có giá trị thực tế
 
Upvote 0
Cảm ơn các bác. Nhưng vẫn chưa đúng ý em. Khi nhập vào những ô trống không có dữ liệu vẫn hiện lên thông báo. Em muốn chỉ hiện lên thông báo của những ô đã có dữ liệu. Và dòng thông báo ghi vào comment là ghi tiếp vào chứ không phải ghi đè vào nội dung đã có trong comment (như cách của bác là xóa comment cũ và thêm comment mới)
 
Upvote 0
Cảm ơn các bác. Nhưng vẫn chưa đúng ý em. Khi nhập vào những ô trống không có dữ liệu vẫn hiện lên thông báo. Em muốn chỉ hiện lên thông báo của những ô đã có dữ liệu. Và dòng thông báo ghi vào comment là ghi tiếp vào chứ không phải ghi đè vào nội dung đã có trong comment (như cách của bác là xóa comment cũ và thêm comment mới)

Thật khó hiểu !!
Cách của tớ là ghi tiếp chứ không ghi đè, còn Boyxin lại đề nghị ghi đè !!??

Thử xem nhé :

PHP:
Option Explicit
Dim Old As String
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    'Stop
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    If Old = "" Then Exit Sub
    Dim ThongBao As String
    ThongBao = "Vao luc " & Format(Now(), "hh:ss  dd/mm/yyyy") & Chr(10) & _
                "User : " & Application.UserName & Chr(10) & _
                "da chinh sua thanh :  " & Target.Value
    MsgBox ThongBao, vbInformation, "Canh Bao"
    
    Target.AddComment
    Old = Target.Comment.Text
    Target.Comment.Text Text:=ThongBao & Chr(10) & Old
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    Old = Target.Value
End Sub

Thân!
 

File đính kèm

Upvote 0
Thế này chỉ ghi được User chỉnh sử cuối cùng thôi
Bác cho những User chỉnh sửa sau add thêm vào comment thì hay hơn và khóa luôn không cho delete hay chỉnh sửa comment thì mới có giá trị thực tế
bác xem lại phần em tô mà đỏ, sao nói rằng ghi đè
Thật khó hiểu !!
Cách của tớ là ghi tiếp chứ không ghi đè, còn Boyxin lại đề nghị ghi đè !!??
Thân!

ý em là có 2 phương án:
  1. Không cho sửa số liệu trong cell mà hiện thông báo và add thêm vào comment User chỉnh sửa (tính bảo vệ và phát hiện trojan cao)
  2. Vẫn cho ghi đè lên dữ liệu trong cell nhưng sẽ add thêm vào comment User chỉnh sửa (tính bảo vệ và xác nhận dữ liệu có hệ thống - như câu các cụ nhà ta vẫn nói: "Tre có chỗ chẻ")
  3. công đoạn sau của 2 phương án trên là: khóa luôn không cho delete hay chỉnh sửa comment
 
Upvote 0
bác xem lại phần em tô mà đỏ, sao nói rằng ghi đè


ý em là có 2 phương án:
  1. Không cho sửa số liệu trong cell mà hiện thông báo và add thêm vào comment User chỉnh sửa (tính bảo vệ và phát hiện trojan cao)
  2. Vẫn cho ghi đè lên dữ liệu trong cell nhưng sẽ add thêm vào comment User chỉnh sửa (tính bảo vệ và xác nhận dữ liệu có hệ thống - như câu các cụ nhà ta vẫn nói: "Tre có chỗ chẻ")
  3. công đoạn sau của 2 phương án trên là: khóa luôn không cho delete hay chỉnh sửa comment

Ok, là do mình nhìn nhầm câu trên :
Thế này chỉ ghi được User chỉnh sử cuối cùng thôi
Bác cho những User chỉnh sửa sau add thêm vào comment thì hay hơn và khóa luôn không cho delete hay chỉnh sửa comment thì mới có giá trị thực tế
  • Thực ra cách của tớ đã là ghi tiếp rồi, chứ không đè lên phần cũ!
  • Việc ra phương án thế nào thì tùy các bạn, mìmh chỉ là gợi ý thôi. Vì vậy đừng quan trọng là sẽ giải đáp hết vấn đề mà quan trọng là có mở ra được hướng giải quyết nào không .
Thân!
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu có thể, Mr Okebab thêm một chút nữa để
  1. khung comment cố định chỉ hiện thị nội dung 3 dòng
    1. Vao luc ..........
    2. User : ............
    3. da chinh sua thanh : .........
  2. Khóa cứng comment lại không cho chỉnh sửa, xóa comment
  3. Thêm 1 macro (gán cho 1 nút hay 1 vị trí nào đó) thực hiện công việc list các comment trong các cell đã bị chỉnh sửa tương ứng với địa chỉ của cell đó ra 1 sheet mới
Thêm được 3 yêu cầu trên thì theo mình, file
rar.gif
Comment.rar được coi là 1 sản phẩm hoàn chỉnh về vấn đề này
 
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Nếu có thể, Mr Okebab thêm một chút nữa để
  1. khung comment cố định chỉ hiện thị nội dung 3 dòng
  2. Khóa cứng comment lại không cho chỉnh sửa, xóa comment
  3. Thêm 1 macro (gán cho 1 nút hay 1 vị trí nào đó) thực hiện công việc list các comment trong các cell đã bị chỉnh sửa tương ứng với địa chỉ của cell đó ra 1 sheet mới
Thêm được 3 yêu cầu trên thì theo mình, file
rar.gif
Comment.rar được coi là 1 sản phẩm hoàn chỉnh về vấn đề này

1 . Có thể được

2. Mình chưa biết cách khóa Comment
3. Có thể được


Tại Sheet:

PHP:
Option Explicit
Dim Old As String
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    If Old = "" Then Exit Sub
    Dim ThongBao As String
    ThongBao = "Vao luc " & Format(Now(), "hh:ss  dd/mm/yyyy") & Chr(10) & _
                "User : " & Application.UserName & Chr(10) & _
                "da chinh sua " & Old & " thanh :  " & Target.Value
    MsgBox ThongBao, vbInformation, "Canh Bao"
    
    Target.AddComment
    Call HistoryCell(Target.Address & " : " & ThongBao)
    Old = Target.Comment.Text
   
    Target.Comment.Text Text:=ThongBao
End Sub
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    Old = Target.Value
End Sub


Tại Module :
PHP:
Option Explicit
Sub HistoryCell(Comm As String)
    On Error Resume Next
    Dim HC As Long, i As Long
    For i = 1 To 255
        HC = S02.Cells(65000, i).End(xlUp).Row
        If HC < 65000 Then
            S02.Cells(HC + 1, i).Value = Comm
            Exit Sub
        End If
    Next
End Sub



Thân!
 

File đính kèm

Upvote 0
Hiiiiiiii
Có 1 sự cố: khi chỉnh sửa dữ liệu bằng cách kéo fill (copy đè dữ liệu bằng cách kéo fill) thì đã vô hiệu toàn bộ công sức
VD: tại A1 nhập số 0 -> chọn A1 kéo fill hết cột H -> chọn vùng A1:H1 kéo fill xuống hết dòng 23 -> xem kết quả
 
Upvote 0
Hiiiiiiii
Có 1 sự cố: khi chỉnh sửa dữ liệu bằng cách kéo fill (copy đè dữ liệu bằng cách kéo fill) thì đã vô hiệu toàn bộ công sức
VD: tại A1 nhập số 0 -> chọn A1 kéo fill hết cột H -> chọn vùng A1:H1 kéo fill xuống hết dòng 23 -> xem kết quả

Bạn hãy đọc kỹ : đây chỉ là bẫy lỗi thôi:

PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Target.Columns.Count > 1 Then Exit Sub
    If Target.Rows.Count > 1 Then Exit Sub
    Old = Target.Value
End Sub

Để đảm bảo vùng chọn chỉ là 1 ô.

Còn nếu nhiều ô thì phải chạy vòng lặp để xét từng ô trong vùng được chọn.

Bạn thử đi, bạn làm được mà.

Thân!
 
Upvote 0
Ko bác nào giúp em ý đầu tiên à: "Khi nhập vào những ô trống không có dữ liệu vẫn hiện lên thông báo. Em muốn chỉ hiện lên thông báo của những ô đã có dữ liệu"
 
Upvote 0
Tôi có câu hỏi như sau: Làm thế nào chỉ cho nhập liệu vào ô trống, những ô đã có dữ liệu thì ko cho nhập. Nếu nhập vào ô đã có dữ liệu thì hiện lên thông báo, có muốn thay đổi dữ liệu ko đồng thời hiện lên 1 bảng có nội dung: ngày giờ thay đổi dữ liệu, lý do thay đổi dữ liệu, tên người thay đổi dữ liệu và bảng này được nhập vào comment của ô đó?

Lười quá nhỉ : Phân kịch bản nhé :

  • Dùng sự kiện Change Selection để ghi lại giá trị của ô vừa được chọn (biến toàn cục)
  • Bẫy lỗi để chỉ được phép chọn 1 ô
  • Dùng sự kiện Change để xét sự thay đổi
  • Nếu là ô trống : .Value = "" thì cho qua luôn, khỏi hỏi làm gì
  • Nếu ô có dữ liệu :Lôi chú Msgbox ra hỏi : Đã có dữ liệu, có muốn thay đổi không ????
  • Nếu Không thì lấy ngay lại giá trị cũ (biến toàn cục)
  • Nếu có thì nắm đầu chú Inputbox ra hỏi : Lý do nào mà lại định thay đổi
  • Hiện ra thông báo có đầy đủ nội dung trên
  • Ghi thông báo vào Comment (Chú ý xem ô đó đã có comment chưa ???)
Đã được chưa vậy đồng chí ?? (VD trên đã làm gần hết rồi)


Thân!
 
Upvote 0
Web KT

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

Back
Top Bottom