Thêm dữ liệu vào ô khi thay đổi dữ liệu trên một ô trên cùng một sheet

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

test1986

Thành viên mới
Tham gia
19/10/22
Bài viết
48
Được thích
11
Em thường xuyên cập nhật dữ liệu của người dùng máy tính.
Khi người dùng hư hỏng máy tính và được thay mới thì em sẽ thay đổi tên máy tính ở ô C(i) và Alt+enter để cập nhật thêm nội dung ở ô K(i) (gồm thời gian diễn ra việc thay máy tính và tên máy tính cũ bị thay thế). Ngoài ra, còn nhiều lý do cần phải cập nhật ô C(i) mà em không liệt kê. Mà file gốc thì rất nhiều dòng cột nên khả năng quên nhập ô cuối này khá thường xuyên.
Em đang định viết code để thay thế em tự cập nhật dữ liệu ở ô K(i) nhưng chưa tìm được phương hướng để thực hiện.
Em muốn hỏi anh chị là ý định này có khả thi thực hiện không? Và nếu có thể thực hiện được thì mong các anh chị chỉ cho em cái hướng để em có thể tự mình nguyên cứu và viết code áp dụng cho công việc của em ạ.
Em cảm ơn.
 

File đính kèm

  • nhatkymaytinh.xlsx
    9.9 KB · Đọc: 7
Nếu mình hiểu không sai thì bạn muốn lưu trữ cái lịch sử thay đổi của cột C vào cột K
Như vậy bạn cần cái event worksheet_Change để kích hoạt code mỗi khi cột C thay đổi.
Bạn paste code này vào worksheet module (không phải general module nhé)
(Right click trên tên sheet, vào View Code, sau đó paste code vào)
PHP:
Option Explicit

'code nay kich hoat moi khi co su cap nhat trong cot C, tu dong 3 tro di
Private Sub Worksheet_Change(ByVal Target As Range)
Dim OldV As String, NewV As String
If Target.Count > 1 Or Target.Column <> 3 Or Target.Row < 3 Then Exit Sub
With Application
    .EnableEvents = False ' tat cap nhat
    NewV = Target ' luu tru gia tri moi nhap
    .Undo ' Undo tro ve gia tri cu
    OldV = Target 'luu gia tri cu
    Target = NewV ' Gan gia tri moi nhap tro lai
    .EnableEvents = True ' mo cap nhat
End With
' Noi chuoi cot K voi gia tri cu (OldV)
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & OldV
End Sub
 

File đính kèm

  • nhatkymaytinh.xlsm
    15.7 KB · Đọc: 5
Upvote 0
Em thường xuyên cập nhật dữ liệu của người dùng máy tính.
Khi người dùng hư hỏng máy tính và được thay mới thì em sẽ thay đổi tên máy tính ở ô C(i) và Alt+enter để cập nhật thêm nội dung ở ô K(i) (gồm thời gian diễn ra việc thay máy tính và tên máy tính cũ bị thay thế). Ngoài ra, còn nhiều lý do cần phải cập nhật ô C(i) mà em không liệt kê. Mà file gốc thì rất nhiều dòng cột nên khả năng quên nhập ô cuối này khá thường xuyên.
Em đang định viết code để thay thế em tự cập nhật dữ liệu ở ô K(i) nhưng chưa tìm được phương hướng để thực hiện.
Em muốn hỏi anh chị là ý định này có khả thi thực hiện không? Và nếu có thể thực hiện được thì mong các anh chị chỉ cho em cái hướng để em có thể tự mình nguyên cứu và viết code áp dụng cho công việc của em ạ.
Em cảm ơn.
Nếu đúng là thay đổi Ci và ghi lại sự thay đổi đó và Ki (khi ấy Ki sẽ = Ki & Date & Ci ) thì bạn có thể dùng code bắt sự kiện ở cột C( C2:Cxxxx) xem sao.
Private Sub Worksheet_......
If Not.....
If......
........
End If
End If
End Sub
 
Upvote 0
Nếu mình hiểu không sai thì bạn muốn lưu trữ cái lịch sử thay đổi của cột C vào cột K
Như vậy bạn cần cái event worksheet_Change để kích hoạt code mỗi khi cột C thay đổi.
Bạn paste code này vào worksheet module (không phải general module nhé)
(Right click trên tên sheet, vào View Code, sau đó paste code vào)
PHP:
Option Explicit

'code nay kich hoat moi khi co su cap nhat trong cot C, tu dong 3 tro di
Private Sub Worksheet_Change(ByVal Target As Range)
Dim OldV As String, NewV As String
If Target.Count > 1 Or Target.Column <> 3 Or Target.Row < 3 Then Exit Sub
With Application
    .EnableEvents = False ' tat cap nhat
    NewV = Target ' luu tru gia tri moi nhap
    .Undo ' Undo tro ve gia tri cu
    OldV = Target 'luu gia tri cu
    Target = NewV ' Gan gia tri moi nhap tro lai
    .EnableEvents = True ' mo cap nhat
End With
' Noi chuoi cot K voi gia tri cu (OldV)
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & OldV
End Sub
Em cảm ơn anh @bebo021999 nhiều. Anh diễn giải rất chi tiết nên em hiểu hết được ý nghĩa đoạn code và có thể thử thực hiện áp dụng lên file gốc của em rồi.
 
Upvote 0
Option Explicit

'code nay kich hoat moi khi co su cap nhat trong cot C, tu dong 3 tro di
Private Sub Worksheet_Change(ByVal Target As Range)
Dim OldV As String, NewV As String
'If Target.Count > 1 Or Target.Column <> 3 Or Target.Row < 3 Then Exit Sub
If Target.Count > 1 Or Target.Row < 3 Then Exit Sub
Select Case Target.Column
Case 3, 4 'cot 3 va cot 4
With Application
.EnableEvents = False ' tat cap nhat
NewV = Target ' luu tru gia tri moi nhap
.Undo ' Undo tro ve gia tri cu
OldV = Target 'luu gia tri cu
Target = NewV ' Gan gia tri moi nhap tro lai
.EnableEvents = True ' mo cap nhat
If OldV = NewV Then Exit Sub 'loc trung
End With
' Noi chuoi cot K voi gia tri cu (OldV)
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & " " & OldV '& Cells(Target.Row, "E").Value
Case Else:
End Select
End Sub
Em thử nghiệm chỉnh sửa đoạn code như trên thì đã loại bỏ được trường hợp chưa chỉnh sửa cột C(i) đã nhấn Enter nhưng vẫn cập nhật vào cột K(i) và cập nhật được thay đổi cột C(i) và D(i) vào cột K(i).
Hiện tại, em đang suy nghĩ thay đổi câu lệnh If để khi C(i) thay đổi thì thực hiện:
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & " " & OldV
Và nếu D(i) thay đổi thì thực hiện:
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & " " & OldV &" " & Cells(Target.Row, "E").Value
Anh @bebo021999 có thể cho em thêm chút gợi ý ở chỗ này được không ạ?
Em cảm ơn ạ.
 
Upvote 0
Vậy là bạn muốn code chạy khi cột C HOẶC D thay đổi?
Khi đó điều kiện Exit Sub này
PHP:
If Target.Count > 1 Or Target.Column <> 3 Or Target.Row < 3 Then Exit Sub
sẽ trở thành
PHP:
If Target.Count > 1 Or Target.Row < 3 Or (target.column<>3 AND target.column<>4) Then Exit Sub
Đồng thời phần kết quả sẽ rẽ nhánh với IF ở phần cuối:
PHP:
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & " " & OldV & IIF(target.column=3,"",  " " & Cells(Target.Row, "E").Value)
 
Upvote 0
Vậy là bạn muốn code chạy khi cột C HOẶC D thay đổi?
Khi đó điều kiện Exit Sub này
PHP:
If Target.Count > 1 Or Target.Column <> 3 Or Target.Row < 3 Then Exit Sub
sẽ trở thành
PHP:
If Target.Count > 1 Or Target.Row < 3 Or (target.column<>3 AND target.column<>4) Then Exit Sub
Đồng thời phần kết quả sẽ rẽ nhánh với IF ở phần cuối:
PHP:
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & " " & OldV & IIF(target.column=3,"",  " " & Cells(Target.Row, "E").Value)
Dạ em thực hiện code chạy khi thay đổi ở cột C và cột D bằng dòng lệnh và hoạt động ổn rồi anh
If Target.Count > 1 Or Target.Row < 3 Then Exit Sub
Select Case Target.Column
Case 3, 4
Em đang cần đoạn IIF anh vừa hướng dẫn đó ạ.
Em cảm ơn anh nhiều.
 
Upvote 0
Nếu mình hiểu không sai thì bạn muốn lưu trữ cái lịch sử thay đổi của cột C vào cột K
Như vậy bạn cần cái event worksheet_Change để kích hoạt code mỗi khi cột C thay đổi.
Bạn paste code này vào worksheet module (không phải general module nhé)
(Right click trên tên sheet, vào View Code, sau đó paste code vào)
PHP:
Option Explicit

'code nay kich hoat moi khi co su cap nhat trong cot C, tu dong 3 tro di
Private Sub Worksheet_Change(ByVal Target As Range)
Dim OldV As String, NewV As String
If Target.Count > 1 Or Target.Column <> 3 Or Target.Row < 3 Then Exit Sub
With Application
    .EnableEvents = False ' tat cap nhat
    NewV = Target ' luu tru gia tri moi nhap
    .Undo ' Undo tro ve gia tri cu
    OldV = Target 'luu gia tri cu
    Target = NewV ' Gan gia tri moi nhap tro lai
    .EnableEvents = True ' mo cap nhat
End With
' Noi chuoi cot K voi gia tri cu (OldV)
If OldV <> "" Then Cells(Target.Row, "K").Value = Cells(Target.Row, "K").Value & vbLf & Format(Now, "dd/mm/yyyy:") & OldV
End Sub
Em đang gặp chút vấn đề như sau ạ:
1/ Nếu em cập nhật trực tiếp ở trên file excel thì kết quả cập nhật ở cột K hoạt động bình thường
2/ Nếu em cật nhật cột C và D thông qua userform thì cột K không cập nhật lịch sử thay đổi được với thông báo lỗi ở dòng
.Undo ' Undo tro ve gia tri cu
Em chưa hiểu được nguyên nhân của lỗi này. Mong anh @bebo021999 và anh @HUONGHCKT có thể cho em biết được nguyên nhân gây lỗi không ạ?
Em cảm ơn.
 
Upvote 0
Change event chỉ được kích hoạt khi và chỉ khi có hành động manual input (nhập tay từ bàn phím) mà thôi
Nếu ô thay đổi giá trị từ công thức hoặc từ userform thì không áp dụng được.
Trường hợp như bạn nhập từ Userform, thì bạn tích hợp code vào cái userform đó luôn, không cần bắt sự kiện thay đổi trên sheet làm chi
 
Upvote 0
Change event chỉ được kích hoạt khi và chỉ khi có hành động manual input (nhập tay từ bàn phím) mà thôi
Nếu ô thay đổi giá trị từ công thức hoặc từ userform thì không áp dụng được.
Trường hợp như bạn nhập từ Userform, thì bạn tích hợp code vào cái userform đó luôn, không cần bắt sự kiện thay đổi trên sheet làm chi
Dạ em cảm ơn anh.
Em sẽ nguyên cứu lại về tích hợp code vào userform anh ạ, vì trong userform là em cập nhật theo Array giờ thêm một cột cập nhật lịch sử thay đổi vào thì vượt quá khả năng mày mò mấy hôm nay của em rồi.
 
Upvote 0
Web KT

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

Back
Top Bottom