如何用vb向excel中添加控件,并响应事件 excel中用vb动态添加控件和事件响应
vb\u5982\u4f55\u5411excel\u8868\u4e2d\u52a8\u6001\u6dfb\u52a0\u63a7\u4ef6,\u5e76\u54cd\u5e94\u63a7\u4ef6\u4e8b\u4ef6\u76f4\u63a5\u7528excel\u7684vba\u4f1a\u66f4\u7b80\u5355\u70b9
Private Sub CommandButton1_Click()
MsgBox "\u4f60\u70b9\u51fb\u4e86\u6211\uff01"
End Sub
\u5c31\u50cf\u8fd9\u6837\uff01
在excel中插入控件的方法如下:
1、点击开发工具选项卡,点击插入按钮,在弹出的框中选择要插入的控件
2、点击控件之后,鼠标变成十字形。拖动鼠标绘制控件,绘制完成后,弹出指定宏对话框,为此控件的单击事件关联宏。如果已写好需要执行的宏,则在列表框中选择相应的宏点击确定即可。若未写好,可点击新建按钮
3、在弹出的Visual Basic编辑器中写好需要执行的代码,关闭编辑器,即可
熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但
唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。
VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,
由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可在 Set 语
句中用 New 关键字、CreateObject 或 GetObject 从部件外面将对象引用赋予变量。
如果对象是从属对象,则需使用高层对象的方法,在 Set 语句中指定一个对象引用:
Dim xlApp1 As Excel.Application
Set xlApp1 = New Excel.Application
或
Dim xlApp As Object '定义存放引用对象的变量。
Set xlApp = CreateObject("excel.application")
xlApp.Visible = True
---- 这些语法很容易造成误导,以为动态加载ActiveX控件也是此方法,可能有朋友也
象我一样利用CreateObject尝试了无数次,却无功而返,不知微软公司是出于何种考
虑,动态加载ActiveX控件是扩展控件集合的方式实现,通过实际摸索,终于就如何实
现动态ActiveX控件找出了一条切实可行的方法,下面以一个具体的实例来详细说明。
一、ActiveX控件
---- ActiveX 控件是 Visual Basic 工具箱的扩充部分。使用 ActiveX 控件的方法与
使用其它标准内装的控件,如 CheckBox 控件,完全一样。在程序中加入 ActiveX 控
件后,它将成为开发和运行环境的一部分,并为应用程序提供新的功能。
---- ActiveX 部件通过客户端/服务器关系与应用程序— 及与部件相互之间— 交互作
用。客户端是使用部件功能的应用程序代码或部件。服务器是部件及其关联的对象。例
如,假设应用程序使用 ActiveX 控件来提供一个标准的雇员窗体,供公司的多种应用
程序使用。提供雇员窗体的 ActiveX 控件就是服务器,使用这个控件的应用程序就是
服务器的客户端。
二、加载方法
---- VB6.0中对Controls 集合进行了扩展,以前版本中Controls 集合在窗体上列举出
已加载的控件,这在迭代过程中是很有用的。Controls 集合标识一个叫做 Controls
的内在窗体级变量。如果忽略可选的 object 所在处的整数,则关键字 Controls 必须
包括在内。我们通常在窗口中使用如下代码:
Text1.Text="Hello, world"
其实也可以使用如下代码达到同一目的:
Controls(1).Text="Hello, world"
---- 在VB6.0中除了原来的Clear、Remove 方法外(很奇怪,为什么微软在VB5.0中只提
供这两种方法,而没有提供Add方法,因为没有Add,这两种方法也就没什么用处),增
加了Add方法,该方法就是用于动态加载控件的:
Controls.Add(progid as String, Name as String);
progid: ActiveX部件的ProgID,如:"VB.CheckBox";
Name:ActiveX部件加载后的名称,如: "MyCheckBox";
若要在窗体上添加一个名为MyButton的按钮,可以使用:
dim oControl as Object '窗体级变量
注意:这里声明为Object对象类型
Private Sub LoadControl()
Set oControl = Controls.Add
("VB.CommandButton", "MyButton")
oControl.Left = 10
oControl.Top = 10
oControl.Visible = True '使控件可见
End Sub
---- 这是VB6.0的标准语法,它在例程中也是如此演示的,不过该方法虽然现实了控件
的动态加载,按钮显示在窗体上,可以象普通按钮一样按下去,但加载的控件不能预先
设计响应事件代码,如:事件Sub MyButton_Click()将是非法的,当然,可以将要响应
的事件封装在控件内部。就编程的观点来看该方法没什么大的用处,开发ActiveX控件
的目的是为了资源共享,为了被其他开发人员利用,所以要提供必要的事件接口,显然
利用该方法不行,通过分析VBControls等相关对象,找出VBControlExtender对象与
EventInfo相结合能提供事件陷井捕捉,VBControlExtender对象对动态添加控件特别有
用,它提供了一套通用的属性、方法、事件给开发人员,它的一个突出特点是能编程设
计控件的事件,熟习类编程的朋友对带事件的对象声明一定不会陌生:
---- Dim WithEvents objElemt as CElemtVBControlExtender也不例外,声明的语法
一样,只不过它有个特殊的事件ObjectEvent(Info As EventInfo),它能捕捉到对象使
用RaiseEvent产生的所有事件,EventInfo数据结构映射了事件的名称、参数个数和参
数的值。VBControlExtender和 EventInfo相结合,采用Select Case 就可以预先将不
同类对象的事件放置一起,各自独立运作。将上面的代码改写一下就能提供Click事件
了:
---- Dim WithEvents oControl As VBControlExtender '带事件声明声明之后您就可
以在代码窗口的左上角的对象下拉框中发现该对象出现了,也就是说,该对象有了事件
或方法了,它的事件有DragDrop,DragOver ,LostFocus ,GotFocus ,ObjectEvent
和Validate,其中ObjectEvent是通用的事件捕捉。
Private Sub LoadControl()
Set oControl = Controls.Add
("VB. CommandButton", "MyButton")
oControl.Visible = True
End Sub
Private Sub oControl_ObjectEvent(Info As EventInfo)
Select Case Info.Name
Case "Click" 'Click事件
'您可以添加处理Click事件代码
MsgBox "您按了MyButton!"
Case Else ' 其他事件
' Handle unknown events here.
End Select
End Sub
Excel中的VB语言叫做VBA,在VBE中使用代码新建即可。
Excel版本参考:2010
演示:新建一个表名为test的工作表。
1、ALT+F11,进入VBE窗口。
2、右击工作表标签-插入-模块。
3、输入代码:
Sub test()
Worksheets.Add(after:=Sheets(Sheets.Count)).Name = "test"
End Sub
4、按下F5执行,查看工作表,新建的test表 已新建好。
使用VBA在工作表中添加ActiveX控件
要使用VBA从控件工具箱(ActiveX控件)中添加控件,可以使用OLEObjects集合的Add方法。该方法包含有大量的参数,包括
ClassType、Top、Left、Width和Height等。其中,ClassType参数代表的一些常见的ActiveX
控件的名称如下:
Forms.Checkbox.1(复选框)
Forms.Combobox.1(组合框)
Forms.Optionbutton.1(选项按钮)
Forms.Textbox.1(文本框)
Forms.Listbox.1(列表框)
Forms.Commandbutton.1
(命令按钮)
下面举一个例子,提供一些思路,并供探讨。
如下图所示,要求在每项工作前面都添加复选
框,并且当用户选中复选框后,自动隐藏该复选框所在的行。
下面的代码用来添加复选框:
Sub RefreshList()
Dim oCheck As OLEObject
Dim rCell As Range, rRange As Range
Dim lLastRow As Long
‘
清除已经存在于工作表中的复选框
For Each oCheck In Sheet1.OLEObjects
oCheck.Delete
Next oCheck
lLastRow = Sheet1.Range("B" & Cells.Rows.Count).End(xlUp).Row
Set rRange = Sheet1.Range("B2:B" & lLastRow)
For Each rCell In rRange
rCell.RowHeight = 14
With Sheet1.OLEObjects.Add(ClassType:="Forms.Checkbox.1", _
Top:=rCell.Top, Left:=rCell.Offset(0, -1).Left, _
Height:=rCell.Height, Width:=rCell.Offset(0, -1).Width)
.Object.Caption = ""
.LinkedCell = rCell.Offset(0, -1).Address
.Object.Value = False
End With
Next rCell
End Sub
上述代码首先删除工作表中所有已存在的复选框,因为本示例已知道工作表中无其他控件,
所以直接删除,
如果无法判断是否有其他控件而只需删除复选框,
可以加上一个条件判断语
句:
If TypeName(oCheck.Object)="CheckBox" Then
这样,仅删除复选框。
然后,
在确定数据范围后,
在第一列添加复选框并设置了一些属性值以方便以后操作。
这里,
有一些通用的适合于其他控件的属性,也有一些专属于复选框的属性。
下面的代码用于隐藏复选框选中后的行:
Sub HideRows()
Dim rCell As Range, rRange As Range
Dim lLastRow As Long
lLastRow = Sheet1.Range("B" & Cells.Rows.Count).End(xlUp).Row
Set rRange = Sheet1.Range("B2:B" & lLastRow)
For Each rCell In rRange
If rCell.Offset(0, -1).Value Then
rCell.EntireRow.Hidden = True
End If
Next rCell
End Sub
上述代码遍历设定区域的每行并隐藏已复选的行
参考下上边的,看能帮到你不
绛旓細Excel涓鐨勭獥浣撴帶浠跺姛鑳介潪甯稿己澶э紝閫氳繃涓涓疄渚嬭鏄鎬庢牱鐢绐椾綋鎺т欢蹇熸瀯閫犲嚭鍔ㄦ佸浘琛ㄣ傚亣璁炬湁涓瀹跺叕鍙歌缁熻涓ょ浜у搧(浜у搧X锛屼骇鍝乊)鐨勯攢鍞儏鍐碉紝杩欎袱绉嶄骇鍝佺殑閿鍞尯鍩熺浉鍚岋紝涓嶅悓鐨勫彧鏄畠浠殑閿鍞噺銆傛寜鐓у父瑙勭殑鎬濊矾锛屾垜浠彲浠ヤ负涓ょ浜у搧鍒嗗埆璁捐涓涓浘琛紝浣嗘洿涓撲笟鐨勫姙娉曟槸鍙敤涓涓浘琛紝鐢辩敤鎴烽夋嫨瑕佹樉绀哄摢...
绛旓細濡傚浘鎴戠殑鐞嗚В鏄細A1鐨勫兼槸B鍒椾腑鈥淎鈥濈殑涓暟锛孉2鐨勫兼槸B鍒椾腑鈥淏鈥濈殑涓暟銆傘傘傛寜姝ゆ濊矾锛屼互涓嬪畯婊¤冻浣犵殑瑕佹眰锛屼笖鍙殢鏃舵洿鏀笰鍒椾腑鍚勫 Private Sub Worksheet_Change(ByVal Target As Range)If Target.Column = 1 Then Dim bf, aRow, bRow, a, b, bLine, aArr, bArr Range("B:B")....
绛旓細鍦╯heet1閲屽鍔涓涓狢ommandButton1,Alt+F11鎵撳紑VBE鍙屽嚮宸﹁竟鐨剆heet1灏嗕笅闈唬鐮佸鍒跺埌涓棿鐨勪唬鐮佸尯.鍏抽棴VBE.灏咰ommandButton1缁撴潫璁捐妯″紡鍗冲彲.濡傞渶瑕佽鍙戠數閭埌[email protected] Option Explicit Private Sub CommandButton1_Click()If CommandButton1.Caption = "Can input" Then CommandButton1.Caption =...
绛旓細鐢╒BA鍦╡xcel涓坊鍔涓涓伐浣滆〃骞朵笖瀵瑰叾鍛藉悕鐨勫疄鐜版柟娉曞拰鎿嶄綔姝ラ濡備笅锛1銆侀鍏堬紝鍦‥xcel涓寜蹇嵎閿淎lt + F11鈥濓紝濡備笅鍥炬墍绀恒2銆佸叾娆★紝鍦╒BA缂栬緫鍣ㄤ腑渚濇鍗曞嚮鈥滄彃鍏モ-->鈥滄ā鍧椻濓紝濡備笅鍥炬墍绀恒3銆佺劧鍚庯紝鍦ㄢ滄ā鍧椻濅腑杈撳叆濡備笅浠g爜锛歄ption Explicit Sub addwork()Sheets.Add after:=Sheets(...
绛旓細鏂规硶1 鍦╡xcel瀹忎腑浣滀竴涓獥浣撹缃畇howmodal涓篺alse锛鍔犱笂涓や釜鎸夐挳锛屾寜閽唬鐮佸涓婏紝涓嶇煡閬撶鍚堜綘鐨勮姹傚悧 鍔犲叆vb宸ュ叿鏍忥紙鍦╡xcel涓婇儴鑿滃崟涓嬭竟鐐瑰嚮鍙抽敭鍦╲isual besic鍓嶆墦鍕撅級鐒跺悗鐐瑰嚮vb宸ュ叿鏍忎笂鐨勬帶浠舵寜閽紙涓涓皬閿ゅ瓙鍜屼竴涓皬鍙夊瓙锛夊湪椤甸潰涓娣诲姞涓や釜鎸夐挳锛屾寜閽寜閽笂娣诲姞濡備笂浠g爜锛屽鏋滄兂鍦ㄦ敼鍙樺崟鍏冩牸...
绛旓細VB璁块棶EXCEL 鍏堥渶瑕佸湪宸ョ▼涓紩鐢∕icrosoft Excel绫诲瀷搴擄細浠"宸ョ▼"鑿滃崟涓夋嫨"寮曠敤"鏍忥紱閫夋嫨Microsoft Excel 11.0 Object Library锛圗XCEL2003锛夛紝鐒跺悗閫夋嫨"纭畾"銆傝〃绀哄湪宸ョ▼涓寮曠敤EXCEL绫诲瀷搴撱傜劧鍚庤闂拰璁剧疆瀛椾綋鐨勪唬鐮佸涓嬶細Dim xlApp As Excel.Application Dim xlBook As Excel.WorkBook Dim xlSheet ...
绛旓細浣犵殑棰樼洰鏄VB涓浣曚娇鐢‥XCEL鎺浠讹紙sheet1鎺т欢锛夋潵瀵煎叆EXCEL鏁版嵁鈥滀絾瑕佹眰鏄細鈥濆彟澶栬繕鏈夊嚑涓姹傦細1锛氫笉鐢╒B鐨勫叾浠栬〃鏍煎幓瀹炵幇璇ュ姛鑳斤紝鍥犱负鎴慥BA鐨勪唬鐮佹病鍔炴硶绉绘锛屼唬鐮佹湁寰堝銆傞噸鍐欏お澶嶆潅 2锛氫笉鐢╒B鍚庡彴鎿嶄綔EXCEL鐨勬柟娉曪紝瑕佸啀VB涓鐞嗘暟鎹紝鑰屼笉鏄敤VB鍘绘搷浣淓XCEL澶勭悊鏁版嵁鈥濆ソ鍍忎笉琛屽惂锛浣跨敤VB瀵煎叆...
绛旓細鈥榁B6.0 EXCEL鏂囦欢鎵╁睍鍚嶄负xls鐨勬儏鍐点侱im MyXL As Object '瀹氫箟瀛樻斁寮曠敤瀵硅薄鐨勫彉閲忋係et MyXL = CreateObject("excel.application")Set mysheet = Nothing Set mybook = Nothing Set mybook = MyXL.Workbooks.Open(鈥淒:\123.XLS鈥)Set mysheet = mybook.Worksheets("sheet1")mysheet.Range(...
绛旓細濡傛灉浣鎻掑叆鐨勬槸绐椾綋鎺т欢锛屽緢绠鍗曠殑銆傦紙activex鎺т欢姣旇緝楹荤儲锛屽緱鐢╲ba浠g爜锛夊彸閿偣杞﹂棿锛1锛夋帶浠讹紝璁剧疆鏍煎紡锛屾渶鍚庝竴涓爣绛锯滄帶鍒垛濓紝鍗曞厓鏍奸摼鎺ュ鐐瑰埌姣斿sheet1鐨刧1锛岀‘瀹氥傚湪sheet2鐨刟1杈撳叆 =if(sheet1!g1,"杞﹂棿锛1锛","杞﹂棿锛2锛")灏卞彲浠ヤ簡銆
绛旓細浣跨敤琛ㄦ牸鏁版嵁锛堟牸寮忥級锛歁sgbox Sheet1.Range("A1").Value 鍏朵腑锛孲heet1鍙互鏇挎崲涓篠heets("宸ヤ綔绨 鍚嶇О")Range("A1")鍙互鏇挎崲涓篊ells(1,1)'鏂逛究寰幆 Value鐨勬剰鎬濇槸 寮曠敤鍗曞厓鏍 鐨勬渶缁堢粨鏋溿傚崟鍏冩牸鏈夊叕寮忕殑鏃跺欏繀椤荤敤杩欎釜鏉ュ紩鐢ㄧ粨鏋溿傚鏋滅敤 FormulaR1C1 鎴栬 Formula 鐨勮瘽浼氬嚭鏉ヨ繖涓崟鍏冩牸鐨勫叕寮忥紙...