一、控件介紹
用戶圖形界面主要是控件設置和操作
窗體控件、ActiveX控件:
Office2013:在開發工具——插入 下
Office2003:在視圖——工具欄——窗體 下
窗體控件說明:
標簽:用於輸入和顯示靜態文本
分組框:用於組合其他多個控件
按鈕:用於執行宏命令
復選框:選中控件,可以多項選擇
選項按鈕:用於選擇的控件,通常幾個選項按鈕用組合框組合在一起使用,在一組中只能同時選擇一個選項按鈕
列表框:顯示多個選項列表,用戶可以從中選擇一個選項
組合框:提供可選擇的多個選項,用戶可以選擇其中的一個項目
滾動條:包括水平滾動條和垂直滾動條
微調控件:通過單擊控件的箭頭來選擇數值
窗體控件:
ActiveX控件:
二、窗體、ActiveX控件的使用
使用“組合框控件”,設置控件格式——控制:
設置數據源區域(用來顯示下拉菜單的值)、單元格鏈接(即現在的下拉數據在數據區域第幾個值,選中“女”則顯示2,“男”則顯示1)、下拉顯示項目數(即下拉框顯示列表數量)
插入ActiveX的“選項按鈕”,通過“設計模式”,“查看代碼”添加代碼實現其邏輯。
Private Sub xb1_Click() If xb1.Value = True Then Range("F2").Value = "男" xb2.Value = False End If End Sub Private Sub xb2_Click() If xb2.Value = True Then '如果xb2被選中則執行如下邏輯 Range("F2").Value = "女" '在F2單元格里輸入“女” xb1.Value = False '更改xb1為未選中狀態 End If End Sub
三、InputBox函數、Application.InputBox方法
1、InputBox函數
InputBox(Prompt:="提示文字",Title:="對話框標題,可省略",Default:="文本框默認值,可省略",xpos:="左端距離",ypos:="頂端距離") str = InputBox(Prompt:="請輸入姓名:", Title:="操作提示", Default:="張Dream", xpos:=2000, ypos:=2500) 也可以省略所有參數: str = InputBox("請輸入姓名:", "操作提示", "張Dream", 2000, 2500) 除Prompt外,其他參數都可以省略 InputBox(Prompt:="提示文字",Title:="對話框標題,可省略",Default:="文本框默認值,可省略",xpos:="左端距離",ypos:="頂端距離") str = InputBox(Prompt:="請輸入姓名:", Title:="操作提示", Default:="張Dream", xpos:=2000, ypos:=2500) 也可以省略所有參數: str = InputBox(Prompt:="請輸入姓名:",, Default:="張三")
Sub InBox() Dim str As String '第一個參數prompt是對話框上的提示文字 '第二個參數Title是對話框的標題,如果省略,默認標題為“Microsoft Excel” '第三個參數Default是默認輸入值,如果省略,則文本框中內容為空 '第四個參數xpos是對話框左端與屏幕左端的距離,如果省略,對話框的水平方向居中顯示 '第五個參數ypos是對話框頂端與屏幕頂端的距離,如果省略,對話框將顯示距離屏幕頂端約三分之一的位置 str = InputBox(Prompt:="請輸入姓名:", Title:="操作提示", Default:="張Dream", xpos:=2000, ypos:=2500) Range("A1") = str '將輸入的值寫入A1單元格 End Sub
2、Application.InputBox方法
Sub AppInbox() Dim str As String str = Application.InputBox(prompt:="請輸入姓名:", Title:="操作提示", Default:="五三", Left:=100, Top:=500) Range("A1") = str End Sub
3、InputBox函數、InputBox方法的區別
參數的差異:
InputBox(Prompt:="請輸入姓名:", Title:="操作提示", Default:="張Dream", xpos:=2000, ypos:=2500)
Application.InputBox(prompt:="請輸入姓名:", Title:="操作提示", Default:="五三", Left:=100, Top:=500)
InputBox函數只能返回一個String型的字符串,而InputBox方法返回的數據類型不確定,並且InputBox方法比InputBox函數多一個Type參數
Application.InputBox中Type參數說明
0:公式
1:數字:
2:文本
4:邏輯值(True或False)
8:單元格引用(Range對象)
16:錯誤值,如#N/A
64:數值數組
使用application.InputBox方法,返回Range對象
Option Explicit Sub RngInput() Dim rng As Range '定義一個Range對象 On Error GoTo cancel '如果單擊“取消”按鈕,出現錯誤,跳轉到cancel處 Set rng = Application.InputBox(prompt:="請選擇要輸入的單元格區域", Type:=8) rng.Value = 100 '在選中的單元格輸入100 cancel: End Sub
Application.InputBox方法返回復合類型
Application.InputBox(prompt:="請選擇要輸入的單元格區域", Type:=1 + 2) '1:數字,2:文本,1+2:數字或文本中任意一種 Application.InputBox(prompt:="請選擇要輸入的單元格區域", Type:=3) '與上面語句效果一樣
四、MsgBox函數
1、參數語法
Sub msg() '第一個參數prompt時對話框中葯顯示的文本信息,時必選參數 '第二個參數Buttons指定對話框中顯示的按鈕數目、按鈕形式、使用的圖標樣式、缺省按鈕以及消息框的強制回應等。參數值時值(或常數)的綜合,如果省略,缺省值為0 '第三個參數Title指定在對話框的標題欄中顯示的字符串,如果省略,默認“Microsoft Excel” MsgBox prompt:="中午十二點,該吃飯了!", Buttons:=vbOKOnly + vbInformation, Title:="溫馨提醒" End Sub
2、MsgBox的6種按鈕設定
Sub msg() MsgBox prompt:="顯示“確定”按鈕", Buttons:=vbOKOnly, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“確定”和“取消”按鈕", Buttons:=vbOKCancel, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“中止”、“重試”和“忽略”按鈕", Buttons:=vbAbortRetryIgnore, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“是”、“否”和“取消”按鈕", Buttons:=vbYesNoCancel, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“是”和“否”按鈕", Buttons:=vbYesNo, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“重試”和“取消”按鈕", Buttons:=vbRetryCancel, Title:="練習MsgBox按鈕" End Sub
3、MsgBox的4中圖標樣式
Sub msg() MsgBox prompt:="顯示“關鍵消息”按鈕", Buttons:=vbCritical, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“警告詢問”按鈕", Buttons:=vbQuestion, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“警告消息”按鈕", Buttons:=vbExclamation, Title:="練習MsgBox按鈕" MsgBox prompt:="顯示“通知消息”按鈕", Buttons:=vbInformation, Title:="練習MsgBox按鈕" End Sub
處理MsgBox交互結果
Sub msg() Dim yn As Integer yn = MsgBox(prompt:="是否在A1單元格中輸入100?", Buttons:=vbYesNo + vbQuestion, Title:="練習MsgBox按鈕") If yn = vbYes Then Range("A1").Value = 100 ElseIf yn = vbNo Then Range("A1").Value = -2 End If End Sub
4、設置缺省按鈕和對話框類型
默認情況下按回車鍵即可執行的按鈕成為缺省按鈕(如果按鈕上有虛線框,則這個按鈕為缺省按鈕)
Sub msg() Dim yn As Integer '第二個按鈕設置為缺省按鈕,參數值也可以攜程4+32+256 或292 yn = MsgBox(prompt:="是否在A1單元格中輸入100?", Buttons:=vbYesNo + vbQuestion + vbDefaultButton2, Title:="練習MsgBox按鈕") If yn = vbYes Then Range("A1").Value = 100 ElseIf yn = vbNo Then Range("A1").Value = -2 End If End Sub
Buttons參數還有第四組設定值,用來決定對話框的類型,如下表:
5、MsgBox函數的返回值
Sub msg() Dim yn As Integer yn = MsgBox(prompt:="是否在A1單元格中輸入100?", Buttons:=vbYesNo + vbQuestion) '判斷用戶按下哪一個按鈕 If yn = vbYes Then Range("A1").Value = 100 ElseIf yn = vbNo Then Range("A1").Value = -2 End If End Sub
五、Application對象的FindFile方法
判斷文件是否打開
Sub OpenFile() If Application.FindFile = True Then '判斷文件是否打開 MsgBox "選中的文件已打開!" Else MsgBox "沒有打開任何文件!" End If End Sub
六、Application對象的GetOpenFilename方法、FileFilter方法
獲取選中文件的文件名
Sub GetFile() Dim fil As String fil = Application.GetOpenFilename() '將選中的文件名賦給變量fil1 If fil = "False" Then MsgBox "沒有選中任何文件" Exit Sub Else Range("A1").Value = fil End If End Sub D:\Study\Excel\公式.xlsx
可以使用FileFilter參數限制可選擇的文件類型。
Sub GetFile() Dim fil As String 'filefilter 參數是一個文本字符串 "Excel 97-2003 工作簿(*.xls)"是文件篩選條件,顯示在【文件類型】下拉列表 '.xls指定在對話框中顯示的文件類型,篩選條件和文件類型之間用英文逗號(,)隔開 'fil = Application.GetOpenFilename(filefilter:="Excel 97-2003 工作簿(*.xlsx),*.xls") '將選中的文件名賦給變量fil1 'fil = Application.GetOpenFilename(filefilter:="Excel 工作簿(*.xlsx),*.xlsx") '將選中的文件名賦給變量fil1 fil = Application.GetOpenFilename(filefilter:="Excel 文件(*.xl*),*.xl*", MultiSelect:=True) If fil = "False" Then MsgBox "沒有選中任何文件" Exit Sub Else 'D:\Study\Excel\公式.xlsx Range("A1").Value = fil End If End Sub
如果希望能在兩種或多種類型的文件中選擇,可以修改參數值,如下(文件類型可以用*表示,例如*.xls*):
Sub GetFile() Dim fil As String fil = Application.GetOpenFilename(filefilter:="Excel或Word 文件(*.xls;*.xlsx;*.doc),*.xls*;*.xlsx;*.doc") If fil = "False" Then MsgBox "沒有選中任何文件" Exit Sub Else Range("A1").Value = fil End If End Sub
除了FileFilter、GetOpenFilename方法還有其他參數,例如:
FileFilter參數執行在對話框中顯示的文件類型
filerIndex參數指定【文件類型】下拉列表中的第幾項為默認文件篩選條件,如果省略,默認為1
MultiSelect參數決定可以選中的文件個數。如果設置為True,表示可以同時選中多個文件,默認值為False,即只能選中一個文件
Title參數設置對話框的標題,如果省略,默認為“打開”
Sub GetFile() Dim fil 'filefilter 指定在對話框中顯示的文件類型 'FilterIndex 指定【文件類型】下拉列表中的第幾項為默認文件篩選條件,如果省略,默認為1 'Title 設置對話框的標題 'MultiSelect 決定可以選中的文件個數,如果設置為True,表示可以同時選中多個文件,默認值為False,即只能選中一個文件 fil = Application.GetOpenFilename(filefilter:="Excel 97-2003 工作簿(*.xls*),*.xls*,Word 97-2003 文檔(*.doc),*doc", FilterIndex:=2, Title:="請選擇文件", MultiSelect:=True) [A1].Resize(UBound(fil), 1) = Application.WorksheetFunction.Transpose(fil) End Sub 'D:\Study\Excel\Excel基礎.xlsx 'D:\Study\Excel\公式.xlsx
七、Application對象的GetSaveAsFilename方法
GetSaveAsFilename方法打開【另存為】對話框,在對話框里選擇文件,獲得文件名。
Sub GetSaveAs() Dim fil As String, filename As String, filter As String, tle As String filename = "我要選擇的文件" filter = "Excel 97-2003 工作簿(*.xls*),*.xls*,Word 97-2003 文檔(*.doc),*.doc,文本文件(*.txt),*.txt" tle = "請選擇需要的文件" '用變量做方法的參數 '第一個參數InitialFileName指定顯示的文件名,如果省略,則顯示活動工作簿的名稱 '第二個參數filefilter執行文件的篩選條件 '第三個參數FilterIndex設置【保存類型】下拉列表中的第幾項默認篩選條件,如果省略,默認值為1 '第四個參數Title指定對話框的標題,如果省略面膜人為“另存為” fil = Application.GetSaveAsFilename(InitialFileName:=filename, filefilter:=filter, FilterIndex:=2, Title:=tle) Range("A1") = fil '把文件名寫入A1單元格 End Sub
八、Application對象的FileDialog屬性
FileDialog屬性可以獲得指定目錄的路徑及名稱,如下:
Option Explicit Sub getFolder() With Application.FileDialog(filedialogtype:=msoFileDialogFolderPicker) .InitialFileName = "D:\" '設置D盤根目錄為起始目錄 .Title = "請選擇一個目錄" '設置對話框標題 .Show '顯示對話框 If .SelectedItems.Count > 0 Then '判斷是否選中了目錄 Range("A1").Value = .SelectedItems(1) '將選擇的目錄名及路徑寫進A1單元格 End If End With End Sub 'D:\Study\Excel\Excel公式與函數-示例文件
除了msoFileDialogFolderPicker,filedialogtype參數還可以選用其他的值,如下:
九、構建用戶窗體,自己設計交互界面
用戶窗體時Excel的另一個對象:UserForm對象,用戶可以在窗體上自由添加ActiveX控件,並利用這些控件從用戶那里獲得信息,或將信息輸出給用戶
1、添加窗體兩種:在VBA編輯窗口
1、【插入】——【用戶窗體】
2、右鍵單擊工程目錄樹——選中【插入】——【用戶窗體】
2、設置窗體屬性
分別是“窗體名稱”、“窗體標題欄名稱”
也可以按照屬性分類查看,並進行設置
如果對屬性不太熟悉,可以選中屬性后,按快捷鍵F1,即可彈出幫助信息
幫助地址:https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/bordercolor-property
3、在窗體中添加控件
如果窗口中沒有顯示【工具箱】,可以依次執行【視圖】——【工具箱】菜單命令打開它。
默認情況下,【工具箱】中有16種控件相同。如果想增加【工具箱】中的控件數目,可以右鍵單擊【工具箱】窗體,執行【添加控件】菜單命令進行添加。
4、窗體相關設置
Option Explicit '窗體顯示 Sub xianshi() Load 錄入 '加載"錄入"窗體 錄入.Show '顯示"錄入"窗體,將窗體顯示給用戶 End Sub '窗體的顯示模式 Sub modal() '錄入.Show vbModal '顯示窗體模式窗體,默認或缺省則為vbModal,這個窗體將以模式窗體顯示 錄入.Show vbModeless '顯示無模式窗體 Range("A1") = "現在顯示的是無模式窗體!" End Sub '關閉窗體 Sub hideform() 錄入.Hide '隱藏"錄入"窗體 End Sub Sub unloadform() Unload 錄入 '卸載"錄入"窗體,卸載后窗體將從屏幕和內存中同時刪除 End Sub
5、給窗體添加控件,並使用控件
對窗體進行初始化設置UserForm_Initialize
Private Sub UserForm_Initialize() '設置性別復合框的條目為“男”和“女” 性別.List = Array("男", "女") End Sub
為命令按鈕添加事件過程
Option Explicit Private Sub UserForm_Initialize() '設置性別復合框的條目為“男”和“女” 性別.List = Array("男", "女") End Sub Private Sub 確定_Click() '判斷信息輸入是否完整 If 姓名.Value = "" Or 性別.Value = "" Or 出生年月.Value = "" Then MsgBox "信息輸入不完整,請重新輸入!", vbExclamation, "錯誤提示" Exit Sub '退出執行程序 End If Dim xrow As Integer xrow = Range("A1").CurrentRegion.Rows.Count + 1 '求第一行空行行號 '將姓名,性別,出生年月寫入第一條空行 Cells(xrow, "A") = 姓名.Value Cells(xrow, "B") = 性別.Value Cells(xrow, "C") = 出生年月.Value '內容寫入工作表后,將控件中的內容清除 姓名.Value = "" 性別.Value = "" 出生年月.Value = "" End Sub Private Sub 退出_Click() Unload Me '卸載“錄入”窗體,Me指錄入窗體,即代碼所在的模塊 End Sub
6、用鍵盤控制控件
1)更改控件的<Tab>鍵順序
在【視圖】——【Tab鍵順序(A)】在彈出框調整即可
2)給控件執行快捷鍵
將Accelerator設置為N,表示按下<Alt+N>組合鍵等於在窗體單擊【確定】按鈕
7、改造Excel現有的界面
1)更改標題欄的程序名稱,默認名稱是“Microsoft Excel”
Application.Caption = "我的程序" '更改標題欄程序名稱為“我的程序”
2)顯示或隱藏菜單欄
逐個隱藏
Sub MenuHide() Dim i% '定義一個變量 With Application.CommandBars(1) .Controls("文件(&F)").Visible = False .Controls("編輯(&E)").Visible = False .Controls("視圖(&V)").Visible = False .Controls("插入(&I)").Visible = False .Controls("格式(&O)").Visible = False .Controls("工具(&T)").Visible = False .Controls("數據(&D)").Visible = False .Controls("窗口(&W)").Visible = False .Controls("幫助(&H)").Visible = False End With End Sub
也可以用循環語句實現隱藏
Sub MenuHide() Dim i% '定義一個變量 With Application.CommandBars(1) For i = 1 To .Controls.Count .Controls(i).Visible = False '隱藏第i個菜單,false為隱藏,true為顯示 Next End With End Sub
3)顯示或隱藏工具欄
Sub ToolHide() '隱藏 常用工具欄 和 格式工具欄 With Application .CommandBars("Starndard").Visible = False '隱藏常用工具欄 .CommandBars("Formatting").Visible = False '隱藏格式工具欄 End With End Sub
想隱藏窗口中顯示的所有工具欄,可以使用程序:
Sub ToolHide() Dim i% For i = 2 To Application.CommandBars.Count '索引號為2開始,因為1時菜單欄 Application.CommandBars(i).Enabled = False '隱藏所有工具欄 Next End Sub
4)設置窗口
Sub WindowSet() With ActiveWindow .DisplayHeadings = False '隱藏行標和列標 .DisplayHorizontalScrollBar = False '隱藏水平滾動條 .DisplayVerticalScrollBar = False '隱藏垂直滾動條 .DisplayGridlines = False '隱藏網格線 .DisplayWorkbookTabs = False '隱藏工作表標簽 End With End Sub
5)其他設置
Sub Other() With Application .DisplayFormulas = False '隱藏編輯欄 .CommandBars.DisableAskAQuestionDropdown = True '隱藏幫助 .CommandBars("ply").Enabled = False '右鍵單擊工作表標簽后不顯示菜單 .CommandBars("cell").Enabled = False '右鍵單擊工作表區域后不顯示菜單 .DisplayStatusBar = False '隱藏狀態欄 .ShowStartupDialog = False '隱藏任務窗格 End With End Sub
十、典型的技巧或示例
等等……
十一、代碼調試與優化
1、VBA可能發生的錯誤分類
編譯錯誤
運行時錯誤
邏輯錯誤
2、VBA程序的3種狀態
設計模式
運行模式
中斷模式:這時通過F8鍵逐句執行程序,觀察運行情況。
3、斷點
設置斷點,可以利用F9快捷鍵快速設置或清除斷點
F8逐行執行程序,觀察運行情況