六、在vba中使用函數(公式)


自己熟悉excel工作表中的函數公式,本節主要處理如何在vba中使用函數,分兩種:工作表函數vba函數:
(1)在vba中使用工作表函數必須使用前綴Application.WorksheetFunction.
(2)大部分工作表函數在vba中與在工作表中的用法相同
(2)一些工作表函數在vba中不實用。例如:Concatenate 函數就不實用,因為在vba 中可以使用 & 運算符來連接多個文本值。
(2)一些工作表函數在vba中用法略有差異,如vlookup;
(3)vba函數可不要前綴直接調用,但若需尋找,在 Application.WorksheetFunction找不到,需要使用vba.前綴找(了解vba函數的分類后可逐級找,分類見附錄)

一、在vba中使用工作表函數
  問題導入:“使用工作表函數”文件,做成查詢系統,完成以下功能:
      (1)輸入准考證號,獲得相關信息;
      (2)填充統計信息。
  處理:(1)先考慮問題(2),在工作表界面可直接用“counta()”函數查找某表某列的非空數據個數,填充到“共導入__名考生”中;
     (2)在vba界面,用已有知識解決此問題,可寫for循環,逐一判斷每個單元格是否為空"<>" " "后,統計非空個數;
     (3)步驟(2)太麻煩,探索VBA中函數解決:Sheet1.Range("D26") = Application.WorksheetFunction.CountA(Sheet2.Range("a:a")) - 1
     (4)對工作表進行for循環,k=k+application·····解決完整
     (5)類似解決男生統計人數:Sheet1.Range("D27") = Application.WorksheetFunction.CountIf(Sheet2.Range("f:f"), "男")

     (6)考慮問題(1),用vlookup函數求學號對應姓名信息,轉為vba中函數解決,其余信息類似處理:
      Sheet1.Range("D14") = Application.WorksheetFunction.VLookup(Sheet1.Range("D9"), Sheet2.Range("a:f"), 5, "false")
     (7)將步驟(6)進行for循環出現嚴重問題,不在當前表找不到時,程序報錯對話框(工作表界面是返回N/A)停止運行
     (8)在進入for循環前加語句“On Error Resume Next”,解決報錯對話框問題

     (9)“地區”格較麻煩,應填入sheets(i).name,但由於有"on error resume next",總是填入最后一張表的name,因此應考慮“找到數據”時的for循環停止機制
     (10)找到數據時Sheet1.Range("D14")會被填充,可以此判斷是否找到了數據,即 if Sheet1.Range("D14")<>"" then exit for    end if 
     (11)Sheet1.Range("D14")可能殘留前次查詢數據,因此需在for循環前將其清空。注意填充操作前均需考慮先清空目標單元格

二、使用vba函數
(1)以文本函數left為例,演示在vba中的調用過程:vba-->strings-->left,了解vba函數的分類;
(2)演示“DEMO-2-根據部門列創建工作表(最終完成版)”,輸入“e”或“99999”,分別報錯“類型不匹配”及“溢出”,講解變量類型的聲明及范圍;
(3)演示如果不聲明“iCol”變量類型,運行仍會報錯,因inputbox返回text類型值,而iCol作為后面for循環的參數應是integer;
(4)若不聲明變量類型,可通過“iCol = iCol * 1”或“iCol =Val( iCol )強制轉換為integer類型,但仍無法解決輸入“e”報錯的問題;
(5)增加判斷語句“If VBA.Information.IsNumeric(iCol) = False or iCol< 1 Then  MsgBox ("請輸入正確的數字")  Exit Sub  End If"

(6)重點掌握vba函數中的文本函數:instr,split
(7)InStr([start, ]string1, string2[, compare])返回 string2在string1中最先出現的位置,找不到返回“0”,規避了WorksheetFunction.find()函數找不到報錯的問題;
                如“”“DEMO-3-VBA函數”中提取指定位置的字符:Sheet1.Range("b2") = Left(Sheet1.Range("a2"), InStr(Sheet1.Range("a2"), "@") - 1)

(8)Split(expression[, delimiter[, limit[, compare]]]),“delimiter”為指定分隔符,若不輸入則默認為空格符“ ”分割,返回一個下標從零開始的一維數組,它包含指定數目的子字符串。
(9)用“DEMO-3-VBA函數“演示,用工作表的文本函數進行提取很麻煩,但split進行文本提取很方便,如“Range("b2") = Split(Range("a2"), "-")(2)”得到"2015",而
         Range("b2") = Split(Range("a2"), "-")(2) & "年" & Split(Range("a2"), "-")(3) & "周",可得到“2015年37周"。 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM