使用VBA在兩個(gè)sheet頁中實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)同步

背景

  • Data頁中是原始數(shù)據(jù)狡门,Test頁中的前三行是使用excel中的公式:
=IF(ISBLANK(Data!A1:A298), "", Data!A1:A298)
=IF(ISBLANK(Data!B1:B298), "", Data!B1:B298)
=IF(ISBLANK(Data!C1:C298), "", Data!C1:C298)
  • 由于Test頁中的前三列是直接從Data頁中映射過來的计福,因此Data頁中如果有增刪改查概作,Test頁中的前三列是可以自動(dòng)同步的沪袭。
  • 但是Test頁中的第四田度,五妒御,六...列是用戶直接在Test頁中自己配置的,這幾列就無法實(shí)現(xiàn)同步了镇饺,如果用戶直接在Data頁新增或刪除一行就會(huì)造成行數(shù)的錯(cuò)位乎莉,在網(wǎng)上查了各種方法無法實(shí)現(xiàn)其余列的同步,所以就借用VBA代碼實(shí)現(xiàn)了奸笤,分享給大家

實(shí)現(xiàn)思路

  1. 刪除
  • 若想刪除的話惋啃,就需要知道用戶在Data頁中操作的是哪一行,獲取到行之后监右,再在Test頁中刪除對應(yīng)的行即可边灭。
  • 獲取用戶操作的行數(shù),寫在Worksheet_SelectionChange函數(shù)中健盒,并且需要定義一個(gè)全局變量绒瘦,方便在進(jìn)行刪除操作的時(shí)候使用:
Dim DeletedRow As Long ' 用于存儲(chǔ)被刪除的行號
Dim SelectedRows As Collection ' 如果是選了多行就存儲(chǔ)多行的行號
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' 如果不是選擇的整行就退出
    If Target.Columns.Count <> Me.Columns.Count Then
        Exit Sub
    End If
  
    If Target.Rows.Count = 1 Then
        ' 記錄行號
        DeletedRow = Target.row
    Else
        ' 存儲(chǔ)選中的行號到列表中
        Dim cell As Range
        For Each cell In Target.Rows
            SelectedRows.Add cell.row
        Next cell
    End If
End Sub
  • 刪除操作直接寫在Worksheet_Change函數(shù)中
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wsData As Worksheet
    Dim wsTest As Worksheet
    Dim i As Long
    
    ' 設(shè)置工作表
    Set wsData = Worksheets("Data")
    Set wsTest = Worksheets("Test")

   ' delete row in wsTest
    If DeletedRow > 0 Then
        wsTest.Rows(DeletedRow).Delete
        DeletedRow = 0
    End If
    If Not SelectedRows Is Nothing Then
        Dim rowNum As Variant
        For Each rowNum In SelectedRows
            wsTest.Rows(rowNum).Delete
        Next rowNum
        Set SelectedRows = Nothing
    End If
End Sub
  1. 新增
    刪除的行同步實(shí)現(xiàn)了之后,繼續(xù)實(shí)現(xiàn)新增的操作扣癣,由于新增的行是空行惰帽,所以可以根據(jù)這個(gè)特點(diǎn),來確定新增的行號
' 獲取 Data 頁的最后一行
    lastRowData = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
    
    For i = 1 To lastRowData
        ' 檢查是否增加的為一個(gè)空行
        If wsData.Cells(i, 1).Value = "" Then
            wsTest.Rows(i).Insert Shift:=xlDown
            ' 記得要把DeletedRow置0父虑,防止影響刪除操作
            DeletedRow = 0 
        End If
    Next i

完整代碼如下:

Dim DeletedRow As Long ' 用于存儲(chǔ)被刪除的行號
Dim SelectedRows As Collection ' 如果是選了多行就存儲(chǔ)多行的行號

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' 如果不是選擇的整行就退出
    If Target.Columns.Count <> Me.Columns.Count Then
        Exit Sub
    End If
    
    If Target.Rows.Count = 1 Then
        ' 記錄行號
        DeletedRow = Target.row
    Else
        ' 存儲(chǔ)選中的行號到列表中
        Dim cell As Range
        For Each cell In Target.Rows
            SelectedRows.Add cell.row
        Next cell
    End If
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim wsData As Worksheet
    Dim wsTest As Worksheet
    Dim lastRowData As Long
    Dim i As Long
    
    ' 設(shè)置工作表
    Set wsData = Worksheets("Data")
    Set wsTest = Worksheets("Test")
    
    ' 獲取 Data 頁的最后一行
    lastRowData = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
    
    For i = 1 To lastRowData
        ' 檢查是否增加的為一個(gè)空行
        If wsData.Cells(i, 1).Value = "" Then
            wsTest.Rows(i).Insert Shift:=xlDown
            DeletedRow = 0
            Set SelectedRows = Nothing
        End If
    Next i
   ' delete row in wsTest
    If DeletedRow > 0 Then
        wsTest.Rows(DeletedRow).Delete
        DeletedRow = 0
    End If
    If Not SelectedRows Is Nothing Then
        Dim rowNum As Variant
        For Each rowNum In SelectedRows
            wsTest.Rows(rowNum).Delete
        Next rowNum
        Set SelectedRows = Nothing
    End If

End Sub

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末该酗,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子频轿,更是在濱河造成了極大的恐慌垂涯,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件航邢,死亡現(xiàn)場離奇詭異耕赘,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)膳殷,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進(jìn)店門操骡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人赚窃,你說我怎么就攤上這事册招。” “怎么了勒极?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵是掰,是天一觀的道長。 經(jīng)常有香客問我辱匿,道長键痛,這世上最難降的妖魔是什么炫彩? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮絮短,結(jié)果婚禮上江兢,老公的妹妹穿的比我還像新娘。我一直安慰自己丁频,他們只是感情好杉允,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著席里,像睡著了一般叔磷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胁勺,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天世澜,我揣著相機(jī)與錄音独旷,去河邊找鬼署穗。 笑死,一個(gè)胖子當(dāng)著我的面吹牛嵌洼,可吹牛的內(nèi)容都是我干的案疲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼麻养,長吁一口氣:“原來是場噩夢啊……” “哼褐啡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起鳖昌,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤备畦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后许昨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體懂盐,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年糕档,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了莉恼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡速那,死狀恐怖俐银,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情端仰,我是刑警寧澤捶惜,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站荔烧,受9級特大地震影響吱七,放射性物質(zhì)發(fā)生泄漏坞淮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一陪捷、第九天 我趴在偏房一處隱蔽的房頂上張望回窘。 院中可真熱鬧,春花似錦市袖、人聲如沸啡直。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酒觅。三九已至,卻和暖如春微峰,著一層夾襖步出監(jiān)牢的瞬間舷丹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工蜓肆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留颜凯,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓仗扬,卻偏偏與公主長得像症概,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子早芭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容