จะจำหรือบันทึกค่าเซลล์ก่อนหน้าของเซลล์ที่เปลี่ยนแปลงใน Excel ได้อย่างไร?
โดยปกติ เมื่ออัปเดตเซลล์ที่มีเนื้อหาใหม่ ค่าก่อนหน้าจะถูกครอบคลุม เว้นแต่จะเลิกทำการดำเนินการใน Excel อย่างไรก็ตาม ถ้าคุณต้องการเก็บค่าก่อนหน้าไว้เพื่อเปรียบเทียบกับค่าที่อัปเดต การบันทึกค่าของเซลล์ก่อนหน้าลงในเซลล์อื่นหรือลงในข้อคิดเห็นของเซลล์จะเป็นทางเลือกที่ดี วิธีการในบทความนี้จะช่วยให้คุณบรรลุเป้าหมาย
บันทึกค่าเซลล์ก่อนหน้าด้วยรหัส VBA ใน Excel
บันทึกค่าเซลล์ก่อนหน้าด้วยรหัส VBA ใน Excel
สมมติว่าคุณมีตารางตามภาพด้านล่างที่แสดง หากเซลล์ใด ๆ ในคอลัมน์ C เปลี่ยนแปลงคุณต้องการบันทึกค่าก่อนหน้านี้ลงในเซลล์ของคอลัมน์ G ที่เกี่ยวข้องหรือบันทึกในความคิดเห็นโดยอัตโนมัติ โปรดทำดังนี้เพื่อให้บรรลุ
1. ในแผ่นงานมีค่าที่คุณจะบันทึกเมื่ออัปเดตให้คลิกขวาที่แท็บแผ่นงานแล้วเลือก ดูรหัส จากเมนูคลิกขวา ดูภาพหน้าจอ:
2. ในการเปิด Microsoft Visual Basic สำหรับแอปพลิเคชัน คัดลอกโค้ด VBA ด้านล่างลงในหน้าต่าง Code
รหัส 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 สำหรับแอปพลิเคชัน หน้าต่าง
จากนี้ไปเมื่อค่าของเซลล์ในคอลัมน์ C อัปเดตค่าก่อนหน้าของเซลล์จะถูกบันทึกลงในเซลล์ที่เกี่ยวข้องในคอลัมน์ G หรือบันทึกในความคิดเห็นตามที่แสดงภาพหน้าจอ
บันทึกค่าเซลล์ก่อนหน้าในเซลล์อื่น:
บันทึกค่าเซลล์ก่อนหน้าในความคิดเห็น:
สุดยอดเครื่องมือเพิ่มผลผลิตในสำนักงาน
เพิ่มพูนทักษะ Excel ของคุณด้วย Kutools สำหรับ Excel และสัมผัสประสิทธิภาพอย่างที่ไม่เคยมีมาก่อน Kutools สำหรับ Excel เสนอคุณสมบัติขั้นสูงมากกว่า 300 รายการเพื่อเพิ่มประสิทธิภาพและประหยัดเวลา คลิกที่นี่เพื่อรับคุณสมบัติที่คุณต้องการมากที่สุด...
แท็บ Office นำอินเทอร์เฟซแบบแท็บมาที่ Office และทำให้งานของคุณง่ายขึ้นมาก
- เปิดใช้งานการแก้ไขและอ่านแบบแท็บใน Word, Excel, PowerPoint, ผู้จัดพิมพ์, Access, Visio และโครงการ
- เปิดและสร้างเอกสารหลายรายการในแท็บใหม่ของหน้าต่างเดียวกันแทนที่จะเป็นในหน้าต่างใหม่
- เพิ่มประสิทธิภาพการทำงานของคุณ 50% และลดการคลิกเมาส์หลายร้อยครั้งให้คุณทุกวัน!