官术网_书友最值得收藏!

第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。

主站蜘蛛池模板: 札达县| 万盛区| 百色市| 西丰县| 新乐市| 长海县| 文登市| 老河口市| 当涂县| 万宁市| 增城市| 多伦县| 永胜县| 新乡县| 霸州市| 萨嘎县| 凤凰县| 新民市| 西吉县| 抚松县| 伊金霍洛旗| 锡林浩特市| 揭阳市| 武平县| 台东县| 北碚区| 阳新县| 巴楚县| 徐州市| 灌阳县| 中西区| 阜城县| 田阳县| 高尔夫| 杨浦区| 公主岭市| 乳山市| 华安县| 鹤壁市| 平乐县| 滕州市|