1、變量
如果給對象項(xiàng)變量賦值,必須用set關(guān)鍵詞
如Set sheet=Activesheet
如果加上Option Explicit則變量必須先聲明后使用
2、設(shè)置函數(shù)為易失性函數(shù),讓自定義函數(shù)也能重新計(jì)算
秩序在Function過程中添加一行代碼即可.
Application.Volatile True ‘將函數(shù)設(shè)置為易失性函數(shù)
3、聲明動態(tài)數(shù)組
(1)可以用 Dim 數(shù)組名稱() As 數(shù)據(jù)類型
(2)可以使用Array創(chuàng)建數(shù)組,如
Dim arr As Variant
arr=Array(1,2,3,4);
(3)可以使用Split
Dim arr2 As Variant
arr=Split(“葉楓”,“張三”);
(4)數(shù)組常用運(yùn)算
UBound(數(shù)組名稱);’數(shù)組的最大索引號
LBound(數(shù)組名稱);’數(shù)組的最小索引號
(5)用Join函數(shù)將一位數(shù)組合并組合成字符串
arr=Split(“葉楓”,“張三”);
Txt=Join(arr,”,”); ‘第二個參數(shù)為分隔個元素的分隔符,如果省略,默認(rèn)使用空格。
(6) 將數(shù)組中的數(shù)據(jù)寫入單元格區(qū)域
arr=Split(1,2,3,4,5,6);
Range.(“a1:A6”).Value=Application.WorksheetFunction.trasnpose(arr)
‘transpose函數(shù)為行列轉(zhuǎn)置的作用,如果只有一行不需要使用,直接賦值arr即可。
4、在vba中直接使用工作表函數(shù)要加前綴Application.WorksheetFunction
如:Application.WorksheetFunction.Sum(“a1:b2”);
5、區(qū)域的選擇
(1)引用多個不連續(xù)的區(qū)域
無論有多少區(qū)域,參數(shù)都只有一個字符串,參數(shù)中各個區(qū)域的地址用逗號分隔
Range("A1:B2,c1:d2").Select
(2)引用多個區(qū)域的公共區(qū)域
可以將Range屬性的參數(shù)設(shè)置為一個用空格分隔的多個單元格地址組成的字符串
如:Range("B1:B10 A4:D6").Select
(3)引用兩個區(qū)域圍成的矩形區(qū)域
設(shè)置兩個用逗號隔開的參數(shù),就可以引用這兩個區(qū)域圍成的矩形區(qū)域,注意與第(1)中情況的區(qū)別
Range("A1:B2”,”c1:d2").Select
(4)使用cells屬性引用單元格
Range(Cells(1,1),Cells(10,5)).Select
或者Range(“A1”,”E10”).Select
(5)可以使用union合并多個單元格區(qū)域
Application.Union(Range("A1:B2"), Range("c1:d2")).Select '同時選中兩個區(qū)域
(6)Worksheet對象的UsedRange和CurrentRegion屬性
UseRange屬性返回的總是一個矩形區(qū)域,無論這些區(qū)域是否存在空行、空列。
CurrentRegion屬性,返回指定單元格在內(nèi)的一個連續(xù)的區(qū)域,如Range(“B5”).CurrentRegion.Select 只要是斷開的區(qū)域都不統(tǒng)計(jì),哪怕空行下邊、空列右邊還有數(shù)據(jù)。
(7)Range對象的End屬性返回制定單元格的區(qū)域最尾端的單元格
Dim c As Range
Set c = ActiveSheet.Range("A10").End(xlUp)
MsgBox c.Address
有有xlToLeft,xlToRight,xlUp,xlDown四種參數(shù)分別對應(yīng)左右上下。
(8)使用offset定位相鄰單元格
Range("A1").Offset(0,1)
6、擇復(fù)制粘貼
(1)分三步驟
Public Sub aa()
Range("A1:B2").Select
Selection.Copy
Range("c1:d2").Select
ActiveSheet.Paste
End Sub
(2)一個命令選擇復(fù)制粘貼
Range("B1:B10").Copy Destination:=目標(biāo)單元格
無論復(fù)制的區(qū)域包含多少單元格,在設(shè)置目標(biāo)區(qū)域時,都可以只指定一個單元格作為目標(biāo)區(qū)域最左上角的單元格即可,如:
Range("B1:B10").Copy Destination:=Range(“G3”)
7、判斷文件夾中是否存在指定名稱的文件
Dir函數(shù),如果存在則返回該文件名,否則返回空。
8、將工作簿中的每張表存為單獨(dú)的文件
Application.ScreenUpdating = False
Dim folder As String
folder = ThisWorkbook.Path & "\分拆保存目錄"
If Len(Dir(folder, vbDirectory)) = 0 Then MkDir folder '選擇是否新建該文件夾
Dim sht As Worksheet
For Each sht In Worksheets
vv = sht.Visible
sht.Visible = xlSheetVisible
sht.Copy
sht.Visible = vv
ActiveWorkbook.SaveAs Filename:=folder & "\" & sht.Name & ".xlsx" '保存路徑
ActiveWorkbook.Close
Next
Application.ScreenUpdating = True
9、常用的事件
如:Workbook_Open()、OnTimer、WorkSheet_Activate()、Change()等
可以使用Application.OnTime Now() + TimeValue("00:00:01"), "ts"設(shè)置定時發(fā)生的事件
10、窗體的使用
(1)首先workbook的open事件中代開窗體
Private Sub Workbook_Open()
Application.Visible = False '啟動時先隱藏EXCEL表
test.Show vbModal '這個參數(shù)分vbModal模式窗口和vbModeless非模式窗口兩種
End Sub
(3)設(shè)置窗體的代碼
Private Sub UserForm_Initialize()
sex.List = Array("男", "女")
End Sub
Private Sub cmdExit_Click()
Unload Me '卸載代碼所在的窗體
End Sub
Private Sub cmdSave_Click()
Dim xrow As Long '定義變量xrow,用來不存要輸入數(shù)據(jù)的工作表行號
xrow = Range("A1").CurrentRegion.Rows.Count + 1 '求工作表中第1條空行的行號,前提是標(biāo)題行為第一行
'將窗體的信息寫入工作表
Cells(xrow, "a").Value = txtname.Value
Cells(xrow, "b").Value = sex.Value
'將窗體中輸入的數(shù)據(jù)清除,等待下次輸入
txtname.Value = ""
sex.Value = ""
End Sub
Private Sub cmdDataBase_Click()
Dim i As Integer, j As Integer, sht As Worksheet 'i,j為整數(shù)變量;sht 為excel工作表對象變量,指向某一工作表
Static nowfield As String
'工具 ---〉引用 ---〉Microsoft ActiveX data objects ....
'下面兩句就不需要增加引用ADO
Set cn = CreateObject("Adodb.Connection")
Set rs = CreateObject("Adodb.Recordset")
Dim strCn As String, strSQL As String '字符串變量
Dim strCond As String
strCn = "Provider=SQLOLEDB;Server=(local);Database=db_ibcms;Uid=sa;Pwd=XXXX" '定義數(shù)據(jù)庫鏈接字符串
'下面的語句將讀取數(shù)據(jù)表數(shù)據(jù),并將它保存到excel工作表中:工作表為一張兩維表,記錄集也是一張兩維表
strSQL = "select * from [tb_ttList] " '定義SQL查詢命令字符串
Dim result As Variant
result = cn.Open(strCn) '與數(shù)據(jù)庫建立連接,如果成功,返回連接對象cn
rs.Open strSQL, cn '執(zhí)行strSQL所含的SQL命令,結(jié)果保存在rs記錄集對象中
'把sht指向當(dāng)前工作簿的sheet1工作表
Set sht = ThisWorkbook.Worksheets("sheet1")
For j = 0 To rs.Fields.Count - 1
nowfield = rs.Fields(j).Name
sht.Cells(1, j + 1).Value = nowfield '將所有的字段名列在第一行
'對每列分別進(jìn)行賦值,從第2行開始
i = 2
'當(dāng)數(shù)據(jù)指針未移到記錄集末尾時,循環(huán)下列操作
Do While Not rs.EOF
'把當(dāng)前記錄的字段值保存到sheet1工作表的第i行第j+1列
sht.Cells(i, j + 1) = rs(nowfield)
'把指針移向下一條記錄
rs.MoveNext
i = i + 1
Loop
rs.MoveFirst '必須返回首條記錄,否則游標(biāo)已到底,第一列后就不再填數(shù)了
Next
'關(guān)閉記錄集
rs.Close
'關(guān)閉數(shù)據(jù)庫鏈接,釋放資源
cn.Close
End Sub
聯(lián)系客服