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

如何在Excel中記住或保存已更改單元格的先前單元格值?

通常,當用新內容更新單元格時,會覆蓋以前的值,除非在 Excel 中撤消操作。 但是,如果您想保留先前的值以與更新的值進行比較,將先前的單元格值保存到另一個單元格或單元格註釋中將是一個不錯的選擇。 本文中的方法將幫助您實現它。

在Excel中使用VBA代碼保存以前的單元格值


在Excel中使用VBA代碼保存以前的單元格值

假設您有一個表格,如下所示。 如果C列中的任何單元格發生更改,則要將其先前的值保存到G列的相應單元格中,或自動保存在註釋中。 請按照以下步驟進行操作。

1.在工作表中包含更新時將保存的值,右鍵單擊工作表選項卡,然後選擇 查看代碼 從右鍵單擊菜單中。 看截圖:

2.在開幕 Microsoft Visual Basic for Applications 窗口,將下面的VBA代碼複製到“代碼”窗口中。

以下VBA代碼可幫助您將指定列的先前單元格值保存到另一列中。

VBA代碼:將先前的單元格值保存到另一個列單元格中

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

要在註釋中保存以前的單元格值,請應用以下VBA代碼

VBA代碼:在註釋中保存以前的單元格值

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

備註:在代碼中,數字7表示將先前的單元格保存到的G列,而C:C是將先前的單元格值保存的列。 請根據您的需要進行更改。

3。 點擊 工具 > 參考 打開 裁判– VBAProject 對話框,檢查 Microsoft腳本運行時 框,最後單擊 OK 按鈕。 看截圖:

4。 按 其他 + Q 關閉鍵 Microsoft Visual Basic for Applications 窗口。

從現在開始,當C列中的單元格值更新時,該單元格的先前值將保存到G列中的相應單元格中,或保存在註釋中,如下面的屏幕快照所示。

將以前的單元格值保存在其他單元格中:

在註釋中保存以前的單元格值:


最佳辦公效率工具

Kutools for Excel 解決了你的大部分問題,並將你的生產力提高了 80%

  • 重用: 快速插入 複雜的公式,圖表 以及您以前使用過的任何東西; 加密單元 帶密碼 創建郵件列表 並發送電子郵件...
  • 超級公式欄 (輕鬆編輯多行文本和公式); 閱讀版式 (輕鬆讀取和編輯大量單元格); 粘貼到過濾範圍...
  • 合併單元格/行/列 不會丟失數據; 拆分單元格內容; 合併重複的行/列...防止細胞重複; 比較範圍...
  • 選擇重複或唯一 行; 選擇空白行 (所有單元格都是空的); 超級查找和模糊查找 在許多工作簿中; 隨機選擇...
  • 確切的副本 多個單元格,無需更改公式參考; 自動創建參考 到多張紙; 插入項目符號,複選框等...
  • 提取文字,添加文本,按位置刪除, 刪除空間; 創建和打印分頁小計; 在單元格內容和註釋之間轉換...
  • 超級濾鏡 (將過濾方案保存並應用於其他工作表); 高級排序 按月/週/日,頻率及更多; 特殊過濾器 用粗體,斜體...
  • 結合工作簿和工作表; 根據關鍵列合併表; 將數據分割成多個工作表; 批量轉換xls,xlsx和PDF...
  • 超過 300 項強大的功能. 支持 Office / Excel 2007-2021 和 365。支持所有語言。 在您的企業或組織中輕鬆部署。 完整功能 30 天免費試用。 60 天退款保證。
kte選項卡201905

Office選項卡為Office帶來了選項卡式界面,使您的工作更加輕鬆

  • 在Word,Excel,PowerPoint中啟用選項卡式編輯和閱讀,發布者,Access,Visio和Project。
  • 在同一窗口的新選項卡中而不是在新窗口中打開並創建多個文檔。
  • 將您的工作效率提高 50%,每天為您減少數百次鼠標點擊!
officetab底部
按評論排序
留言 (20)
還沒有評分。 成為第一位評論!
網站主持人對此評論進行了最小化
我需要這樣的東西,但僅限於特定的單元格(例如:G12 在 H23 中顯示舊值)
網站主持人對此評論進行了最小化
和其他......當單元格因結果而變化時,我需要此運行(例如:A1 + B1 = C1......如果我更改 A 或 B 值,則腳本不起作用 - G 單元格中沒有任何反應)
網站主持人對此評論進行了最小化
你好 ! 我只是想知道是否可以對單元格進行多次更改,我的意思是,如果我將數據放入單元格 C2 中,然後我更改該數據以獲取其他信息,則先前的數據將傳遞到單元格 G2(就像在這篇文章中一樣),但是如果我在單元格 C2 中再更改一次值,我所做的第二次更改將傳遞到單元格 H2(例如),現在我註冊了我實現的 3 個動作的信息,並且做了將近 5 次更多(保存前一個單元格值 5 次)。 如果您能幫助我,我將不勝感激,因為在您的帖子中,這是我找到的唯一可以部分解決問題的地方。 感謝分享這個內容!!!!
網站主持人對此評論進行了最小化
你找到怎麼做了嗎?
網站主持人對此評論進行了最小化
我在想一句話“如果/否則”,但我是使用 VBA 的新手,所以如果您有其他帖子可以幫助我,請與我分享,再次感謝您! 繼續分享知識
網站主持人對此評論進行了最小化
為什麼上​​面的代碼不適用於 DDE 數據,我有一列中的數據正在通過 dde ​​更改,但是當我應用此代碼將該列的先前值保存到另一列中時,它什麼也沒做;

非常感謝任何有助於實現這一目標的幫助。
網站主持人對此評論進行了最小化
您好!

很棒的功能,但是如何修改它以與我想記住包含 VLOOKUP 的值的單元格一起使用? 不幸的是,我找不到要修改的內容以保存 VLOOKUP 中的值。 因為當 VLOOKUP 位於中間時它不起作用:(

在此先感謝您的幫助 !
網站主持人對此評論進行了最小化
您好,因此修改了您所做的“VBA 代碼:將先前的單元格值保存到另一列單元格”代碼,但是我有幾個問題:

1. 代碼如何知道哪一列有新值? (在另一列更新後,其值將顯示在另一列中)
2.你怎麼能把它變成一個宏? 或者讓它在另一個程序調用 xlsm 時自動運行。 文件?

謝謝
網站主持人對此評論進行了最小化
這是針對一個單元格值,但是對於多個單元格值怎麼辦,我想要 4 個單元格數據存儲和更新,例如 C、D、E、F 單元格數據分別到 G、H、I、J 單元格,怎麼做請幫忙
網站主持人對此評論進行了最小化
如果我要保存的單元格是公式,G單元格只會保存公式,併計算值。 我需要保存值 - 而不是公式。 我如何告訴 VBA 代碼,儘管公式沒有改變,但值會發生變化。 最好的問候弗萊明
網站主持人對此評論進行了最小化
有沒有辦法對所有更改重複此操作? 如果可能的話,我希望評論框顯示所有以前的條目。
網站主持人對此評論進行了最小化
嗨,珍妮! 你設法解決了這個問題嗎? 我也試圖在評論框中收集所有新條目,但我很難將 VBA 代碼適應於此。 謝謝!
網站主持人對此評論進行了最小化
如果你輸入就好了。你能幫我在輸入數據時使用DDE(動態數據交換)的函數值嗎?
網站主持人對此評論進行了最小化
嗨,
對不起,我無法解決這個問題。 我建議您將問題發佈到下面的論壇,以獲得其他 Excel 愛好者的幫助。
https://www.extendoffice.com/forum/kutools-for-excel.html
網站主持人對此評論進行了最小化
cho e hỏi chút là có cách nào để khi tính toán cộng trừ xong 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
khitínhtoánxongcộtasẽugiátrịakhikhikhikhi khitiánhtoánxongxong,lầntiếptheoththìnhtiánthìnthìnth確實
網站主持人對此評論進行了最小化
嗨,中,
代碼已更新。 請試一試。 感謝您的反饋意見。
在下面的代碼中,這一行中的數字 5 設置 xDCell = Cells(xCell.Row, 5) 表示將放置前一個值的列 E。 A:A 指的是 A 列中的單元格。您需要保存這些單元格以前的值。

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
網站主持人對此評論進行了最小化
僅在手動輸入數據​​時有效
但從網站刷新數據時不起作用
請大家幫忙
謝謝
網站主持人對此評論進行了最小化
手動輸入時保存以前的數據,但從網站刷新數據時不起作用,它什麼也不做
請大家幫忙
謝謝
網站主持人對此評論進行了最小化
嗨,卡馬爾。
這個問題有點複雜。 嘗試了各種方法後,我無法應對。 我為此感到抱歉。
網站主持人對此評論進行了最小化
任何機構都可以幫助解決這個問題
這裡還沒有評論
留下你的意見
以訪客身份發帖
×
評價此帖子:
0   字符
推薦地點

關注我們

版權所有©2009 - 萬維網。extendoffice.com。 | 版權所有。 供電 ExtendOffice。 |
Microsoft和Office徽標是Microsoft Corporation在美國和/或其他國家的商標或註冊商標。
受Sectigo SSL保護