乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      VBA筆記入門篇

       成已成物 2022-05-08 發(fā)布于湖南省

      VBA全名:  Visual  Basic  Application

      準(zhǔn)備·工作

      打開(kāi)VBA

      打開(kāi)左上角的:文件->選項(xiàng) 彈出如下畫面,選擇“自定義功能區(qū)”,勾選上“開(kāi)發(fā)工具”,點(diǎn)擊確定。Excel的頭上就會(huì)多出一個(gè)選項(xiàng)卡:開(kāi)發(fā)工具。

       

       

      另一種打開(kāi)方式:

      在excel頭部的任意一個(gè)選項(xiàng)卡里單擊右鍵,在彈出的菜單里選第三項(xiàng)“自定義功能區(qū)域”。也可以彈出如上畫面。

      啟用宏

      因?yàn)楹芏嗖《臼强縑BA的宏傳播,所以excel默認(rèn)禁止執(zhí)行宏,所以要執(zhí)行VBA先要允許宏啟動(dòng)。在“開(kāi)發(fā)工具”選項(xiàng)卡里點(diǎn)擊“宏安全性”,選“宏設(shè)置”,選中“啟用所有宏”。點(diǎn)擊確定按鈕,然后重啟excel(關(guān)閉excle文件再重新打開(kāi))

       

      VBA編輯器

      點(diǎn)擊“開(kāi)發(fā)工具”中的“Visual Basic”,可以打開(kāi)VBA編輯器。

      VBA編輯器簡(jiǎn)稱BE,即Visual Basic Editor

       

       

      在資源管理器中并沒(méi)有“模塊”這樣的目錄結(jié)構(gòu),需要添加進(jìn)去。在資源管理器中,右鍵單擊,彈出菜單中選擇“插入”,然后選擇“模塊”

       

      雙擊資源管理器中的“模塊1”,就可以在右邊開(kāi)發(fā)代碼。

       

      開(kāi)發(fā)第一個(gè)小程序

      點(diǎn)擊一個(gè)按鈕,計(jì)算execl中的公式

      添加按鈕

      1、點(diǎn)擊“插入”,彈出表單控件,選中按鈕控件

       

      2、選中按鈕控件后,在excel需要添加按鈕的地方,拖動(dòng)鼠標(biāo)左鍵畫出按鈕,彈出設(shè)置按鈕調(diào)用宏信息的top畫面。給宏起一個(gè)方法名,然后點(diǎn)擊“新建”按鈕,創(chuàng)建代碼。然后進(jìn)入VBA編輯器??吹饺缦麓a。而且在資源管理器中自動(dòng)給我們創(chuàng)建了一個(gè)“模塊2”對(duì)應(yīng)此代碼。

      宏:在VBA中編寫的一段小程序(Macro)

       

       

      Cells(行,列單元格行列取值

      編輯代碼

       

      編輯完代碼后保存文件,會(huì)彈出提示,我們必須把文件另存為xlsm格式文件,否者編寫的代碼無(wú)法保存。

      回到excel畫面,點(diǎn)擊按鈕就會(huì)計(jì)算出A1+A2的結(jié)果,結(jié)果放在C1單元格中。

       

      編輯按鈕文字 -> 右鍵單擊按鈕選第四項(xiàng)“編輯文字”(也可以拖動(dòng)按鈕位置)

      調(diào)整編輯器字體

      首先進(jìn)入excle中的VBA編程界面,在頂部菜單欄中找到工具的按鈕,點(diǎn)擊工具”,找到選項(xiàng)按鈕,然后進(jìn)入選項(xiàng)的編輯界面,點(diǎn)擊編輯器格式”,在右邊可以選擇字體的大小。

      先寫宏后關(guān)聯(lián)按鈕

      1、先在模塊2中創(chuàng)建一個(gè)做減法的宏代碼

       

      2、然后新建一個(gè)按鈕,在彈出的top畫面中,把按鈕關(guān)聯(lián)到這個(gè)宏上。

       

      這樣點(diǎn)擊這個(gè)新建的按鈕,C1就會(huì)等于A1-B1

      VBA語(yǔ)法

      變量

      區(qū)別:

      VBA的變量規(guī)則與java基本一致,最大的不同有以下兩點(diǎn):

      1、VBA變量大小寫不敏感 xy = XY = xY

      2、當(dāng)VBA程序中遇到一個(gè)新的變量名時(shí),VBA會(huì)自動(dòng)創(chuàng)建該變量,無(wú)需事先聲明。

       

      上面的代碼x取一個(gè)固定單元格的值,程序根據(jù)單元格的值,計(jì)算對(duì)應(yīng)行的數(shù)據(jù)。

      注意:因?yàn)関ba定義變量不像Java有變量初始化,Java程序一旦調(diào)用沒(méi)有定義過(guò)的變量編譯會(huì)出錯(cuò)。vba沒(méi)有定義變量初始化,所以調(diào)用一個(gè)不存在的變量不會(huì)報(bào)錯(cuò),他會(huì)自動(dòng)創(chuàng)建這個(gè)變量,只是這個(gè)變量沒(méi)有值。(所以把一個(gè)變量名修改后,后面調(diào)用這個(gè)變量的地方一旦漏改,程序不會(huì)報(bào)錯(cuò),但是結(jié)果會(huì)出錯(cuò))

      為了應(yīng)付沒(méi)有定義變量調(diào)用也不會(huì)報(bào)錯(cuò)的情況,可以在程序里事先聲明程序里只使用以下變量。

      強(qiáng)制聲明變量:

      必須寫在該模塊文件的第一行寫上Option Explicit,然后在方法體中用Dim聲明,并用逗號(hào)分隔。一旦聲明dim的方法體里使用了沒(méi)有用dim聲明的變量,編譯就會(huì)報(bào)錯(cuò)。

       

      常量

      不可以被修改的變量,一旦定義成了常量,修改這個(gè)值會(huì)報(bào)編譯錯(cuò)誤。代碼寫法如下:

      Const p = 3.14

      FOR循環(huán)

       

      上述代碼for循環(huán)是:i從11循環(huán)到20,步長(zhǎng)是1(循環(huán)一次加1)

      注意:For循環(huán)結(jié)束處的 Next i,i可以省略不寫。(for循環(huán)套for循環(huán)的時(shí)候建議寫,否者不知道那個(gè)結(jié)束end是屬于哪個(gè)for循環(huán)的)

      如果步長(zhǎng)是每次增加1,step 1也可以省略不寫。其他情況例如遞減需要寫成step -1。

      (使用tab鍵讓代碼縮進(jìn)關(guān)系統(tǒng)一)

      While循環(huán)

      第一種:

      While  Cells(1,2) <> “”

             …

      Wend

      第二種:(常用)

      Do While Cells(1,2) <> “”

             …

      Loop

       

      例子代碼:遍歷每一個(gè)sheet頁(yè),計(jì)算每一個(gè)sheet頁(yè)面的指定表格數(shù)據(jù)

       

      IF ELSE

      1、基本用法

      下面的宏關(guān)聯(lián)按鈕后,點(diǎn)擊按鈕會(huì)根據(jù)A1和A2單元格的值在A3中寫入合格或不合格,以下就是if else的用例:

      Sub ifElseTest()

          Dim score1, score2

          score1 = Cells(1, 1)

          score2 = Cells(1, 2)

          '當(dāng)A1和A2單元格都大于60的時(shí)候,A3單元格顯示合格

          If score1 > 60 And score2 > 60 Then

              Cells(1, 3) = "合格"

          Else

              Cells(1, 3) = "不合格"

          End If

      End Sub

      2、如果判斷語(yǔ)句寫在同一行,那么可以不寫End IF,例:

      If score1 > 60 Then  Cells(1, 3) = "合格"

      3、ElseIf:(ElseIf 是一個(gè)關(guān)鍵字)

       

       

      關(guān)系運(yùn)算符

      大于:>    小于:<    大于等于: >=   小于等于:<=    不等于: <>   等于:=

      邏輯運(yùn)算符

      與:And   或:or   非:not

      字符串

      字符串連接用&符號(hào),記得字符串用&連接時(shí),字符串與&符號(hào)之間一定要有空格,否者會(huì)引發(fā)歧義。

          str1 = "a"

          str2 = "b"

          Cells(2, 1) = Cells(2, 1) & str1 & str2

      程序調(diào)試debug

      1、設(shè)置斷點(diǎn):直接在vba編輯器中找到要調(diào)試的代碼,點(diǎn)擊左側(cè)豎欄,生成斷點(diǎn)。運(yùn)行程序代碼會(huì)到此處停下。

       

      2、單步執(zhí)行 F8  (VBA編輯器點(diǎn)開(kāi)“調(diào)試”,里面能看到所有調(diào)試方法和快捷鍵)

       

      3、添加監(jiān)視:

       

       

       

      4、報(bào)錯(cuò)自動(dòng)定位:

      如果運(yùn)行時(shí)代碼出錯(cuò),VBA會(huì)彈出提示出錯(cuò),點(diǎn)擊彈出框的“調(diào)試”,會(huì)自動(dòng)定位到出錯(cuò)行

       

       

      宏操作excel

      設(shè)置單元格字體顏色

      Sub setCellsStyle()

          '把A1到C2之間(矩形的左上角與右下角范圍)所有單元格字體變?yōu)榧t色

          Range("A1:C2").Font.Color = -16776961

      End Sub

       

      根據(jù)上例發(fā)現(xiàn),Excel中每一個(gè)元素的操作都有對(duì)應(yīng)的對(duì)象,例如Cells就是操作單元格的,Range就是范圍操作單元格的,對(duì)應(yīng)的excel中各種圖形等都有固定的調(diào)用方法,但是我們不可能記住每一種圖形的調(diào)用對(duì)象,所以我們可以利用excel錄制宏的方法操作格個(gè)圖形對(duì)象,然后看錄制宏的代碼,就知道了每種對(duì)象如何調(diào)用。

      錄制宏-參照宏代碼

      Excel提供了一種記錄我們操作excel動(dòng)作的“錄制宏”功能,只要我們記錄住操作excel的動(dòng)作,再執(zhí)行錄制的宏,excel就會(huì)重復(fù)我們錄制的動(dòng)作。我們可以查看excel生成的代碼,了解這些宏如何操作控件,從而根據(jù)這些代碼來(lái)完成我們的代碼。

      例:我們想知道刪除行的代碼如何操作

      1、點(diǎn)擊錄制宏

       

      2、彈出我們要錄制的宏定義,可以直接點(diǎn)擊確定

       

      3、我們刪除一行代碼,然后點(diǎn)“停止錄制”

       

      4、發(fā)現(xiàn)我們的代碼里生成了一段這樣的代碼

      Sub 宏2()

      ' 宏2 宏

          Rows("4:4").Select

          Selection.Delete Shift:=xlUp

      End Sub

      紅色部分就是刪除行的代碼,可以解釋為:刪除第四行(從第四行到第四行)

      5、這樣我們就可以開(kāi)發(fā)一個(gè)程序,把第一列單元格內(nèi)容小于10的進(jìn)行行刪除。

      先建立一個(gè)按鈕,關(guān)聯(lián)宏方法deleteRow()

      Sub deleteRow()

          '從20行遍歷到第1行(刪除應(yīng)該倒序遍歷,因?yàn)閕ndex有變化)

          For i = 20 To 1 Step -1

              If Cells(i, 1) <= 10 Then

                  '刪除第i行

                  Rows(i & ":" & i).Select

                  Selection.Delete Shift:=xlUp

              End If

          Next i

      End Sub

       

      對(duì)象編程excel

      主要類

      VBA也把excel的各種控件分裝成了對(duì)象,可以調(diào)用這些定義好的類、屬性、方法操作控件。

      這里的類、屬性、方法與Java在概念上一致。

      以下是調(diào)用操作excel常用的類:(當(dāng)這些類被創(chuàng)建對(duì)象,每個(gè)對(duì)象就代表具體的excel相應(yīng)控件)

      Application :正在運(yùn)行的excel系統(tǒng)本身

      WorkBook :代表一個(gè)打開(kāi)的excel文件也成為工作簿 (打開(kāi)的一個(gè)excel文件就是一個(gè)工作簿)

      WorkSheet :代表一張工作表,也是一個(gè)sheet頁(yè)

      Range :代表一個(gè)或多個(gè)單元格組成的內(nèi)容區(qū)域。

      因?yàn)橐粋€(gè)application中有多個(gè)工作簿,一個(gè)工作簿(WorkBook)中有多個(gè)工作表

      (WorkSheet),一個(gè)工作表包含多個(gè)單元格。

      所以Application類里有一個(gè)屬性是WorkBooks,他是一個(gè)集合,用來(lái)存放多個(gè)WrokBook。

      WorkBook下也有一個(gè)屬性,是一個(gè)集合,用來(lái)存放工作表,這個(gè)屬性就是WorkSheets。

      WorkSheet下也有一個(gè)屬性,用來(lái)存放一個(gè)單元格對(duì)象,屬性是Cells

       

      WorkBook 

      工作簿

      Application 

      Excel系統(tǒng)

      WorkSheet

      工作表

       

      Range

      單元格內(nèi)容區(qū)域

      多個(gè)單元格對(duì)象

      WorkBooks

      存放WorkBook的集合

       

      WorkSheets

      存放WorkSheet的集合

       

      Cells

      一個(gè)單元格個(gè)對(duì)象

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

       

      使用類操作excel

      1、定義一個(gè)變量,變量類型是WorkSheet,寫法如下:

         Dim  w1  As  WorkSheet

      2、給一個(gè)屬于復(fù)雜類型的變量賦值,需要加關(guān)鍵字Set,寫法如下:

         Set  w1 = WorkSheets(i);

      例子:

      Sub test1()

          '定義一個(gè)變量存放sheet對(duì)象

          Dim w1 As Worksheet

          Dim i

          '遍歷所有sheet頁(yè)

          For i = 1 To Worksheets.Count

              Set w1 = Worksheets(i)

              '讓每個(gè)sheet頁(yè)面的10行1列都等于自己的sheet名

              w1.Cells(10, 1) = w1.Name

          Next i

      End Sub

      新建一張工作表

      WorkSheet的Add方法:在所屬工作簿的文件中新建一個(gè)工作表(sheet頁(yè))

      新建工作表例子代碼:

      Sub test2()

          '定義一個(gè)變量存放sheet對(duì)象

          Dim w1 As Worksheet

          '在本工作簿中新建一個(gè)sheet頁(yè)

          Set w1 = Worksheets.Add

          '設(shè)定新建工作簿名

          w1.Name = "new sheet"

      End Sub

      獲取工作表對(duì)象

      1、按sheet頁(yè)所在順序取工作表對(duì)象:

      例:取第二個(gè)sheet頁(yè)

      Dim w1 As Worksheet

      Set w1 = Worksheets(2)

      2、按sheet頁(yè)名字取工作表對(duì)象

      Dim w1 As Worksheet

      Set w1 = Worksheets(“new test”)

       

      過(guò)程(宏)調(diào)用

      過(guò)程調(diào)用用Call關(guān)鍵字,例:

      Sub test3()

          Dim w1 As Worksheet

          Set w1 = Worksheets.Add

          w1.Name = "new"

      End Sub

       

      Sub test4()

          '調(diào)用過(guò)程test3

          Call test3

      End Sub

      Call關(guān)鍵字可以省略

       

       

      函數(shù) Function

      函數(shù)是過(guò)程的一種,在執(zhí)行結(jié)束后能將運(yùn)行結(jié)果返回給調(diào)用者

      函數(shù)需要不用Sub關(guān)鍵字,用Function,函數(shù)追后一行寫上:函數(shù)名 = 要返回的值

      這樣調(diào)用這個(gè)函數(shù)的過(guò)程可以通過(guò)變量接受這個(gè)函數(shù)。

       

      函數(shù)可以在excel的單元格中當(dāng)成公式使用

      在單元格中可以寫入公式:

       

       

      系統(tǒng)常用函數(shù):處理字符串函數(shù)

      1、Len(str) 返回字符串長(zhǎng)度

       

      點(diǎn)三角箭頭運(yùn)行,彈出str字符串的長(zhǎng)度

       

       

      2、Trim(str) 去除兩邊空格

      3、Replace(str,a,b)把字符串str中所有a都替換成b

      4、Lcase(str) 所有英文字母都編程小寫

         Ucase(str) 所有英文字母都編程大寫

      5、Left(str,3)把字符串str從左邊取3個(gè)字符

         Right(str,3)把字符串str從右邊取3個(gè)字符

      6、Mid(str,2,5) 把字符串str從第二個(gè)字符開(kāi)始,取五個(gè)字符

      7、InStr(str,”a”) 在str中尋找a出現(xiàn)的位置,如果沒(méi)找到返回0

         InStr(3,str,”a”) 在str中,從第3個(gè)字符開(kāi)始尋找a出現(xiàn)的位置

      For Each

       

       

      操作多個(gè)excel文件()

      1、WorkBooks.open(文件名) 指定路徑打開(kāi)excel文件

       

      2、Close關(guān)閉操作的工作簿

      上例代碼最后加入如下代碼:

      wb.Close

      3、新建一個(gè)工作簿

      WorkBooks.Add

       

      Range單元格對(duì)象

      Cells是定位單元格用的,并不是單元格對(duì)象,單元格對(duì)象類是Range

      Cells的寫法是我們平時(shí)的簡(jiǎn)寫,如果寫全應(yīng)該是如下格式:

                      

      1、Range屬性

      返回任意單元格范圍:Range(“D5”) , Range(“B3 : F7”)

       

      也可以用下面方法定位左上角和右下角位置,定位到單元格范圍:

       

      2、修改Range范圍內(nèi)單元格內(nèi)容

           

      3、清除范圍內(nèi)單元格內(nèi)容

       

      例子代碼:

       

      4、Range的Font屬性

       

      還有color 字體顏色 Bold字體粗細(xì) 等屬性

      例子代碼:

       

      5、Range.Interior屬性:

       

      6、clear清除

       

      7、Range.Merge合并單元格:將Range范圍內(nèi)單元格合并為一個(gè)單元格

         Range.UnMerge拆分單元格: 將Range范圍內(nèi)單元格拆分為一個(gè)個(gè)單元格

      合并共同前綴代碼 with

       

      以上代碼可以用with改寫為下面的代碼:

       

      Application對(duì)象

      1、默認(rèn)直接調(diào)用的屬性是Application的屬性

      代碼中我們控制一個(gè)單元格常常這么寫:

      Cells(3,5) = “text”

      那么Cells是誰(shuí)的屬性呢?如果我們用以下寫法:

      Dim  w  As  Worksheet

      Set  w  = Worksheets(1)

      w.Cells(3,5) = “text”

      那么我們知道Cells是Worksheet的屬性,而直接寫Cells,那么他是Application的屬性

      等同于:

      Application.Cells(3,5)=”test”

      Application代表所有打開(kāi)的excel工作表里,當(dāng)前正在被我們編輯的工作表(sheet),也可以理解為當(dāng)前正在顯示的工作表。Application可以默認(rèn)不寫。

      同理直接調(diào)用的這個(gè)代碼:Range(“E3”)=7,這個(gè)Range屬性也是Application下的屬性。

       

      2、Application.ActiveWorkbook:

      當(dāng)前正處于激活狀態(tài)的工作簿(即活動(dòng)工作簿)對(duì)象

       

      3、Application.ActiveSheet:

      當(dāng)前正處于激活狀態(tài)的工作表(即活動(dòng)工作表)對(duì)象

       

      例:記錄我們當(dāng)前工作簿的對(duì)象,在操作變化后,能找到當(dāng)初的對(duì)象

      Dim w1 As Workbook, w1 As Wrokbook

      Set w1 = Application.ActiveWorkbook

      Set w2 = Workbooks.Add

      w2.Wroksheets(1).Cells(2,2) =”a”;    '操作新建工作簿的第一個(gè)工作表的2行2列單元格個(gè)

      w1.Wroksheet(1).Cells(3,5) = “b”    '操作當(dāng)初工作簿第一個(gè)工作表的3行5列單元格個(gè)

      以上這個(gè)代碼的功能就是利用Application記住了當(dāng)初的操作文件,即使操作其他文件后,也能夠找到原來(lái)的操作文件。

      4、Application.WorksheetFunction.公式名:

      在VBA代碼中直接調(diào)用Excel表格公式

      例如:獲取B2到D7單元格中最大的值

      M = Application.WorksheetFunction.Max(Range(“B2:D7”))

      也可以寫成:

      Set r = Range(Cells(2,2),Cells(7,4))

      M = Application.WorksheetFunction.Max(r)

      5、Application.DisplayAlerts

      是否顯示Excel警告框。

      例如保存一個(gè)文件代碼如下:

      W2.SaveAs(“xxx.xlsx”)

      W2.Close

      執(zhí)行第一次,很自然生成了一個(gè)xxx.xlsx文件保存到當(dāng)前目錄,但是再執(zhí)行這個(gè)程序,每次都提示是否覆蓋,用Application可以關(guān)閉這個(gè)提示,直接覆蓋。

      在代碼中寫入:Application.DisplayAlerts = false

      再執(zhí)行保存文件代碼,文件直接覆蓋,不再提示是否覆蓋。

      記得操作完后,在調(diào)用close后,一定要再讓Application.DisplayAlerts = true,

      否者excel任何操作都不在彈出提示信息。

      6、Application.quit

      退出excel

       

      VBA筆記進(jìn)階篇

      數(shù)據(jù)類型

      常用類型

      字符型:Dim str As String

                    str = “TEST”

      整數(shù)型:Dim strLen As Integer

                    strLen = 3

      變體型:不定義類型,根據(jù)賦值的數(shù)據(jù)類型定義類型(可以調(diào)整賦值來(lái)變化數(shù)據(jù)類型)

      Dim str

              str = “TEST”

      變體類型缺點(diǎn):

      1、效率低,速度慢,因?yàn)槌绦蛎看味家袛噙@個(gè)數(shù)據(jù)是什么類型

      2、一旦單元格被設(shè)置成文本類型,從單元格抓取數(shù)據(jù),會(huì)把數(shù)字型當(dāng)成字符型處理

       

      注意:Dim a ,b As String  a是變體類型,b是整數(shù)型

      Dim a As Integer, b As String   a 和 b 都是整數(shù)型

      + 和 & 的 區(qū)別

      加號(hào)只能鏈接兩邊都是字符串的數(shù)據(jù),而&可以連接字符型也可以連接數(shù)字型

      其他類型:

      Integer:占用內(nèi)存2字節(jié),不支持小數(shù),取值范圍:-32768 到 + 32768

      Long:占用內(nèi)存4字節(jié),不支持小數(shù),取值范圍:-2147483648到 + 2147483648

            循環(huán)工作表最好用Long類型數(shù)據(jù)

      Double:占用內(nèi)存8字節(jié),支持小數(shù),有誤差

      Currency:占用內(nèi)存8字節(jié),支持小數(shù),固定4位小數(shù),數(shù)據(jù)精確。

      特殊符號(hào)代表數(shù)據(jù)類型

      1、特殊符號(hào)代表數(shù)據(jù)類型

      Dim result As Long

      Result = 30000 * 3

      上面這兩行代碼會(huì)報(bào)錯(cuò),因?yàn)?0000*3的結(jié)果會(huì)存放到臨時(shí)空間然后再賦值給result,即使result是Long型,能裝下這個(gè)結(jié)果,但是臨時(shí)空間是Integer,所以臨時(shí)空間報(bào)錯(cuò)。之所以臨時(shí)空間是Integer型,是因?yàn)?0000和3都是Integer型數(shù)據(jù),所以臨時(shí)空間會(huì)變?yōu)镮nteger型。所以我們需要讓臨時(shí)空間知道30000需要定義成Long型,寫法如下:

      Dim result As Long

      Result = 30000& * 3

       

      Dim a&, b# 等價(jià)于 Dim a As Long ,b As Double

      所以&作為連接符號(hào)的時(shí)候必須與左右兩邊留有空格,否者會(huì)被當(dāng)成Long類型

      2、下劃線:

      把很長(zhǎng)的語(yǔ)句拆分成若干行書(shū)寫

       

      3、冒號(hào)

      把很多行語(yǔ)句拼接到同一行,不浪費(fèi)空間,代碼整潔。

      a1 = Cells(1, 1): a2 = Cells(1, 2): a3 = Cells(1, 3)

      4、^  冪運(yùn)算

      a的6次方   a ^ 6

      5、 \  只保留整數(shù)部分的除法符號(hào)

      日期型

       

      例:日期格式默認(rèn) 月日年 時(shí)分秒,日期兩邊要有#,聲明式日期

          Dim d1 As Date

          d1 = #1/19/2016 10:10:01 AM#

          MsgBox d1

      1、Date函數(shù) 顯示日期

      Dim d1 As Date

          d1 = Date

      MsgBox d1

      2、Time()函數(shù) 顯示時(shí)分秒

      3、Now()函數(shù) 顯示日期+時(shí)間

      4、解析時(shí)間

       

       

      5、DateDiff函數(shù)

       

       

      6、DateAdd函數(shù)

       

      注意:

      日期型本質(zhì)上就式一個(gè)Double型的數(shù)字,0代表1899年12月30日0時(shí)0分0秒

      整數(shù)部分增減1就式增減1天,小數(shù)部分0.1代表0.1天,即2.4小時(shí)。

       

      邏輯類型 Boolean

      只返回True和False

       

      邏輯關(guān)系運(yùn)算符:

      AND 并且  相當(dāng)于Java的 &&

      OR   或則  相當(dāng)于Java的 ||

      NOT  非    相當(dāng)于Java的 !

      其他

      流程控制:

      Do While 用法補(bǔ)充

      靠條件控制,不再進(jìn)行下一次循環(huán)

       

      Exit語(yǔ)句

      直接跳出一個(gè)循環(huán)結(jié)構(gòu)或一個(gè)子過(guò)程(函數(shù)),

      比如退出Do While循環(huán),可以寫做Exit Do

      如果是結(jié)束for循環(huán)就是 Exit For,退出函數(shù)用 Exit Sub

      用Exit退出,Exit下面的代碼將不再執(zhí)行

      注意:

      1、Do While 可以用Exit Do結(jié)束循環(huán),While無(wú)法使用Exit結(jié)束循環(huán),所以處理循環(huán)不要用While

      2、Exit 和Java中的break一樣,當(dāng)用在嵌套循環(huán)中,只能結(jié)束當(dāng)前這個(gè)循環(huán),不能結(jié)束所有循環(huán)。

      GoTo 語(yǔ)句

      直接跳轉(zhuǎn)到指定標(biāo)簽位置:

       

      因?yàn)镚oTo語(yǔ)句太過(guò)隨意,容易造成代碼混亂,不建議使用,只建議在處理異常中使用,如下節(jié)

      On Error GoTo MyError

      這個(gè)語(yǔ)句的意思是:從下一句開(kāi)始,一旦發(fā)生錯(cuò)誤就直接跳轉(zhuǎn)到MyError標(biāo)簽處繼續(xù)運(yùn)行

       

      On Error Resume Next

      從下面開(kāi)始,如果某行運(yùn)行錯(cuò)誤,就忽略它并繼續(xù)執(zhí)行

       

      函數(shù)

      IsDate

      驗(yàn)證數(shù)據(jù)是否是日期型,是日期型返回True

      例如:驗(yàn)證單元格1行1列是否是日期型:

      If IsDate(Cells(1,1)) = True Then

             Cells(1,1) = DataAdd(“d”,38, Cells(1,1))

      End If

      IsNumeric

      如果x是某種數(shù)值類型,比如Integer,Long,Single,Double,Currency等,函數(shù)返回True,如果是其他類型返回False。

       

      TypeName

      返回?cái)?shù)據(jù)類型的類名

      例如:TypeName(“test”) 返回String字符串

      數(shù)據(jù)類型的轉(zhuǎn)換函數(shù)

      Cbool,Cdate,CStr,Cint,CLng,CDbl,Ccur,Csng,Cbyte,Cdec

       

       

      VBA中可以自動(dòng)類型轉(zhuǎn)換,不加這些轉(zhuǎn)換函數(shù)也可以,但是加了會(huì)讓代碼更加清晰。

      如果Double轉(zhuǎn)換成Integer會(huì)進(jìn)行四舍五入,到那時(shí)他的這個(gè)四舍五入規(guī)則與我們的不同,用的是銀行家舍入法:

       

      Excel工作表中只能存放1900年以后的日期,如果想存放更之前的日期就需要用Cstr把日期型轉(zhuǎn)換成字符型,然后存放到excel中。

      四舍五入函數(shù)

      VBA中的Round(x,n)也是用的銀行家舍入法,對(duì)x進(jìn)行四舍五入,并保留小數(shù)點(diǎn)后n位數(shù)字。

      如果想使用我們平時(shí)用的規(guī)則,需要用excel中的公式:

      Application.WorksheetFunction.Round(x,2)

      Int(x)

      如果不是excel文件中沒(méi)有上面這個(gè)函數(shù)我們可以用Int()函數(shù)幫忙實(shí)現(xiàn)四舍五入的功能

      Int(x)函數(shù),返回一個(gè)不大于x的最大整數(shù),例如:

       

      所以用如下這個(gè)公式就可以實(shí)現(xiàn)四舍五入:

             i = Int(x+0.5)

      負(fù)數(shù)的四舍五入規(guī)則不一,本方法將-2.5舍入為-2,所以需要根據(jù)業(yè)務(wù)來(lái)確定是否符合規(guī)定

      Asc和Chr

      Asc(“A”)  把字符A轉(zhuǎn)換成ASCII碼

      Chr(65)   把ASCII碼轉(zhuǎn)換成對(duì)應(yīng)字符

      所有的字符都可以轉(zhuǎn)換成數(shù)字來(lái)表示,ASCII就是一種編碼格式。

      所以字符和數(shù)字可以靠上面的兩個(gè)函數(shù)來(lái)回轉(zhuǎn)換

      用途:

      1、如果需要在字符串中加入換行符,就需要用到上面的函數(shù)。例:

       Str = “xxxxxxxxxxxxxxxxxx” & Chr(13) & Chr(10) & “xxxxxxxxxxxxxxxxxxx”

       

      2、如果想把a(bǔ)到z打印到excel中,可以使用如下寫法:

      For i=65 To 90

             Cells(i-63,2) = Chr(i)

      Next i

      我們想把數(shù)字轉(zhuǎn)換成對(duì)應(yīng)的字母,都可以用Char函數(shù)解決

       

      3、比較字符大小,可以讀取字符的每一個(gè)字母,用Asc函數(shù)轉(zhuǎn)換成ASCII碼,然后比較大小。

      ASCII碼轉(zhuǎn)換表:

       

      數(shù)組 Array

      定義一個(gè)數(shù)組變量:Dim my_arr(9) As String

      解釋:

      1、變量后面帶括號(hào)代表是數(shù)組類型,括號(hào)里放數(shù)組最大下標(biāo),

      2、數(shù)組下標(biāo)從0開(kāi)始,這里會(huì)放10個(gè)數(shù)

      3、字符型數(shù)組

      例:

       

      自定義數(shù)組下標(biāo):

      Dim arr (3 To 6)

      讓變體(因?yàn)檫@里沒(méi)指定數(shù)組類型 )數(shù)組arr的最小下標(biāo)為3,最大為6,改數(shù)組的元素包括 a(3) a(4) a(5) a(6)

      Lbound(arr)返回?cái)?shù)組最小下標(biāo)

      Ubound(arr)返回?cái)?shù)組最大小標(biāo)

      以上兩個(gè)函數(shù)的結(jié)果可以給for循環(huán)數(shù)組開(kāi)始接受位置用

      Split函數(shù)

      Split(待拆分的字符串,分割符字符串)

      將字符串按照指定分隔符拆分成多個(gè)字串,返回一個(gè)數(shù)組

      Dim arr() As String

      arr=Split(Cells(1,1),”,”)

       

      For Each 循環(huán)

      下面x代表數(shù)組每一個(gè)元素,a是數(shù)組

             For Each x In a

                    str = x

             Next x

       

       

      文本處理

      讀取文本文件

      VBA讀取文件流程

      1、打開(kāi)文件

      Open “d:\demo\client.text” For Input As #1

      For Input 代表輸入。#1代表代號(hào),這個(gè)被打開(kāi)文件的代號(hào)。

      2、讀取一行內(nèi)容

      Line Input #1,s (讀取#1代表的文件一行記錄,每執(zhí)行一次這句代碼就會(huì)讀取一行,執(zhí)行幾次讀取幾行)

      3、是否已讀取到末尾

      EOF(1) 讀取#1代表的文件,如果讀取到末尾這個(gè)函數(shù)返回True

      4、關(guān)閉文件

      Close #1  關(guān)閉#1代表的文件

      例:

       

      寫入文本文件:

      1、打開(kāi)寫入文本文件

      Open “d:\demo\client.text” For Output As #1

      寫入一個(gè)文件,如果有同名文件會(huì)覆蓋,沒(méi)有此文件會(huì)創(chuàng)建

      Open “d:\demo\client.text” For Sppend As #1

      追加內(nèi)容寫入文件,不會(huì)覆蓋原文件內(nèi)容

      2、寫入一行

      Print  #1  “xxxxx”;   莫非帶分號(hào),再次寫入,同行追加

      Print  #1  “xxxxx”   末尾空白,再次寫入,字符會(huì)換行

      3、關(guān)閉文件

      Close #1

      Dir函數(shù)讀取目錄所有文件

      讀取目錄下所有文件

      打開(kāi)一個(gè)目錄,目錄結(jié)尾必須是“\”,f是返回的一個(gè)文件名

      f = Dir("c:\testfile\")

      然后每執(zhí)行一次f = Dir都返回一個(gè)目錄下的文件名

      Sub test8()

         Dim f As String

         f = Dir("c:\testfile\")

         Do While f <> ""

             MsgBox f   '彈出文件名

             f = Dir      '讀取下一個(gè)文件名

         Loop

      End Sub

       

      打開(kāi)一個(gè)目錄下所有excel文件轉(zhuǎn)換成Wrokbooks對(duì)象:

      Set w = Wrokbooks.Open(path & fileName)

       

      讀取指定文件

      只想打開(kāi)xlsx結(jié)尾的文件:

      用這個(gè)判斷語(yǔ)句 If Lcase(Right(fileName,5)) = “.xlsx”

      更高級(jí)的寫法:

      fileName = Dir(“d:\test\*.xlsx”)

      判斷目錄是否存在                                

      判斷文件是否存在

      Dir(“目錄文件名”)返回空字符串證明沒(méi)有這個(gè)文件

      返回目錄和子目錄下所有文件名:

      只返回一層子目錄

      f = Dir(“D:\test\”,”vbDirectory”)

      返回目錄下所有文件和所有子目錄文件

      需要用到遞歸方法

      判斷是文件夾:

      GetAttr(“file dir”) And vbDirectory = vbDirectory

       

       

      Range對(duì)象高級(jí)使用

      Range代表單元格區(qū)域?qū)ο?(可以理解為單元格二維數(shù)組)

      Range對(duì)象位置有關(guān)屬性:

      1、Range.Row 該Range左上角單元格的行號(hào)

      2、Range.Column 該Range左上角單元格的列號(hào)

      3、Range.Address該Range各個(gè)對(duì)焦頂點(diǎn)的絕對(duì)引用地址。

      Set r = Range(“B3:D9”)    r.Address返回“$B$3:$D$9”

      注意:

      當(dāng)Range包含多個(gè)矩形區(qū)域時(shí),Row和Column只返回其中某一個(gè)矩形的左上角位置,并不一定是整個(gè)Range的左上角。

      比如Range(“D3:E4,A1:B2”)的Row和Column返回的可能是第3行第4列,而非第一行第一列

      Range對(duì)象范圍有關(guān)的屬性:

      1、Range.Count 該Range中的單元格數(shù)量

      注意:Range對(duì)象由多個(gè)矩形區(qū)域構(gòu)成時(shí),個(gè)矩形相互重疊的單元格會(huì)被重復(fù)計(jì)算。

            Count計(jì)算的其實(shí)是對(duì)象而非單元格個(gè)數(shù),而且當(dāng)數(shù)量太大時(shí)會(huì)發(fā)生溢出錯(cuò)誤,所以計(jì)算單元格格最安全的方法是Range.Cells.CountLarge

      2、Range.Rows 容納了該Range中的每一行,可以使用Range.Rows(n)得到一個(gè)新的Range對(duì)象,代表該區(qū)域第n行的所有單元格。

      注意:如果Range是由多個(gè)矩形區(qū)域構(gòu)成,Rows只代表其中某一個(gè)矩形區(qū)域的所有行。

      例子:Set a = Range(“C4:E12”)

            a.Select  '將Range對(duì)象全部選中(方便看現(xiàn)象)

            Set rw = a.Rows(2)  '把Range中的第二行全部取出,rw對(duì)象還是一個(gè)Range    

      3、Range.Columns 容納了該Range中的每一列,可以使用Range.Columns(n)得到一個(gè)新的Range對(duì)象,代表位于該區(qū)域第n列的所有單元格。

      4、Range.Cells(1,1) 取Range范圍內(nèi)的第一行第一列單元格

      特殊的Range對(duì)象

      1、代表工作表(sheet)中全部單元格的對(duì)象

      WorkSheet的屬性Cells

      取得最大行號(hào):ActiveSheet.Cells.Rows.Count

      2、代表工作表(sheet)中全部被使用過(guò)的單元格(有效單元格,包含所有數(shù)據(jù))Range對(duì)象

      WorkSheet的UsedRange屬性

      返回一個(gè)矩形區(qū)域的Range對(duì)象,正好能夠容納這個(gè)工作表中所有使用過(guò)的單元格。

      注:即使一個(gè)單元格修改過(guò)格式?jīng)]有填寫內(nèi)容也會(huì)被認(rèn)為是被使用過(guò),有些情況下單元格內(nèi)容被刪除清空后仍可能被認(rèn)為是使用過(guò)的。

      例子代碼:把使用過(guò)的單元格選中

       

      獲取該行最后一行的行號(hào):r.Row + r.Rows.Count -1 (左上角起始行號(hào)+Range范圍行數(shù)-1)

      Range轉(zhuǎn)化二維數(shù)組(提高讀寫excel效率)

      如果我們的表格中有大量的單元格要讀取,用平時(shí)我們用的Cells一個(gè)個(gè)單元格個(gè)讀取效率將會(huì)非常低下,所以我們可以把要讀取的單元格范圍(Range)轉(zhuǎn)化成二維數(shù)組,然后讀取數(shù)組獲得內(nèi)容。

      二維數(shù)組 Dim arr(3,5) As Long  有4行6列個(gè)元素(起始位置從0開(kāi)始)

      如果只想二維數(shù)組返回三行五列并且從1開(kāi)始,可以寫成

      Dim arr(1 To 3, 1 To 5) As Long

      Ubound(arr,1)  二維數(shù)組第1行數(shù)據(jù)的最大下標(biāo)

      Lbound(arr,1)  二維數(shù)組第1行數(shù)據(jù)的最小下標(biāo)

      把Range對(duì)象轉(zhuǎn)換為二維數(shù)組的寫法

      Dim arr()

      arr=Range(“A2:C3”)

      注意:Range轉(zhuǎn)換成二維數(shù)組,數(shù)組的下標(biāo)是從1開(kāi)始(與Cells的下標(biāo)規(guī)則一樣)

      例:

       

      1、如果讀取的范圍操作Range的返回會(huì)發(fā)生下標(biāo)越界錯(cuò)誤

      2、截取Range的數(shù)組,聲明的時(shí)候必須是動(dòng)態(tài)數(shù)組(數(shù)組后面的括號(hào)里不寫下標(biāo)范圍)

      3、這個(gè)數(shù)組必須是變體類型,不能聲明成具體數(shù)據(jù)類型。

      4、Range中即使只有一行數(shù)據(jù),轉(zhuǎn)化成數(shù)組后也是二維數(shù)組,是一個(gè)1行多列的二位數(shù)組。

      把數(shù)組寫入Range中

      Dim s(2,3) As Integer

      S(0,0)=1 : S(0,1)=2: S(0,2)=3: S(1,0)=4 : S(1,0)=5: S(1,0)=6

      Range(“b2:e4”) = s

       

       

       

      如果想把一個(gè)維數(shù)組放到execel的一列中,需要使用矩陣轉(zhuǎn)置函數(shù)

      Range(“c2:f2”) = Application.Transpose(s)

      遍歷Range

      Range的結(jié)構(gòu)可以理解成一個(gè)二維數(shù)組的結(jié)構(gòu),我們可以用雙重循環(huán)遍歷Range,如果我們不關(guān)心Range每個(gè)單元格的具體行號(hào),只是單純的遍歷處理,那么我們可以用Each方式遍歷Range的每一個(gè)單元格。

      例:取出所有被使用的單元格,單元格個(gè)內(nèi)容是紅色的相加

      Dim r As Range,r1 As Range

      Set r = w.UsedRange '取出所有被使用的單元格

      For Each r1 In r

             If r1.Font.Color = vbRed Then

                    s = s + r1.Value

             End If

      Next r1

      拆分成兩個(gè)處理:(調(diào)用函數(shù))

       

       

      Range.HasFormula屬性

      當(dāng)Range是一個(gè)單元格時(shí),此屬性查看單元格中是否有公式,由公式這個(gè)屬性返回True,沒(méi)有返回False

      Range.Formula屬性

      當(dāng)Range是一個(gè)單元格時(shí),如果單元格是公式則返回公式文本,如果沒(méi)有公式則與Value屬性一樣返回單元格的內(nèi)容。

      Range的Value屬性,如果單元格是公式,Value返回的是公式的結(jié)果

      如果想把一個(gè)單元格設(shè)置成一個(gè)公式,F(xiàn)ormula和Value都可以:

       

      Range的下標(biāo)

      當(dāng)我們得到一個(gè)Range對(duì)象,要遍歷Range的對(duì)象的時(shí)候下標(biāo)是從1開(kāi)始,無(wú)論這個(gè)Range的單元格在sheet中的什么位置。而Cells讀取單元格的下標(biāo)都是根據(jù)單元格相對(duì)于sheet中位置定的,必須是從sheet的1,1開(kāi)始。

      所以遍歷Range,定義范圍可以用如下方法

       

      Application.Union方法

      把多個(gè)Range對(duì)象聯(lián)合成一個(gè)新的Range對(duì)象

      Dim r As Range

      Set r = Union(Range(a1:b2), Range(c1:d2), Range(e1:f2))

      但是Range的區(qū)域如果有重合,新合并的Range會(huì)有重復(fù)單元格

      Application.Intersect方法

      找到同時(shí)屬于多個(gè)Range的單元格(各Range重合的部分),作為一個(gè)新的Range對(duì)象返回。下圖紫色部分就是找出的重合部分

       

      Range.CurrentRegion屬性

      返回一個(gè)包含了這個(gè)Range的最大連續(xù)使用區(qū)域。該區(qū)域與其他任何已使用單元格都不鄰接。如下圖通過(guò)藍(lán)色部分找到藍(lán)色區(qū)域所在表的所有單元格對(duì)象,返回一個(gè)Range對(duì)象。

       

      例子:找到有“上海市”這幾個(gè)字的單元格,把這個(gè)單元格所在的表變色

       

      Range.Resize屬性:

      以該當(dāng)前Range的左上角單元格為原點(diǎn),生成一個(gè)指定大小的新的Range對(duì)象并返回。

       

      上面兩句可以合并寫成:

      Range.Offset屬性

      按照Range的大小,根據(jù)指定的距離平行移動(dòng),從而得到一個(gè)新的同形狀的Range。

       

      Range.Rows與Worksheets.Rows (Columns)

      選中Range的第一行數(shù)據(jù)

          Dim r As Range

          Set r = Range("A1:H100")

      r.Rows(1).Select

      選中當(dāng)前sheet頁(yè)的第二行數(shù)據(jù)

          Dim r As Range

          Set r = ActiveSheet.Rows(2)

          r.Rows(1).Select

      Range.Rows與Worksheets.Rows均可以一次返回多行或多列,例如

      Rows(“2:3”)  返回第二行和第三行,返回的結(jié)果還是Range

      Columns(“B:E”)返回B列到E列,返回的結(jié)果還是Range

      合并單元格

      如果D6到E7已經(jīng)合并單元格,我們用For Each遍歷這個(gè)Range對(duì)象

       

      我們會(huì)發(fā)現(xiàn)他程序還是遍歷了4次,而不是一次,程序還是認(rèn)為Range中有4格單元格。但是只有第一個(gè)單元格D6有數(shù)據(jù)(合并單元格中的數(shù)據(jù)),其他單元格都沒(méi)有數(shù)據(jù)。

      結(jié)論:

      1、多個(gè)單元格合并之后,仍被VBA認(rèn)為是各自獨(dú)立的單元格

      2、第一個(gè)單元格的值為合并后顯示的內(nèi)容,其他單元格被認(rèn)為是空值

      Range.MergeCells屬性

      1、當(dāng)該Range完全合并為一個(gè)單元格時(shí),該屬性為True

      2、當(dāng)該Range完全不包含合并單元格時(shí),該屬性為False

      例如上例:Range(“d6:e7”).MergeCells = True

      3、當(dāng)該Range中有合并單元格,還有一部分沒(méi)合并單元格,返回NULL

      判斷是否為Null的時(shí)候要用IsNull函數(shù)

       

      4、把一個(gè)Range對(duì)象合并單元格:

      Range(“A1:B3”).MergeCells = True

      同理,解除合并單元格:

      Range(“A1:B3”).MergeCells = False

      5、VBA還提供了合并和取消合并單元格的方法。

      Range.Merge合并單元格  例: Range(“A1:B3”).Merge

      Range.UnMerge 取消合并單元格Range(“A1:B3”).UnMerge

      Range(“A1:B3”).Merge True這個(gè)寫法是按行合并單元格

      Select

      Range(“A1:B3”).Select

      讓這個(gè)Range的對(duì)象都被選中(和被鼠標(biāo)選中效果一致)

      Dim r As Range

      Set r = Selection  

      獲取鼠標(biāo)選中的單元格,返回一個(gè)Range對(duì)象

      可以根據(jù)錄制宏查看復(fù)制、剪切、添加等功能,結(jié)合鼠標(biāo)選中(Select),做出很多操作excel的功能。

      注意:盡量不要用Select獲取Range對(duì)象,影響性能??梢杂肅ells()等方法代替Select

      提高VBA代碼的性能:

      1、極可能合并不必要的Select和Selection

      2、盡可能刪除不必要的屬性設(shè)置

      3、盡可能減少對(duì)象中“.”的數(shù)量,用With消減“.”的調(diào)用

       

      函數(shù)的高級(jí)使用技巧

      可選參數(shù)

      1、Optional  指定一個(gè)可選參數(shù)

      Function mySumProduct(r As Rage, Optional useColumn As Boolean=False)

      在調(diào)用此函數(shù)的時(shí)候,可以不寫這個(gè)參數(shù),不寫這個(gè)參數(shù)默認(rèn)False

      IsMissing(a)函數(shù)

      判斷一個(gè)可選參數(shù)a是否被提供,如果沒(méi)有提供,則返回True,否則返回False

      要求:該可選參數(shù)必須是變體類型,且不能有默認(rèn)值。

      例子代碼:

       

       

      myFun(3, ,5)這個(gè)寫法是只傳遞第一個(gè)和第二個(gè)參數(shù)。另外還有一個(gè)更好的調(diào)用方法

      2、指定參數(shù)名傳遞參數(shù)

      使用 := 可以按參數(shù)名傳遞參數(shù)數(shù)值

      如上例可以寫成:myFun(a:=3, c:=5)

      Msgbox函數(shù)

      我們常用的Msgbox(彈出對(duì)話框)就是一個(gè)可選參數(shù)

      Msgbox “信息!” , 1 

      第二個(gè)參數(shù)就是彈出畫面的種類,只有確認(rèn)按鈕,有確認(rèn)和取消按鈕等

       

      這些數(shù)字在VBA中有對(duì)應(yīng)的常量,例如:

      Msgbox “信息!” , 1   等價(jià)于 Msgbox “信息!” , vbYesNo

       

      Msgbox還有第三個(gè)可選參數(shù),是顯示titile信息用的

       

      Msgbox的返回值:

      i=MsgBox(“please button”,vbYesNo)

      在彈出的對(duì)話框上選yes,i返回6,選no,i返回7

       

      函數(shù)后面的參數(shù)寫不寫在括號(hào)里:

      調(diào)用函數(shù)決定是否寫括號(hào)的三種情況:

      1、沒(méi)有參數(shù):不寫

      2、有參數(shù),調(diào)用語(yǔ)句處于一行代碼中間:寫

      例1:      x = myFun(3,4,5)

      例2:      If m myFun(3,4,5) >10 Then

      3、有參數(shù),調(diào)用語(yǔ)句獨(dú)占一行代碼:不寫

      例:  Sub demo()

                    myFun 3, 5, 7

             End Sub

      之所以一行Function,不寫括號(hào)是因?yàn)槌绦驎?huì)把這個(gè)代碼當(dāng)成eval計(jì)算(同js的eval方法)

       

      VBA對(duì)象的默認(rèn)屬性

       

      4、如果記不住以上規(guī)則,可以在調(diào)用函數(shù)的時(shí)候加Call

      Call mySub(3,5,7)

      值傳遞和引用傳遞:

      ByRef

      VBA在默認(rèn)情況下都是引用傳遞,如果把一個(gè)變量a傳遞給一個(gè)函數(shù),函數(shù)對(duì)a進(jìn)行了更改,函數(shù)結(jié)束后,a變量的值也會(huì)跟誰(shuí)更改,因?yàn)閂BA是把a(bǔ)這個(gè)對(duì)象傳遞給了函數(shù)。

      ByVal

      如果想讓VBA值傳遞(也就是只把值傳遞給函數(shù),函數(shù)即使修改了參數(shù)的值,也不會(huì)影響函數(shù)外面的變量)代碼寫法:Sub 過(guò)程名(ByVal a As Integer)

       

      Set

      想把一個(gè)對(duì)象賦值給一個(gè)變量必須要用Set,想把一個(gè)基本類型賦值給一個(gè)變量就不用加Set

      例如: Set w = Worksheets(1)

             i = 5

      以上就是VBA的默認(rèn)屬性導(dǎo)致

      Cells(3,2)的默認(rèn)屬性是Value,所以我們想給這個(gè)單元格賦值的時(shí)候可以直接寫Cells(3,2)=1。

      當(dāng)我們寫 r = Cells(3,2)的時(shí)候,VBA不知道你是想把這個(gè)cells的Value賦值給r,還是想把這個(gè)cells對(duì)象賦值給r。所以對(duì)象型賦值要用Set標(biāo)記。

      模運(yùn)算MOD

      MOD相當(dāng)于java的%,求余數(shù)用

      i=7 MOD 4 結(jié)果是3 

      隨機(jī)函數(shù) Random

       

      取0 1 2 3的隨機(jī)數(shù): i=Int(Rnd()*4)

       

      生成a到b之間的隨機(jī)整數(shù)公式:int(Rnd()*(b-a+1)+a)

      Rnd()計(jì)算的是一個(gè)偽隨機(jī)數(shù)

       

      生成沒(méi)有規(guī)律的隨機(jī)數(shù)需要如下操作:

       

      事件處理

      常用事件

       

      用戶在Excel中的一個(gè)操作,或者Excel系統(tǒng)自身的一個(gè)變化,都可以被視作一個(gè)“事件”。Excel會(huì)隨時(shí)監(jiān)聽(tīng)這些事件,并可以根據(jù)編碼的要求,在某個(gè)事件發(fā)生時(shí)自動(dòng)運(yùn)行對(duì)應(yīng)的VBA程序。

      事件發(fā)生在哪里,代碼就要寫在哪里,如果事件是靠工作簿觸發(fā),事件代碼就要寫到工作簿文件中。

          打開(kāi)對(duì)應(yīng)文件后,要起固定的方法名,例如想workbook一打開(kāi)就觸發(fā)事件,就要把代碼寫到ThisWorkbook這個(gè)文件里,而且方法名要叫 workbook_open()

       

       

       

       

      如下圖,在文件中選中Worksheet,在右邊就能看到所有對(duì)應(yīng)sheet的事件名稱。

       

      工作簿常用事件

      新增工作表(sheet)觸發(fā)的事件用Workbook_NewSheet,sh這個(gè)參數(shù)代表剛剛新建的工作表。

       

      例子代碼:

      新建一個(gè)工作表就自動(dòng)在新建的工作表上增加一個(gè)表格:

       

      這樣沒(méi)新建一個(gè)工作表,就會(huì)生成如下表格:

       

      工作表常用事件

      SelectionChange事件,每當(dāng)用戶選中一個(gè)新的單元格時(shí),Selection_Change事件就會(huì)被觸發(fā)。這個(gè)事件帶有一個(gè)參數(shù)Target,代表剛剛被選中的單元格對(duì)象/區(qū)域。

      例如:沒(méi)選中一個(gè)單元格,就彈出這個(gè)單元格的坐標(biāo)。

       

      利用Range的屬性:

      Range.EntireRow   Range所在單元格的整個(gè)行

      Range.EntireColumn   Range所在單元格的整個(gè)列

      做一個(gè)功能鼠標(biāo)選中這個(gè)單元格,單元格的所在行和所在列都改變顏色

       

      效果如下,鼠標(biāo)選中哪個(gè)單元格,單元格所在行和列都變?yōu)樘焖{(lán)色。

       

      注意:這個(gè)事件寫在哪個(gè)sheet里,就哪個(gè)sheet頁(yè)有這個(gè)事件,而不是所有sheet頁(yè)都有這個(gè)事件。

      Sheet事件文件與excel的sheet頁(yè)一一對(duì)應(yīng),見(jiàn)下圖:

       

      所以多個(gè)sheet頁(yè)都想要同一個(gè)事件效果,需要把實(shí)現(xiàn)效果的代碼寫在模塊里,寫一個(gè)子過(guò)程,然后每個(gè)sheet頁(yè)都調(diào)用這個(gè)子過(guò)程就可以了。

      作用域

      變量和過(guò)程(函數(shù))都有作用域

      Private 只能被本模塊內(nèi)部的代碼調(diào)用。

      Public 可以被其他模塊的代碼調(diào)用。

      子過(guò)程和函數(shù)如果指明,默認(rèn)為Public

      變量若不指明,默認(rèn)為Private

      例如:

      Private Function test()

             …

      End Function

      Private Sub Test2()

             …

      End Sub

      防止事件級(jí)聯(lián)

      Worksheet_Change(Target)

      工作表事件,修改單元格內(nèi)容,焦點(diǎn)離開(kāi),會(huì)觸發(fā)。(沒(méi)修改單元格內(nèi)容也會(huì)觸發(fā))

       

      如果我們?cè)赾hange事件發(fā)生后又修改了單元格內(nèi)容,這樣的操作又會(huì)觸發(fā)change事件,然后就引發(fā)了事件級(jí)聯(lián),避免發(fā)生的辦法如下:

       

      下面例子是用Application.EnableEvents=False方法解決級(jí)聯(lián)效應(yīng)

       

        本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評(píng)論

        發(fā)表

        請(qǐng)遵守用戶 評(píng)論公約

        類似文章 更多