Note: The other languages of the website are Google-translated. Back to English

Làm cách nào để nhớ hoặc lưu giá trị ô trước đó của một ô đã thay đổi trong Excel?

Thông thường, khi cập nhật ô có nội dung mới, giá trị trước đó sẽ bị che trừ khi hoàn tác thao tác trong Excel. Tuy nhiên, nếu bạn muốn giữ giá trị trước đó để so sánh với giá trị đã cập nhật, lưu giá trị ô trước đó vào một ô khác hoặc vào nhận xét ô sẽ là một lựa chọn tốt. Phương pháp trong bài viết này sẽ giúp bạn đạt được điều đó.

Lưu giá trị ô trước đó bằng mã VBA trong Excel


Lưu giá trị ô trước đó bằng mã VBA trong Excel

Giả sử bạn có một bảng như ảnh chụp màn hình bên dưới. Nếu bất kỳ ô nào trong cột C thay đổi, bạn muốn lưu giá trị trước đó của nó vào ô tương ứng của cột G hoặc tự động lưu trong nhận xét. Hãy làm như sau để đạt được nó.

1. Trong trang tính có chứa giá trị bạn sẽ lưu khi cập nhật, hãy nhấp chuột phải vào tab trang tính và chọn Mã Chế độ xem từ menu chuột phải. Xem ảnh chụp màn hình:

2. Trong phần mở đầu Microsoft Visual Basic cho các ứng dụng cửa sổ, sao chép mã VBA bên dưới vào cửa sổ Mã.

Mã VBA sau đây giúp bạn lưu giá trị ô trước đó của cột được chỉ định vào một cột khác.

Mã VBA: Lưu giá trị ô trước đó vào một ô cột khác

Dim xRg As Range
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long
    Dim xCell As Range
    Dim xDCell As Range
    Dim xHeader As String
    Dim xCommText As String
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    xHeader = "Previous value :"
    x = xDic.Keys
    For I = 0 To UBound(xDic.Keys)
        Set xCell = Range(xDic.Keys(I))
        Set xDCell = Cells(xCell.Row, 7)
        xDCell.Value = ""
        xDCell.Value = xDic.Items(I)
    Next
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim I, J As Long
    Dim xRgArea As Range
    On Error GoTo Label1
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Set xDependRg = Target.Dependents
    If xDependRg Is Nothing Then GoTo Label1
    If Not xDependRg Is Nothing Then
        Set xDependRg = Intersect(xDependRg, Range("C:C"))
    End If
Label1:
    Set xRg = Intersect(Target, Range("C:C"))
    If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
        Set xChangeRg = Union(xRg, xDependRg)
    ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
        Set xChangeRg = xDependRg
    ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
        Set xChangeRg = xRg
    Else
        Application.EnableEvents = True
        Exit Sub
    End If
    xDic.RemoveAll
    For I = 1 To xChangeRg.Areas.Count
        Set xRgArea = xChangeRg.Areas(I)
        For J = 1 To xRgArea.Count
            xDic.Add xRgArea(J).Address, xRgArea(J).Formula
        Next
    Next
    Set xChangeRg = Nothing
    Set xRg = Nothing
    Set xDependRg = Nothing
    Application.EnableEvents = True
End Sub

Để lưu giá trị ô trước đó trong nhận xét, vui lòng áp dụng mã VBA bên dưới

Mã VBA: Lưu giá trị ô trước đó trong nhận xét

Dim xRg As Range
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long
    Dim xCell As Range
    Dim xHeader As String
    Dim xCommText As String
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    xHeader = "Previous value :"
    For I = 0 To UBound(xDic.Keys)
        Set xCell = Range(xDic.Keys(I))
        If Not xCell.Comment Is Nothing Then xCell.Comment.Delete
        With xCell
            .AddComment
            .Comment.Visible = False
            .Comment.Text xHeader & vbCrLf & xDic.Items(I)
        End With
    Next
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim I, J As Long
    Dim xRgArea As Range
    On Error GoTo Label1
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Set xDependRg = Target.Dependents
    If xDependRg Is Nothing Then GoTo Label1
    If Not xDependRg Is Nothing Then
        Set xDependRg = Intersect(xDependRg, Range("C:C"))
    End If
Label1:
    Set xRg = Intersect(Target, Range("C:C"))
    If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
        Set xChangeRg = Union(xRg, xDependRg)
    ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
        Set xChangeRg = xDependRg
    ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
        Set xChangeRg = xRg
    Else
        Application.EnableEvents = True
        Exit Sub
    End If
    xDic.RemoveAll
    For I = 1 To xChangeRg.Areas.Count
        Set xRgArea = xChangeRg.Areas(I)
        For J = 1 To xRgArea.Count
            xDic.Add xRgArea(J).Address, xRgArea(J).Text
        Next
    Next
    Set xChangeRg = Nothing
    Set xRg = Nothing
    Set xDependRg = Nothing
    Application.EnableEvents = True
End Sub

Chú thích: Trong mã, số 7 cho biết cột G bạn sẽ lưu ô trước đó vào và C: C là cột bạn sẽ lưu giá trị ô trước đó. Vui lòng thay đổi chúng dựa trên nhu cầu của bạn.

3. nhấp chuột CÔNG CỤ > dự án để mở Giới thiệu - VBAProject hộp thoại, kiểm tra Thời gian chạy tập lệnh của Microsoft và cuối cùng nhấp vào OK cái nút. Xem ảnh chụp màn hình:

4. Nhấn nút Khác + Q chìa khóa để đóng Microsoft Visual Basic cho các ứng dụng cửa sổ.

Kể từ bây giờ, khi giá trị ô trong cột C được cập nhật, giá trị trước đó của ô sẽ được lưu vào các ô tương ứng trong cột G hoặc lưu trong nhận xét như ảnh chụp màn hình bên dưới.

Lưu các giá trị ô trước đó trong các ô khác:

Lưu các giá trị ô trước đó trong nhận xét:


Các công cụ năng suất văn phòng tốt nhất

Kutools cho Excel giải quyết hầu hết các vấn đề của bạn và tăng 80% năng suất của bạn

  • Tái sử dụng: Chèn nhanh công thức phức tạp, biểu đồ và bất cứ thứ gì bạn đã sử dụng trước đây; Mã hóa ô với mật khẩu; Tạo danh sách gửi thư và gửi email ...
  • Thanh siêu công thức (dễ dàng chỉnh sửa nhiều dòng văn bản và công thức); Bố cục đọc (dễ dàng đọc và chỉnh sửa số lượng ô lớn); Dán vào Dải ô đã Lọchữu ích. Cảm ơn !
  • Hợp nhất các ô / hàng / cột mà không làm mất dữ liệu; Nội dung phân chia ô; Kết hợp các hàng / cột trùng lặp... Ngăn chặn các ô trùng lặp; So sánh các dãyhữu ích. Cảm ơn !
  • Chọn trùng lặp hoặc duy nhất Hàng; Chọn hàng trống (tất cả các ô đều trống); Tìm siêu và Tìm mờ trong Nhiều Sổ làm việc; Chọn ngẫu nhiên ...
  • Bản sao chính xác Nhiều ô mà không thay đổi tham chiếu công thức; Tự động tạo tài liệu tham khảo sang Nhiều Trang tính; Chèn Bullets, Hộp kiểm và hơn thế nữa ...
  • Trích xuất văn bản, Thêm Văn bản, Xóa theo Vị trí, Xóa không gian; Tạo và In Tổng số phân trang; Chuyển đổi giữa nội dung ô và nhận xéthữu ích. Cảm ơn !
  • Siêu lọc (lưu và áp dụng các lược đồ lọc cho các trang tính khác); Sắp xếp nâng cao theo tháng / tuần / ngày, tần suất và hơn thế nữa; Bộ lọc đặc biệt bằng cách in đậm, in nghiêng ...
  • Kết hợp Workbook và WorkSheets; Hợp nhất các bảng dựa trên các cột chính; Chia dữ liệu thành nhiều trang tính; Chuyển đổi hàng loạt xls, xlsx và PDFhữu ích. Cảm ơn !
  • Hơn 300 tính năng mạnh mẽ. Hỗ trợ Office / Excel 2007-2021 và 365. Hỗ trợ tất cả các ngôn ngữ. Dễ dàng triển khai trong doanh nghiệp hoặc tổ chức của bạn. Đầy đủ tính năng Dùng thử miễn phí 30 ngày. Bảo đảm hoàn lại tiền trong 60 ngày.
tab kte 201905

Tab Office mang lại giao diện Tab cho Office và giúp công việc của bạn trở nên dễ dàng hơn nhiều

  • Cho phép chỉnh sửa và đọc theo thẻ trong Word, Excel, PowerPoint, Publisher, Access, Visio và Project.
  • Mở và tạo nhiều tài liệu trong các tab mới của cùng một cửa sổ, thay vì trong các cửa sổ mới.
  • Tăng 50% năng suất của bạn và giảm hàng trăm cú nhấp chuột cho bạn mỗi ngày!
officetab dưới cùng
Nhận xét (20)
Chưa có xếp hạng. Hãy là người đầu tiên xếp hạng!
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
tôi cần một cái gì đó như thế này, nhưng chỉ trong các ô cụ thể (ví dụ: G12 để hiển thị trong H23 giá trị cũ)
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Và khác ... Tôi cần chạy điều này khi một ô thay đổi bởi một kết quả (Ví dụ: A1 + B1 = C1 ... nếu tôi thay đổi giá trị A hoặc B, tập lệnh không hoạt động - không có gì xảy ra trong ô G)
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Xin chào ! Tôi chỉ muốn biết liệu có thể đăng ký thay đổi bội số đối với ô hay không, ý tôi là, nếu tôi đặt dữ liệu vào ô C2 và sau đó tôi thay đổi dữ liệu đó cho thông tin khác, thì dữ liệu trước đó sẽ chuyển đến ô G2 (như trong bài đăng này ), nhưng Nếu tôi thay đổi giá trị một lần nữa trong ô C2, thì thay đổi thứ hai mà tôi đã thực hiện sẽ chuyển sang ô H2 (ví dụ:) và bây giờ tôi đã đăng ký thông tin của 3 chuyển động mà tôi đã nhận ra và thực hiện gần 5 lần. hơn (lưu giá trị ô trước đó 5 lần). Nếu bạn có thể giúp tôi, tôi sẽ đánh giá rất cao vì đây trong bài đăng của bạn, đây là nơi duy nhất mà tôi tìm thấy nơi giải quyết vấn đề của tôi một phần. Cảm ơn vì đã chia sẻ nội dung này !!!!
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
bạn đã tìm thấy cách để làm điều này?
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Tôi đang suy nghĩ về một câu "Nếu / khác" nhưng tôi mới sử dụng VBA, vì vậy nếu bạn có bài viết khác có thể giúp tôi, hãy chia sẻ với tôi và một lần nữa cảm ơn bạn! tiếp tục chia sẻ kiến ​​thức
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Tại sao mã trên không hoạt động đối với dữ liệu DDE, tôi có một dữ liệu trong một cột đang thay đổi qua dde, nhưng thời điểm tôi áp dụng mã này để lưu giá trị trước đó của cột đó vào một cột khác, nó không làm được gì cả;

Bất kỳ sự giúp đỡ nào để đạt được điều này đều được đánh giá cao.
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Hi!

Chức năng tuyệt vời nhưng làm thế nào nó có thể được sửa đổi để hoạt động với ô tôi muốn ghi nhớ giá trị chứa hàm VLOOKUP? Rất tiếc, tôi không thể tìm thấy những gì cần sửa đổi để lưu giá trị từ VLOOKUP. Vì nó không hoạt động khi hàm VLOOKUP ở giữa :(

Cảm ơn trước sự giúp đỡ của bạn !
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Xin chào, bạn đã sửa đổi mã "Mã VBA: Lưu giá trị ô trước đó vào một ô cột khác", tuy nhiên, tôi có một số câu hỏi:

1. Làm thế nào để mã biết cột nào có các giá trị mới? (mà sau khi cập nhật khác sẽ có các giá trị của nó trong cột khác)
2. Làm thế nào bạn có thể biến nó thành Macro? Hoặc làm cho nó chạy tự động khi một chương trình khác gọi xlsm. tập tin?

Cảm ơn
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Đây là cho một giá trị ô, nhưng làm thế nào để lưu trữ và cập nhật dữ liệu 4 ô như thế này, ví dụ dữ liệu ô C, D, E, F vào ô G, H, I, J tương ứng, làm thế nào có thể làm Hãy giúp tôi
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Nếu ô tôi muốn lưu là một công thức, thì ô G sẽ chỉ lưu công thức và tính giá trị. Tôi cần lưu giá trị - không phải công thức. Làm thế nào tôi có thể nói với mã VBA, rằng giá trị thay đổi mặc dù công thức không được thay đổi. Trân trọng Flemming
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Có cách nào để lặp lại điều này cho tất cả các thay đổi không? Tôi muốn Hộp bình luận hiển thị tất cả các mục trước đó nếu có thể.
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Chào Jennie! Bạn đã quản lý để giải quyết vấn đề này? Tôi cũng đang cố gắng thu thập tất cả các mục mới trong hộp nhận xét, nhưng tôi gặp khó khăn trong việc điều chỉnh mã VBA cho phù hợp. Cảm ơn bạn!
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Thật tốt nếu bạn nhập vào. Bạn có thể giúp tôi cách xử lý nó khi dữ liệu được nhập bằng cách sử dụng giá trị của hàm từ DDE (Trao đổi dữ liệu động) không?
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Chào,
Xin lỗi, tôi không thể giải quyết vấn đề này. Tôi khuyên bạn nên đăng sự cố lên diễn đàn bên dưới để nhận được sự trợ giúp từ những người đam mê Excel khác.
https://www.extendoffice.com/forum/kutools-for-excel.html
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
cho e hỏi một chút có cách nào để khi tính toán xong tính toán không thì nó sẽ lưu lại giá trị khi tính toán xong không ạ.
ví dụ:
Giá trị ở cột A = cột B + cột C
Khi tính toán xong cột A sẽ lưu giá trị sau khi tính toán xong, lần tiếp theo tính toán thì cột A sẽ lấy giá trị hiện tại để tính toán tiếp theo chứ không lấy ban đầu trị giá đâu ạ.
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Chào bạn Trung,
Mã đã được cập nhật. Hãy thử một lần. Cảm ơn phản hồi của bạn.
Trong đoạn mã sau, số 5 trong dòng này Đặt xDCell = Cells (xCell.Row, 5) đại diện cho cột E nơi bạn sẽ đặt giá trị trước đó. A: A tham chiếu đến các ô trong cột A. Bạn cần lưu các giá trị trước đó của các ô này.

Dim xRg As Range
'Updated by Extendoffice 20220803
Dim xChangeRg As Range
Dim xDependRg As Range
Dim xDic As New Dictionary
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim I As Long
    Dim xCell As Range
    Dim xDCell As Range
    Dim xHeader As String
    Dim xCommText As String
    Dim X
    On Error Resume Next
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    xHeader = "Previous value :"
    X = xDic.Keys
    For I = 0 To UBound(xDic.Keys)
        Set xCell = Range(xDic.Keys(I))
        Set xDCell = Cells(xCell.Row, 5)
        
        xDCell.NumberFormatLocal = xCell.NumberFormatLocal
        xDCell.Value = xDic.Items(I)
        
    Next
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim I, J As Long
    Dim xRgArea As Range
    On Error GoTo Label1
    If Target.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    Set xDependRg = Target.Dependents
    If xDependRg Is Nothing Then GoTo Label1
    If Not xDependRg Is Nothing Then
        Set xDependRg = Intersect(xDependRg, Range("A:A"))
    End If
Label1:
    Set xRg = Intersect(Target, Range("A:A"))
    If (Not xRg Is Nothing) And (Not xDependRg Is Nothing) Then
        Set xChangeRg = Union(xRg, xDependRg)
    ElseIf (xRg Is Nothing) And (Not xDependRg Is Nothing) Then
        Set xChangeRg = xDependRg
    ElseIf (Not xRg Is Nothing) And (xDependRg Is Nothing) Then
        Set xChangeRg = xRg
    Else
        Application.EnableEvents = True
        Exit Sub
    End If
    xDic.RemoveAll
    For I = 1 To xChangeRg.Areas.Count
        Set xRgArea = xChangeRg.Areas(I)
        For J = 1 To xRgArea.Count
            xDic.Add xRgArea(J).Address, xRgArea(J).Text ' xRgArea(J).Formula
        Next
    Next
    Set xChangeRg = Nothing
    Set xRg = Nothing
    Set xDependRg = Nothing
    Application.EnableEvents = True
End Sub
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
chỉ hoạt động khi nhập dữ liệu theo cách thủ công
nhưng không hoạt động khi dữ liệu được làm mới từ một trang web
xin vui lòng giúp đỡ
cảm ơn
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
lưu dữ liệu trước đó khi nhập thủ công nhưng không hoạt động khi dữ liệu được làm mới từ một trang web, nó không làm gì cả
xin vui lòng giúp đỡ
cảm ơn
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Chào Kamal.
Vấn đề này hơi phức tạp. Sau khi thử nhiều phương pháp khác nhau, tôi không thể giải quyết được. Tôi xin lỗi vì điều đó.
Nhận xét này đã được giảm thiểu bởi người điều hành trên trang web
Bất kỳ cơ thể nào có thể giúp đỡ trong vấn đề này
Không có bình luận nào được đăng ở đây
Để lại ý kiến ​​của bạn
Đăng với tư cách khách
×
Đánh giá bài viết này:
0   Nhân vật
Các vị trí được đề xuất

Kết nối với chúng tôi

Bản quyền © 2009 - www.extendoffice.com. | Đã đăng ký Bản quyền. cung cấp bởi ExtendOffice. | BẢN ĐỒ CHI NHÁNH
Microsoft và logo Office là các nhãn hiệu hoặc nhãn hiệu đã đăng ký của Microsoft Corporation tại Hoa Kỳ và / hoặc các quốc gia khác.
Được bảo vệ bởi Sectigo SSL