在日常工作中,對於一些表格,我們希望看到表格內容的修改情況,特別是需要多人填寫的表格,通過修改情況我們可以發現表格修改過程中的錯誤。
這種需求如何實現呢?
用VBA,其實很簡單。
1. 思路介紹
我們仔細梳理一下,我們把它歸納為兩步
(1)當鼠標選中時,記錄單元格中的原內容。
(2)當單元格中的內容發生改變時,對比原內容和新內容,如果原內容和新內容不同,那麼就記錄下來。否則,不記錄。
這樣,我們需要用到工作表中的兩個事件代碼,利用工作表的Worksheet_SelectionChange,當選中單元格時觸發該事件,記錄原內容;利用Worksheet_Change,當單元格內容發生改變時觸發該事件,比較新內容和原內容。
流程圖如下:
2. 構建工作表
(1)新建工作表,名稱:“員工信息表”,代碼名稱為:sheet1
我們的目的就是記錄此表的修改情況。
(2)新建工作表,名稱:“修改記錄”,代碼名稱為:sheet2
我們需要將“員工信息表”的修改情況,記錄在此表中。
3. 代碼
(1)定義一個變量在當前模塊內使用公共變量changes
<code>Private
changesAs
String/<code>
Changes變量儲存單元格內的原內容
(2)當鼠標選中單元格時,將單元格中的內容儲存在changes
<code>Private
Sub Worksheet_SelectionChange(ByVal TargetAs
Range) changes = Target.Value End Sub/<code>
(3)當單元格時內容改變時,將修改的情況儲存在“修改記錄”工作表中
<code>Private
Sub Worksheet_Change(ByVal TargetAs
Range) Dim rngAs
RangeIf
Sheet1.Range("j2"
) <>""
Then'判斷用戶是否為空 If Target.Value <> changes Then '
判斷單元格內容是否變化 Set rng = Sheet2.Range("a"
& Rows.Count).End(xlUp) rng.Offset(1
,0
) = rng.Row'根據行號計算序號 rng.Offset(1, 1) = Format(Now, "yyyy-m-d hh:mm") '
寫入時間 rng.Offset(1
,2
) = Sheet1.Range("j2"
)'操作用戶 rng.Offset(1, 3) = Sheet1.Name '
工作表名稱 rng.Offset(1
,4
) = Target.Address'寫入單元格地址 rng.Offset(1, 5) = changes '
寫入單元格原值 rng.Offset(1
,6
) = Target.Value'寫入修改後的值 End If Else MsgBox "請選擇用戶" End If End Sub
/<code>
說明:
代碼中首先對用戶名進行判斷,如果用戶名為空,則要求選擇用戶。當選擇用戶後,如果內容改變則把修改的情況一一寫入“修改記錄”相應單元格中。如下圖
這樣,我們可以把修改情況清楚的記錄在工作表中,對錶格的修改情況一目瞭然,可以發現表格修改過程中的錯誤。
另外,大家如果有興趣,可以利用這個修改情況表格,進行回退操作,一步一步回退之前的操作。