VBA研究 如何檢測單元格內容改變

2021-07-23 16:09:19 字數 1992 閱讀 6703

iamlaosong文

我們經常需要監督excel工作表中單元格的值是否變化,例如我們客服有乙個報表要通報,報表的內容來自很多地方,需要將這些資料複製到這個表中,由於資料較多,為了防止有遺漏,希望更新後的資料有個標誌,這樣沒有更新的就一目了然了。為此,很自然就會想起利用worksheet_change事件完成。當工作表任何單元格發生變化時就會啟用這個事件。另乙個事件函式worksheet_selectionchange則是活動單元格發生變化時啟用。

1、用worksheet_change事件完成

先看**,其中的

date_change()是用於日期變化的微調按鈕指定的巨集:

public sub date_change()

'日期變化時,將標誌還原

range("c1:k1") = "old"

end sub

private sub worksheet_change(byval target as range)

if target.row >= 4 and target.row <= 21 then

if target.column >= 3 and target.column <= 11 then

'選定範圍的值發生變化時

2、自定義函式,比較備份值確定

如果不想用worksheet 的 change 事件,也可以自己寫個函式,因為用來change 事件,一點改變都會啟用這個事件,關鍵一點是,只要進入了編輯狀態,即使值沒有變化,也會啟用這個事件,使你無法判斷值是否真的變了。

為了達到這個目標,在日期變更時,將資料做個備份,標誌單元格用個if函式判斷一下是不是改變了即可。為了簡化判斷,只對報表的最後一行總和進行比較。

先看**,日期變更時將21行的資料備份到24行:

sub cp_data()

rows("21:21").copy

range("a24").pastespecial paste:=xlpastevalues, operation:=xlnone, skipblanks _

:=false, transpose:=false

range("a5").select

end sub

25行的狀態單元格內容為公式,如c25:=if(c24=c21,"old","new"),如下圖所示:

最後說一下,為了顯示明顯,標誌單元格設定了條件格式,當內容為new時顯示為紅底。

3、用worksheet_selectionchange事件確定值是否真的改變

對於手工修改單元格的值,可以用worksheet_selectionchange事件記錄修改前的值,這樣就可以判斷單元格的值是否真的變了,因為要手工修改乙個單元格的值,首先要選擇它。注意:一次只能選乙個單元格。**如下:

dim oldvalue

private sub worksheet_change(byval target as range)

if target.value <> oldvalue then

msgbox target.address & "單元格由" & oldvalue & "變為" & target.value

end if

end sub

private sub worksheet_selectionchange(byval target as range)

oldvalue = target.value

end sub

VBA 定位單元格

在excel自帶功能中,即帶有根據特殊格式定位的功能 開始 查詢與選擇 定位條件 可以根據需要定位查詢 標註 常量 公式 空值 可見單元格 等。該函式和下面excel面板功能相通 其使用格式為 expression.specialcells type,value 下表是value可選的引數 選擇有公...

VBA 快速填充單元格

在excle中,需要填充單元格,直接下拉,然後即可填充,但是使用vba 又該如何實現這個呢?區域 public sub 快速填充 dim myrange as range cells.clear 清除所有 資料 set myrange range a1 a12 with myrange.cells ...

VBA研究 如何將單元格資料賦給陣列

將工作表中的資料賦給陣列或者將陣列的資料賦給工作表,一般有兩種,一種是迴圈的方法,乙個乙個的傳,這種方法一般用於需要對每個資料特別處理的場合,另一種是一次性用賦值語句傳,就速度來說,第二種方法要快得多。看下面例程 sub tt dim arr1 240000,4 dim arr2 lineno a1...