VBA新手的自學筆記
最近在做一份實習,但大量的手動Excel操作讓人窒息,被前一份實習慣壞了的我開始重操舊業——自動化。
但是我的直屬上司並不太會編程,所以我現在處於自行摸索現學現賣的情況中orz,也不知道哪裡來的勇氣決定整理一波我的自學成果,希望能讓吃瓜群眾們少走一點彎路。
首先要聲明的是,由於我還是初學者階段,以下文章將會是弱智化教程的路線,請選擇性跳讀並且不要在評論罵我。
一、基礎操作
使用VBA最重要也是最基礎的一點:一定要知道如何打開VBA(微笑)
先打開一個Excel,然後按一下Alt+F11,你就打開了新世界,哦不,VBA的大門。
調試是按F8,可以看到每一行語句的輸出結果,也可以監測你的程序是哪裡出了問題。
當然你也可以按上面那個綠色的小箭頭直接整段運行,然後看著報錯的提示框開始撓頭。
二、表和單元格
對錶的調用有兩種基礎的方法:
Sheets("表名")或者Application.ActiveSheet
前者指定用哪個表,後者調用當前你在使用的那個表
對單元格的調用:Range("單元格"),例如Range("A1")
Range("單元格").Value調用該單元格的真實值,Range("單元格").Text調用該單元格你看到的東西,啥都不寫的話默認是Value
Example: Sheets("Input").Range("A1").Value=Application.ActiveSheet.Range("B2").Value
實現將當前使用表單元格B2的值賦給Input表的A1
三、數據類型
常見的有數值型,字元型,日期型,如果不先定義直接賦值的話,VBA會自己猜一個
Range("A1").Value=5 ->數值型
Range("A1").Value="ABC" ->字元型
Range("A1").Value="2015/9/25" ->日期型
但定義一個新變數更規範的方式是: Dim x as 數據類型
常用的有integer(整數)、single(單精度數值)、string(字元串)、date(日期)
Example:
Range("A1").Value=Format(19850216, "0000-00-00")
Range("A1").Value=Format(Range("B1").Value, "0000/00/00")
順手提供一個將8位數值型假日期轉換為真之日期的方法
四、IF......Then......語句
常用於先做條件判斷再執行相應命令
簡單的IF語句可以寫成一行:
If a>=0 Then b="True" Else b="False"
也可以加入and或者or進行邏輯判斷:
If a>0 and b>0 Then c="True" Else c="False"
If a>0 or b>0 Then c="True" Else c="False"
多層邏輯判斷可用括弧進行輔助:
If a>0 and (b>0 or c>0) Then d="True" Else d="False"
但讓我驚訝的是,VBA似乎沒有in這個運算符(或者是我打開方式不對)
Error:If a in ("Hi" "Hello" "Hey") Then b="True" <-SAS
Error:If a in ("Hi","Hello","Hey") Then b="True" <-SQL
以上兩種寫法均會報錯,於是我寫出了一個宛如智障的語句來實現以上事情:
If a="Hi" or a="Hello" or a="Hey" Then b="True"
打開寫VBA的文章,還順便看到了SAS和SQL,買一送二了嘿嘿
還有以下這件事情,親測也是VBA做不到的
Error: If a="Hi" Then b="True" and c="True" and d="True"
Correct:
If a="Hi" Then
b="True"
c="True"
d="True"
End If
嵌套If語句可以做先後判斷:
If a="Hi" Then If b="Hello" Then c="True"
實現先判斷a的值是否符合要求,再判斷b的值是否符合要求,最後再對c賦值
至於If......Else If......這個語句我怎麼寫怎麼報錯,跳過這個點(尷尬又不失禮貌的微笑)
五、For語句
常用於實現循環
Example:
For i= 1 To 10
Range("A" & i).Value=i
Next i
可實現將A1至A10單元格分別賦值為1到10
For i= 1 To 10
Range("A" & i).Value=Range("B"& i).Value
Next i
可實現將B1至B10單元格的值分別賦給A1至A10單元格
在我各種搜索VBA如何定義和調用宏變數無果之後,自行摸索出來一個做法:
Example:
location_test="E"
For i= 1 To 10
Range(location_test & i).Value="Hi"
Next i
在這裡location_test雖然看上去是一個普通的字元變數,但可實現類似於宏變數的作用,將「Hi」賦給指定行指定列,這裡是指定了E1至E10。
因為這個只是簡單的片段,看上去這麼做完全沒有必要甚至有些無聊,但使用變數代替地址的優點在於可以一定程度上擺脫VBA程序對位置信息的依賴,有更強的適用性,當表的結構發生變動時,修改起來也更加便捷。
六、常用函數
一些Excel里的函數也可以在VBA程序裡面使用,Application.FunctionName可以調用相應函數,如Application.Vlookup,Application.IfError;
除此之外,VBA自身也有大量的函數可以實現相同功能,如VBA.Left, VBA.Right, VBA.Mid,和在Excel的調用方法相同;
值得一提的是,有一些長得很像功能相同的函數在Excel中和在VBA中的參數設置會有些許區別,例如DateDIF函數和VBA.DateDIFF:
DATEDIF(開始日期,結束日期,時間單位):DATEDIF(1989/8/24,2018/9/1,"Y")=29
VBA.DATEDIFF(時間單位,開始日期,結束日期):VBA.DATEDIFF("Y",1989/8/24,2018/9/1)=29
兩個函數名稱相似功能相同,但參數的先後順序不一樣,這個需要注意一下。
而DATE()和VBA.DATE()雖然名字相同但是功能卻不一樣,DATE(Year,Month,Day)用於將輸入的年月日合在一起轉化為日期,而VBA.DATE()用於返回當前系統日期,與DATE()功能相同的函數是VBA.DateSerial(Year,Month,Day)。
然後之後我會寫一個VBA實現自動化報表輸出的實例,就是我這幾天的研究成果,當上述看似基本的東西打出一套組合拳的時候,效果還是蠻驚人的,歡迎指正指導。
如果您路過看到這一篇文章去我的主頁找了VBA實例沒有找到,不用擔心,那就是
我還沒寫......
推薦閱讀: