- Excel VBA范例大全
- 羅剛君編著
- 2980字
- 2018-12-29 15:15:30
第11章 數(shù)據(jù)查詢與替換
在Excel計算中,查詢和替換功能運用相當頻繁。熟練掌握這類技巧,可以在制表運算中提升效率,并且確保運算的準確性。
● 實例85查找單價
● 實例86多表成績搜索
● 實例87電話簿查詢
● 實例88循環(huán)嵌套進行工號查詢
● 實例89將工作表中“PC”批量替換成電腦
● 實例90將大于等于60的考分替換成“合格”
實例85 查找單價
【技巧說明】 查找單價。
【案例介紹】 如圖2.97所示,產(chǎn)值表中“產(chǎn)值”列引用“單價”列和“產(chǎn)量”列的數(shù)據(jù),而“單價”列數(shù)據(jù)需要到“單價表”中去引用數(shù)據(jù)。手工去查詢產(chǎn)品對應的單價顯然效率低下,本例通過代碼瞬間找到所有產(chǎn)品對應的單價。
【案例實現(xiàn)】 參見以下步驟:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環(huán)境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub查找單價() Dim var As Variant, iRow As Integer iRow=3 Do Until IsEmpty(Cells(iRow, 1)) var=Application.Match(Cells(iRow, 2), Sheets("單價表").Columns(1), 0) If Not IsError(var) Then Cells(iRow, 4).Value=Sheets("單價表").Cells(var, 2).Value End If iRow=iRow+1 Loop End Sub
[4] 關(guān)閉VBE窗口返回到工作表。
[5] 利用快捷鍵Alt+F8調(diào)出運行宏窗口,然后單擊“執(zhí)行”按鈕,“單價”列將產(chǎn)生對應的單價,如圖2.98所示。

圖2.97 產(chǎn)值表

圖2.98 查找單價后的產(chǎn)值表
提示
本實例參見光盤樣本:..\第2部分\實例85.xlsm。
【相關(guān)知識說明】
(1)Do Until...Loop語句:當條件為True時,或直到條件變?yōu)門rue時,重復執(zhí)行一個語句塊中的命令。本例中表示循環(huán)查找單價,直到單元格數(shù)據(jù)為空時停止。
(2)IsEmpty:返回Boolean值,指出變量是否已經(jīng)初始化。
(3)Application.Match:返回在指定方式下與指定數(shù)值匹配的數(shù)組中元素的相應位置。本例中以B列產(chǎn)品名為基準,到“單價表”中查詢相同的產(chǎn)品名在A列的排列位置。
實例86 多表成績搜索
【技巧說明】 在多個工作表中搜索成績。
【案例介紹】 如圖2.99所示,三個班的成績放置在三個工作表中,現(xiàn)需要在“成績查詢”表的A2中輸入人名(也可以是單字),則在后面表格中出現(xiàn)對應的學員所在的工作表和單元格,以及完整姓名、班級、學號與成績。

圖2.99 成績查詢表
【案例實現(xiàn)】 參見以下步驟:
[1] 按Alt+F11組合鍵進入VBE環(huán)境。
[2] 使用快捷鍵Ctrl+R,顯示工程資源管理器。
[3] 雙擊左邊列表中的“成績查詢表”,打開工作表代碼窗口。
[4] 在右邊代碼窗口輸入以下代碼:
Sub成績搜索() Dim t, arr(), intRows As Integer t=Timer '初始化時間變量 Application.ScreenUpdating=False On Error Resume Next Range("c2:h1048576").Clear '清除上次查詢信息 查找值=Cells(2, 1) '設(shè)定查找目標為A2的值 For i=2 To Sheets.Count '遍歷工作表(第一個表即當前表除外) Set c=Sheets(i).Range("a2:a100").Find(what:=查找值) 'A2∶A100可以是自己根據(jù)實際狀況定義區(qū)域大小 If Not c Is Nothing Then firstAddress=c.Address Do intRows=intRows+1 '累加計數(shù)器 ReDim Preserve arr(1 To 6, 1 To intRows) '重定義數(shù)組變量 arr(1, intRows)=Sheets(i).Name '數(shù)組第一子項目賦值為查找到的數(shù)據(jù)所在工作表名 arr(2, intRows)=c.Address '數(shù)組第二子項目賦值為查找到的數(shù)據(jù)所在單元格地址 arr(3, intRows)=c.Value '數(shù)組第三子項目賦值為查找到的數(shù)據(jù) arr(4, intRows)=c.Offset(0, 1).Text '數(shù)組第四子項目賦值為查找到的數(shù)據(jù)右移一個單元格的值 arr(5, intRows)=c.Offset(0, 2).Text '數(shù)組第五子項目賦值為查找到的數(shù)據(jù)右移二個單元格的值 arr(6, intRows)=c.Offset(0, 3).Text '數(shù)組第六子項目賦值為查找到的數(shù)據(jù)右移三個單元格的值 Set c=Sheets(i).Range("a2:a100").FindNext(c) Loop While Not c Is Nothing And c.Address <> firstAddress End If Next Range("C2:h" & intRows)=Application.Transpose(arr) '將找到的值賦予單元格區(qū)域 Range("C2:h" & intRows).Borders.LineStyle=xlContinuous '添加邊框 Application.ScreenUpdating=True MsgBox Format(Timer-t, "0.00") & "秒" '提示總運行時間 End Sub
[5] 關(guān)閉VBE窗口返回到工作表。
[6] 在單元格A2輸入“劉”并回車,右邊出現(xiàn)所有姓“劉”的學生的姓名、班級、學號和成績,如圖2.100所示。

圖2.100 成績查詢結(jié)果
提示
本實例參見光盤樣本:..\第2部分\實例86.xlsm。
【相關(guān)知識說明】
(1)Clear:清除整個對象,本例中清除單元格中所有信息,包括數(shù)據(jù)和格式。
(2)WorksheetFunction.Transpose:返回轉(zhuǎn)置單元格區(qū)域,即將一行單元格區(qū)域轉(zhuǎn)置成一列單元格區(qū)域,反之亦然。相當于選擇性粘貼中的轉(zhuǎn)置。
實例87 電話簿查詢
【技巧說明】 電話簿查詢。
【案例介紹】 如圖2.101所示,電話簿分置于三個工作表中,現(xiàn)需要在單元格B1中輸入任意字符,即可在下面查詢區(qū)域返回姓名中包含該字符的人員及其相關(guān)通信資料。
【案例實現(xiàn)】 參見以下步驟:
[1] 使用快捷鍵Alt+F11進入VBE環(huán)境。
[2] 使用快捷鍵Ctrl+R,顯示工程資源管理器。
[3] 雙擊左邊列表中的“電話查詢”表,打開工作表代碼窗口。
[4] 在右邊代碼窗口輸入以下代碼:
Private Sub Worksheet_Change(ByVal Target As Range) On Error Resume Next If Target.Address="$B$1" Then Dim cn As Object, Sql$, sh As Worksheet Set cn=CreateObject("ADODB.Connection") cn.Open "provider=microsoft.jet.oledb.4.0;extended properties= 'excel 8.0;imex=1';data source=" & ThisWorkbook.FullName Application.ScreenUpdating=False Range("A4:d" & [A1048576].End(xlUp).Row+1).Clear For Each sh In Worksheets If sh.Name <> "電話查詢" Then Sql="select * from [" & sh.Name & "$] where姓名like '%" & [b1].Text & "%'" [A65536].End(xlUp).Offset(1,0).CopyFromRecordset cn.Execute(Sql) End If Next sh Application.ScreenUpdating=True cn.Close Range("A4:d" & [A1048576].End(xlUp).Row).Borders.LineStyle= xlContinuous'線型 Set cn=Nothing End If End Sub
[5] 關(guān)閉VBE窗口返回到工作表。
[6] 在單元格B1輸入“劉”并回車,下面則出現(xiàn)所有姓“劉”的人員的姓名及相關(guān)信息,如圖2.102所示。
[7] 如果刪除單元格B1的值,則將列出所有電話簿信息。

圖2.101 電話簿查詢表

圖2.102 電話簿查詢結(jié)果
提示
本實例參見光盤樣本:..\第2部分\實例87.xlsm。
【相關(guān)知識說明】
(1)CreateObject:創(chuàng)建并返回一個對ActiveX對象的引用。
(2)Open:對文件做任何I/O操作之前都必須先打開文件。Open語句分配一個緩沖區(qū)供文件進行I/O(輸入/輸出)之用,并決定緩沖區(qū)所使用的訪問方式。
(3)Close:關(guān)閉Open語句所打開的I/O文件。
實例88 循環(huán)嵌套進行工號查詢
【技巧說明】 循環(huán)嵌套進行工號查詢。
【案例介紹】 本例與實例85需求一致,只是查詢代碼不同。如圖2.103所示,員工工號需要到參照表“人事資料”中查詢并返回到B列。
【案例實現(xiàn)】 參見以下步驟:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環(huán)境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub工號查詢() Application.ScreenUpdating=False Dim i, cell As Range For i=1 To Range("a1048576").End(xlUp).Row-1 For Each cell In Range("A2:A" & Range("a1048576").End(xlUp).Row) cell.Offset(0, 1)=Sheets("人事資料").Range("B" & WorksheetFunction. Match(cell, Sheets("人事資料").Range("a1:a21"), 0)) Next cell Next i Application.ScreenUpdating=True End Sub
[4] 關(guān)閉VBE窗口返回到工作表。
[5] 利用快捷鍵Alt+F8調(diào)出運行宏窗口,然后單擊“執(zhí)行”按鈕,B列自動返回姓名對應的工號,如圖2.104所示。

圖2.103 工資表

圖2.104 工號查詢結(jié)果
提示
本實例參見光盤樣本:..\第2部分\實例88.xlsm。
【相關(guān)知識說明】
本例中用了兩層循環(huán):For…和For Each…Next,外層循環(huán)是在“工資表”的A列循環(huán),遍歷員工的姓名;內(nèi)層循環(huán)是在“人事資料表”的A列數(shù)據(jù)循環(huán)查找人員姓名,找到后取其右邊的工號賦予“工資表”中工號列。內(nèi)存循環(huán)將運行多次,次數(shù)和外層數(shù)據(jù)個數(shù)(本例中即“工資表”人員個數(shù))相同,外層循環(huán)只循環(huán)一次。
實例89 將工作表中“PC”批量替換成電腦
【技巧說明】 將工作表中“PC”批量替換成電腦。
【案例介紹】 如圖2.105所示,為了使銷貨表更通俗易懂,現(xiàn)需要將所有“PC”字樣更換為“電腦”。
【案例實現(xiàn)】 參見以下步驟:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環(huán)境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub替換() ActiveSheet.UsedRange.Replace What:="PC",Replacement:="電腦",LookAt:=xlPart End Sub
[4] 關(guān)閉VBE窗口返回到工作表。
[5] 利用快捷鍵Alt+F8調(diào)出運行宏窗口,然后單擊“執(zhí)行”按鈕,工作表中已用區(qū)域所有“PC”字樣已替換成“電腦”,如圖2.106所示。

圖2.105 銷貨表

圖2.106 替換后的銷貨表
提示
本實例參見光盤樣本:..\第2部分\實例89.xlsm。
實例90 將大于等于60的考分替換成“合格”
【技巧說明】 將所有工作表中成績大于等于60的考分替換成“合格”。
【案例介紹】 如圖2.107所示,三個組別成員的成績分布于三個工作表中,現(xiàn)需要將三個工作表中成績大于等于60分的成績替換為“合格”字樣。
【案例實現(xiàn)】 參見以下步驟:
[1] 使用快捷鍵Alt+F11進入VBE(Visual Basic Editor)環(huán)境。
[2] 單擊菜單【插入】\【模塊】,打開模塊代碼窗口。
[3] 在右邊代碼窗口輸入以下代碼:
Sub多表替換() Dim sh_count As Byte, row_count As Long '聲明變量 For sh_count=1 To Sheets.Count '為變量賦值,范圍是1到工作表數(shù)量 For row_count=2 To Sheets(sh_count).Range("a1048576").End(xlUp).Row '為變量賦值 If Sheets(sh_count).Cells(row_count, 2) >=60 Then '如果成績大于等于60 Sheets(sh_count).Cells(row_count, 2)="合格" '替換為“合格” End If Next row_count '重復下一行 Next sh_count '重復下一個工作表 End Sub
[4] 關(guān)閉VBE窗口返回到工作表。
[5] 利用快捷鍵Alt+F8調(diào)出運行宏窗口,然后單擊“執(zhí)行”按鈕,三個工作表中所有大于等于60分的成績已替換成“合格”字樣,如圖2.108所示。

圖2.107 成績表

圖2.108 替換后的成績表
提示
本實例參見光盤樣本:..\第2部分\實例90.xlsm。
- Word辦公應用案例教程
- PPT制作應用大全2019
- Office 2013中文版從入門到精通
- 別讓PPT拖后腿
- Excel行政文秘應用之道
- AI智能化辦公:ChatGPT使用方法與技巧從入門到精通
- Office 2013應用技巧實例大全
- 實訓教程:電腦入門
- Unity3D平臺AR與VR開發(fā)快速上手
- 新編Word/Excel/PPT 2003從入門到精通
- 文字力!優(yōu)雅Word的排版與設(shè)計實用法則
- Office 2016 for Mac蘋果電腦辦公應用從入門到精通
- Excel 2016會計與財務(wù)管理從入門到精通
- Excel在電商運營數(shù)據(jù)管理中的應用
- PPT 2016高效辦公實戰(zhàn)應用與技巧大全666招