目录VBA常用技巧 1第8章 控件与用户窗体 4技巧1 限制文本框的输入 4技巧2 文本框添加右键快捷菜单 6技巧3 文本框回车自动输入 10技巧4 自动选择文本框内容 11技巧5 设置文本框数据格式 12技巧6 限制文本框的输入长度 14技巧7 将光标返回文本框中 15技巧8 文本框的自动换行 17技巧9 多个文本框数据相加 19技巧10 控件跟随活动单元格 20技巧11 高亮显示按钮 21技巧12 组合框和列
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
框添加列表项的方法 2312-1 使用RowSource属性添加列表项 2312-2 使用List属性添加列表项 2412-3 使用AddItem方法添加列表项 25技巧13 去除列表框数据源的重复值和空格 27技巧14 移动列表框条目 29技巧15 允许多项选择的列表框 32技巧16 多列组合框和列表框的设置 3516-1 多列组合框和列表框添加列表项 3516-2 多列列表框写入工作表 37技巧17 输入时逐步提示信息 39技巧18 二级组合框 46技巧19 使用DTP控件输入日期 48技巧20 使用RefEdit控件选择区域 51技巧21 如何注册控件 52技巧22 遍历控件的方法 5522-1 使用名称中的变量遍历控件 5522-2 使用对象类型遍历控件 5722-3 使用程序标识符遍历控件 5822-4 使用名称中的变量遍历图形 5922-5 使用FormControlType属性遍历图形 60技巧23 使微调框最小变动量小于1 61技巧24 不打印工作表中的控件 6324-1 设置控件格式 6324-2 设置控件的printobjcet属性 65技巧25 在框架中使用滚动条 65技巧26 使用多页控件 67技巧27 标签文字垂直居中对齐 69技巧28 使用TabStrip控件 71技巧29 显示GIF动画图片 73技巧30 播放Flash文件 76技巧31 在工作表中添加窗体控件 7831-1 使用AddFormControl方法 7931-2 使用Add方法 81技巧32 在工作表中添加ActiveX控件 8332-1 使用Add方法 8432-2 使用AddOLEObject方法 86技巧33 使用spreadsheet控件 87技巧34 使用Listview控件 9034-1 使用Listview控件显示数据列表 9034-2 在Listview控件中使用复选框 9334-3 调整Listview控件的行距 9534-4 在Listview控件中排序 9834-5 Listview控件的图标设置 99技巧35 调用非模式窗体 102技巧36 进度条的制作 10436-1 使用进度条控件 10436-2 使用标签控件 106技巧37 使用TreeView控件显示层次 109技巧38 用户窗体添加图标 113技巧39 用户窗体添加最大最小化按纽 115技巧40 禁用窗体标
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
栏的关闭按钮 116技巧41 屏蔽窗体标题栏的关闭按钮 117技巧42 无标题栏和边框的窗体 119技巧43 制作年月选择窗体 120技巧44 自定义窗体中的鼠标指针类型 123技巧45 调整窗体的显示位置 124技巧46 由鼠标确定窗体显示位置 126技巧47 用户窗体的打印 127技巧48 使用自定义颜色设置窗体颜色 129技巧49 在窗体中显示图表 13049-1 使用Export方法 13049-2 使用API函数 132技巧50 窗体运行时调整控件大小 133技巧51 在用户窗体上添加菜单 136技巧52 在用户窗体上添加工具栏 140技巧53 使用代码添加窗体及控件 145技巧54 用户窗体的全屏显示 15154-1 设置用户窗体为应用程序的大小 15154-2 根据屏幕分辨率进行设置 152技巧55 在用户窗体上添加状态栏 153控件与用户窗体限制文本框的输入用户在使用文本框输入数据时,往往希望能限制输入数据的类型,比如只能输入数字。但是没有内置的属性能限制在文本框中只能输入数字,只能在文本框的事件过程中使用代码来测试输入的是哪类字符,然后只允许输入数字字符和一个“-”号、一个“.”号,如下面的代码所示。#001PrivateSubTextBox1_KeyPress(ByValKeyANSIAs#002SelectCaseKeyANSI#003CaseAsc("0")ToAsc("9")#004CaseAsc("-")#007KeyANSI=0#008EndIf#009CaseAsc(".")#011KeyANSI=0#012EndIf#013CaseElse#014KeyANSI=0#015EndSelect#016EndSub代码解析:文本框的KeyPress事件过程,测试键盘输入的是哪类字符,只允许输入数字字符和一个“-”号、一个“.”号。KeyPress事件的语法如下:PrivateSubobject_KeyPress(ByValKeyANSIAs参数Object是必需的,一个有效的对象。参数KeyANSI是可选的,整数值,代表
标准
excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载
的数字ANSI键代码。第2行代码使用CaseElse语句测试文本框KeyPress事件的KeyANSI参数值。第3行代码,如果键盘输入的是0到9之间的数字字符,则允许输入。如果想在文本框中允许其它类型的字符输入,在此句代码中列出允许输入的字符即可。第4行到第8行代码,如果键盘输入的是“-”号,先使用InStr函数测试文本框中是否已有“-”号,如果InStr函数返回值大于0,说明文本框中已有“-”号。接下来使用文本框的SelStart属性来测试插入点,如果文本框的SelStart属性值大于0,说明“-”号的插入点不是第一个。如果以上两个条件中有任何一个成立,将KeyAscii参数值设置为0,使文本框只能在第一位输入一个“-”号。第9行到第12行代码,如果键盘输入的是“.”号的话,使用InStr函数测试文本框中是否已有“.”号,如果已有“.”号,将KeyAscii参数值设置为0,使文本框只能输入一个“.”号。第13、14行代码,如果键盘输入的是其他字符则将KeyAscii参数值设置为0,使文本框不能输入其他字符。经过以上设置文本框只允许输入数字字符和一个“-”号、一个“.”号,但是能输入中文字符。如果希望限制中文字符的输入,可以在文本框的Change事件中进行设置,如下面的代码所示。#001PrivateSubTextBox1_Change()#002DimiAsInteger#003DimsAsString#004WithTextBox1#005Fori=1ToLen(.Text)#006s=Mid(.Text,i,1)#007SelectCases#008Case".","-","0"To"9"#009CaseElse#010.Text=Replace(.Text,s,"")#011EndSelect#012Next#013EndWith#014EndSub代码解析:文本框的Change事件,判断输入的字符是否为数字字符和“-”号、“.”号,如果不是则使用Replace函数将文本框中输入的其他字符替换成空白。第5、6行代码在文本框输入的所有字符中循环。第8行代码列出允许输入的字符。如果想在文本框中允许其它字符输入,在此句代码中列出即可。第9、10行代码,如果不是允许输入的字符,使用Replace函数替换成空白。经过以上的设置,文本框中只能在第一位输入一个“-”号、一个“.”号和“0”到“9”的数字。文本框添加右键快捷菜单VBA中的控件没有提供右键快捷菜单,用户可以使用Excel中的命令栏自已添加右键快捷菜单。步骤1:按<Alt+F11>组合键进入VBE窗口,单击菜单“插入”→“模块”,在其代码窗口输入以下代码:#001PrivateActiveTBAs#002PublicSubCreateShortCutMenu()#003DimShortCutMenuAsCommandBar#004DimShortCutMenuItemAsCommandBarButton#005DimsCaptionAsVariant#006DimiFaceIdAsVariant#007DimsActionAsVariant#008DimiAsInteger#009sCaption=Array("剪切(&C)","复制(&T)","贴粘(&P)","删除(&D)")#010iFaceId=Array(21,19,22,1786)#011sAction=Array("Action_Cut","Action_Copy","Action_Paste","Action_Delete")#012OnErrorResumeNext#013("ShortCut").Delete#015WithShortCutMenu#016Fori=0To3#017SetShortCutMenuItem=.(msoControlButton)#018WithShortCutMenuItem#019.Caption=sCaption(i)#020.faceID=Val(iFaceId(i))#021.OnAction=sAction(i)#022EndWith#023Next#024EndWith#025EndSub代码解析:第1行代码,在模块级别中声明变量ActiveTB是用来对应窗体中的文本框所触发的所有事件的变量。CreateShortCutMenu过程用来创建标题为“ShortCut”的右键快捷菜单,并添加4个菜单项。关于自定义右键快捷菜单请参阅技巧86。#001PublicSubShowPopupMenu(txtCtrAs#002DimActionAsVariant#003SetActiveTB=txtCtr#004With("ShortCut")#005.Controls(1).Enabled=>0#006.Controls(2).Enabled=.Controls(1).Enabled#007.Controls(3).Enabled=#008.Controls(4).Enabled=.Controls(1).Enabled#009.ShowPopup#010EndWith#011EndSub代码解析:ShowPopupMenu过程根据文本框中字符的选中状态设置右键快捷菜单菜单项的Enabled属性后使用ShowPopup方法显示右键快捷菜单。第5行代码,如果当前文本框中已有选中的字符则“剪切”按钮有效。第6行代码,如果当前文本框中已有选中的字符则“复制”按钮有效。第7行代码,如果剪贴板中包含对象支持的数据。则“贴粘”按钮有效。第8行代码,如果当前文本框中已有选中的字符则“删除”按钮有效。第9行代码,显示快捷菜单。#001PublicSubAction_Cut()#002#003EndSub#004PublicSubAction_Copy()#005#006EndSub#007PublicSubAction_Paste()#008#009EndSub#010PublicSubAction_Delete()#011DimsAsString#012WithActiveTB#013s=.SelText#014.Value=Replace(.Value,s,"")#015EndWith#016EndSub代码解析:Action_Cut过程是快捷菜单中单击“剪切”菜单项所运行的过程。使用Cut方法将当前选中的文本框中的文本删除并移至剪贴板。Action_Copy过程是快捷菜单中单击“复制”菜单项所运行的过程。使用Copy方法将文本框选中的文本复制到剪贴板上。Action_Paste过程是快捷菜单中单击“贴粘”菜单项所运行的过程。使用Paste方法把剪贴板上的内容传送到一个文本框中。Action_Delete过程是快捷菜单中单击“贴粘”菜单项所运行的过程。使用Replace函数将文本框中选中的文本的文本替换成空字符。#001PublicSubDeleteShortCutMenu()#002OnErrorResumeNext#003("ShortCut").Delete#004EndSub代码解析:DeleteShortCutMenu过程删除创建的右键快捷菜单。步骤2:在VBE窗口中,单击菜单“插入”→“用户窗体”,在窗体上添加两个文本框控件。双击窗体,在其代码窗口中输入下面的代码。#001PrivateSubUserForm_Initialize()#002CallCreateShortCutMenu#003EndSub#004PrivateSubTextBox1_MouseUp(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)#005IfButton=2ThenShowPopupMenuActiveControl#006EndSub#007PrivateSubTextBox2_MouseUp(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)#008IfButton=2ThenShowPopupMenuActiveControl#009EndSub#010PrivateSubUserForm_QueryClose(CancelAsInteger,CloseModeAsInteger)#011CallDeleteShortCutMenu#012EndSub代码解析:第1行到第3行代码,窗体的Initialize事件,在窗体初始化时运行CreateShortCutMenu过程创建右键快捷菜单。第4行到第9行代码,文本框的MouseUp事件,当用户右健单击文本框时运行ShowPopupMenu过程在选中的菜单项上显示右键快捷菜单。第10行到第12行代码,窗体的QueryClose事件,在关闭窗体时运行DeleteShortCutMenu过程删除右键快捷菜单。窗体运行后,右键单击文本框显示右键快捷菜单,如图991所示。图991 文本框快捷菜单文本框回车自动输入在使用文本框向工作表输入数据时,为了加快输入速度,可以利用文本框的KeyDown事件,回车后自动输入并清空文本框,如下面的代码所示。#001PrivateSubTextBox1_KeyDown(ByValKeyCodeAs,ByValShiftAsInteger)#002WithTextBox1#003IfLen(Trim(.Value))>0Then#004IfKeyCode=vbKeyReturnThen#005("A65536").End(xlUp).Offset(1,0)=.Value#006.Text=""#007EndIf#008EndIf#009EndWith#010EndSub代码解析:文本框的KeyDown事件,在输入数据并按<Enter>键后自动将数据录入到工作表A列最后一个非空单元格的下一个单元格中。KeyDown事件在按下键盘按键时发生,语法如下:PrivateSubobject_KeyDown(ByValKeyCodeAs,ByValShiftAsfmShiftState)参数object是必需的,一个有效的对象。参数KeyCode是必需的,代表被按下的键的键代码。参数Shift是可选的,Shift、Ctrl和Alt的状态。第3行代码,为了防止误输入空白数据,使用Len函数和Trim函数检查文本框内是否为有效数据。第4行代码,根据KeyCode参数值判断是否按下了回车键。如果用户按下了回车键,KeyCode参数返回常数vbKeyReturn。第5、6行代码,将文本框数据输入到工作表A列的最后一个单元格内,同时清空文本框内容准备下一次输入。自动选择文本框内容如果希望光标进入文本框时能自动选择文本框内容,可以在文本框的MouseUp事件中来完成,如下面的代码所示。#001PrivateSubTextBox1_MouseUp(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)#002WithTextBox1#003IfButton=2Then#004.SelStart=0#005.SelLength=Len(.Text)#006EndIf#007EndWith#008EndSub代码解析:文本框的MouseUp事件,在光标进入文本框释放鼠标右键时自动选择文本框内容。MouseUp事件在用户释放鼠标按键时发生,语法如下:PrivateSubobject_MouseUp(ByValButtonAsfmButton,ByValShiftAsfmShiftState,ByValXAsSingle,ByValYAsSingle)参数object是必需的,一个有效的对象。参数Button是可选的,设置引起该事件的鼠标按键的整数值,如
表格
关于规范使用各类表格的通知入职表格免费下载关于主播时间做一个表格详细英语字母大小写表格下载简历表格模板下载
1011所示。 常数 值 说明 fmButtonLeft 1 按下左键。 fmButtonRight 2 按下右键。 fmButtonMiddle 3 按下中键。表格1011 Button参数值参数Shift是可选的,Shift、Ctrl和Alt的状态。参数X和参数Y是可选的,窗体、框架或页的位置的横坐标与纵坐标。第3行到第6行代码,如果用户进入文本框释放鼠标右键,设置文本框的SelStart属性为0,SelLength属性为文本框的全部字符数。SelStart属性指定选中文本的起点,语法如下:[=Long]参数object是必需的,一个有效的对象。参数Long是可选的,指定选中文本的起点。SelLength属性指定文本框或组合框的文本部分中选中的字符数,语法如下:[=Long]参数object是必需的,一个有效的对象。参数Long是可选的,指定选中的字符数。运行窗体,当光标进入文本框释放鼠标右键时自动选择文本框内容,如图1011所示。图1011 自动选择文本框内容设置文本框数据格式文本框在用来输入数据时,除了限制输入的数据类型外,还可以设置文本框的数据格式,如下面的代码所示。#001PrivateSubTextBox1_Exit(ByValCancelAs#002TextBox1=Format(TextBox1,"")#003EndSub#004PrivateSubTextBox2_Exit(ByValCancelAs#005TextBox2=Format(TextBox2,"")#006EndSub代码解析:文本框的Exit事件过程,在文本框输入数据时使用Format函数格式化为两位小数格式。控件的Exit事件在同一窗体中的一个控件即将把焦点转移到另一个控件之前发生,语法如下:PrivateSubobject_Exit(ByValCancelAs参数Object是必需的,一个有效的对象。参数Cancel是必需的,事件状态。如果设置为False表示由该控件处理这个事件(默认方式)。设置为True表示由应用程序处理这个事件,并且焦点留在当前控件上。当文本框在输入完数据失去焦点时使用Format函数格式化自定义数值格式。Format函数语法如下:Format(expression[,format[,firstdayofweek[,firstweekofyear]]])参数expression是必需的,任何有效的表达式。参数format是可选的,有效的命名表达式或用户自定义格式表达式。参数firstdayofweek是可选的,常数,表示一星期的第一天。参数firstweekofyear是可选的,常数,表示一年的第一周。在本例中,将文本框的数据格式化成自定义的两位小数的数值格式,关于Format函数格式化日期和时间等其他数据请参阅VBA中Format函数的帮助。#001PrivateSubTextBox1_Change()#002TextBox3=Format(Val(TextBox1)*Val(TextBox2),"")#003EndSub#004PrivateSubTextBox2_Change()#005TextBox3=Format(Val(TextBox1)*Val(TextBox2),"")#006EndSub代码解析:文本框的Change事件过程,在两个文本框输入完数据后,使用文本框的Change事件使TextBox3显示其相乘的金额并格式化为两位小数的数据格式。Change事件在控件的Value属性改变时发生,语法如下:PrivateSubobject_Change()参数object是必需的,一个有效的对象。Change事件过程可以使显示在控件上的数据同步或一致。在本例中,当TextBox1或TextBox2的数据发生改变时,两者相乘的金额的金额也随之改变并在TextBox3中显示。因为文本框的数据类型是文本字符串,不能直接进行计算的,所以计算前先使用Val函数转换为数字,才能进行计算。运行窗体,输入数据后格式化为两位小数的数据格式,如图1021所示。图1021 设置文本框的数据格式限制文本框的输入长度在使用文本框输入数据时,可能希望限制能输入的字符长度,即只能输入一定长度的字符,超过设置数值就不能输入,这时可以通过设置文本框的MaxLength属性来实现,如下面的代码所示。#001PrivateSubWorksheet_Activate()#003EndSub代码解析:工作表的激活事件过程,将文本框的MaxLength属性设置为6,使文本框只能输入6个字符,超过6个字符即不能输入。应用于文本框控件的MaxLength属性规定用户可以在文本框中输入的最多字符数,语法如下:[=Long]参数object是必需的,一个有效的对象。参数Long是可选的,整数,表示所允许的字符数。如果将MaxLength属性设置为0,表示只要内存允许则没有限制。将光标返回文本框中在用文本框往工作表录入数据时,一般会在录入到工作表前验证输入的数据是否正确,如果错误,则清空文本框内容,提示用户重新输入。但此时光标已经不在文本框中,需要重新选择文本框才能输入。可以在Exit事件中可以设置Cancel参数值使光标停留在当前文本框中,如下面的代码所示。#001PrivateSubTextBox1_Exit(ByValCancelAs#002WithTextBox1#003If.Text<>""AndLen(Trim(.Text))<>15AndLen(Trim(.Text))<>18Then#004.Text=""#005MsgBox"身份证号码录入错误!"#006Cancel=True#007EndIf#008EndWith#009EndSub代码解析:文本框的Exit事件,在输入身份证号码后即将把焦点转移到录入按钮控件之前检查输入的身份证号码是否正确。Exit事件在一个控件从同一窗体的另一个控件实际接收到焦点之前发生,语法如下:PrivateSubobject_Exit(ByValCancelAsCancel参数为事件状态。False表示由该控件处理这个事件(这是默认方式)。True表示由应用程序处理这个事件,并且焦点应当留在当前控件上。第3行代码,使用Len函数和Trim函数检查输入的身份证号码是否为15位或18位。第4行到第6行代码,如果输入的身份证号码不正确,清空文本框以便重新输入并提示用户,设置Cancel参数为True使光标停留在文本框中。在Exit事件中之所以把文本框为空也做为通过验证的条件之一,因为如果不加上“<>""”这一条件,那么在窗体显示后,如果用户取消输入或关闭输入窗体,也会提示输入错误。所以在录入到工作表之前再验证文本框是否为空,如下面的代码所示。#001PrivateSubCommandButton1_Click()#002WithTextBox1#003If.Text<>""Then#004("a65536").End(xlUp).Offset(1,0)=.Text#005.Text=""#006Else#007MsgBox"请输入身份证号码!"#008EndIf#009.SetFocus#010EndWith#011EndSub代码解析:输入按钮的Click事件,把文本框数据录入到工作表A列最后一个单元格中并重新选择文本框准备下一次输入。第3行代码,在输入到工作表前检查文本框是否为空。第4、5行代码,如果文本框不为空,录入数据到工作表并清空文本框内容。第7行代码,如果文本框为空,提示用户输入数据。第8行代码,使用SetFocus方法将光标返回到文本框中以便重新输入。SetFocus方法将焦点移动到对象的实例中,语法如下:参数object.是必需的,一个有效的对象。运行窗体,在输入框中输入身份证号码后自动验证输入的数据,如果输入数据错误,清空文本框并提示用户重新输入,如图1041所示。图1041 提示用户重新输入文本框的自动换行在使用使用文本框显示或录入一段很长的文本时,需要将文本框设置成多行显示,否则文本内容只能在一行中显示,示例代码如下:#001PrivateSubUserForm_Initialize()#002WithTextBox1#003.WordWrap=True#004.MultiLine=True#005.Text=Space(4)&"VBA(VisualBasicforApplication)是"_#006&"微软公司为了加强Office软件的二次开发能力而附加"_#007&"于其中的编程语言。VBA的确非常强大,其与VB完全一"_#008&"致的语法结构,高效控制Office对象模型的能力,令无"_#009&"数人为之折腰。利用VBA,几乎可以在Office里面做任何"_#010&"其他程序能做的事情。但是,应该清楚的认识到VBA是依"_#011&"托其宿主─—Excel(或其他Office组件)而存在的,对"_#012&"于Excel用户来讲,VBA只不过是锦上添花的东西,切不可"_#013&"本末倒置,捡了芝麻丢了西瓜,把明明能够利用Excel内置"_#014&"功能完成的任务,硬是搬到VBA里面去做,以为用代码实现"_#015&"就是高人一头的表现。其实,真正的高手,会尽量发挥"_#016&"Excel自身的威力,不到万不得已的时候是不会去<Alt+F11>的。"#017EndWith#018EndSub代码解析:窗体的Initialize事件过程,在窗体显示时将文本框设置成多行显示文本。第3行代码设置文本框的WordWrap属性。WordWrap属性指定一个控件的内容在行末是否自动换行,语法如下:[=Boolean]参数object是必需的,一个有效的对象。参数Boolean是可选的,控件是否扩展以适应文本的大小,设置为True,文本换行,设置为False,文本不换行。第4行代码设置文本框的MultiLine属性。MultiLine属性规定控件能否接受和显示多行文本,语法如下:[=Boolean]参数object是必需的,一个有效的对象。参数Boolean是可选的,控件是否支持多行文本,设置为True,以多行显示文本,设置为False,不多行显示文本。如果将多行文本框的MultiLine属性设置为False,则文本框的所有字符都将合并为一行,包括非打印字符(如,回车和换行)。对于既支持WordWrap属性又支持MultiLine属性的控件,当MultiLine属性为False时,WordWrap属性被忽略。运行窗体,文本框显示如图1051所示。图1051 文本框自动换行多个文本框数据相加在技巧102中,我们在TextBox1、TextBox2中输入完数据后,利用文本框的Change事件使TextBox3显示其两者相乘的金额,但是如果窗体中有多个文本框,需要在每一个文本框的Change事件中写上相同的重复代码,因此使用类模块可以简化代码。在附件的窗体有七个文本框,其中六个用来输入数据,一个用来显示其他六个文本框相加后的合计数,首先打开VBE,插入一个类模块建立一个类,类模块的名字就是类的名字修改为“cmds”,在类模块中输入下面的代码:PublicWithEventscmdAs代码解析:使用Public语句声明变量cmd是用来响应由TextBox对象触发的事件的对象变量。在窗体的Initialize事件中写入下面的代码:#001DimcolAsNewCollection#002PrivateSubUserForm_Initialize()#003DimiAsInteger#004DimmycAscmds#005Fori=1To6#006Setmyc=Newcmds#007Set=("TextBox"&i)#008myc#009Next#010Setmyc=Nothing#011EndSub代码解析:第1行代码在模块顶部声明变量col的类型为集合。第5行到第9行代码,将窗体中的六个文本框赋给col集合。(关于类模块请参阅论坛中有关的资料。)在类模块中写入下面的代码:#001PrivateSubcmd_Change()#002DimiAsInteger#003DimDvalAsDouble#004Fori=1To6#005Dval=Dval+Val("TextBox"&i))#007Next#008EndSub代码解析:窗体中的六个文本框统一的Change事件,当任何一个文本框中的数据发生变化时,所有文本框相加的合计数显示在最后一个文本框中。运行窗体在文本框中输入数据结果如图1061所示。图1061 多个文本框数据相加控件跟随活动单元格在工作表中使用控件时一般都把控件放在工作表的上部,如果工作表中数据较多,当页面滚动到工作表下面的区域时,控件会离开当前可视区域,这时操作起来很不方便。解决方法除了冻结工作表的第一行放置控件的外,还可以使控件出现在选定的单元格位置,如下面的代码所示。#001PrivateSubWorksheet_SelectionChange(ByValTargetAsRange)#002With#003.Top=#004.Left=+#005EndWith#006EndSub代码解析:工作表的SelectionChange事件,使工作表中的按钮控件出现在选定单元格的右边。第3行代码,设置按钮的Top属性等于选定单元格的Top属性。Top属性设置对象顶端到第一行顶端的距离。第4行代码,设置按钮的Left属性等于选定单元格的Left属性加上选定单元格的宽度,即按钮出现在选定单元格的右边。Left属性设置对象左边界至A列左边界的距离。当单击工作表区域的任一单元格,按钮出现在单元格的右边,如图1071所示。图1071 控件跟随活动单元格高亮显示按钮为了达到当鼠标掠过按钮时以高亮和凸起显示按钮的效果,可以在窗体和按钮的MouseMove事件中进行模拟,如下面的代码所示。#001PrivateSubCommandButton1_MouseMove(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)#002With#003.BackColor=&HFFFF00#004.Width=62#005.Height=62#006.Top=69#007.Left=31#008EndWith#009EndSub#010PrivateSubUserForm_MouseMove(ByValButtonAsInteger,ByValShiftAsInteger,ByValXAsSingle,ByValYAsSingle)#011With#012.BackColor=#013.Width=60#014.Height=60#015.Top=70#016.Left=32#017EndWith#018EndSub代码解析:窗体和按钮的MouseMove事件过程,以高亮和凸起显示按钮。当用户在窗体中移动鼠标时,分别在窗体和按钮的MouseMove事件设置按钮的BackColor属性值,指定按钮的背景色,当鼠标移动到按钮时以高亮显示,当鼠标移动到窗体时恢复原来的设置。接下来分别设置按钮不同的Width属性、Height属性、Top属性和Left属性值,以模拟按钮凸起的效果。运行窗体,当鼠标掠过按钮时效果如图1081所示。图1081 高亮和凸起显示按钮组合框和列表框添加列表项的方法组合框和列表框是Excel中最常用的控件,可以用来显示工作表中的数据。为组合框和列表框添加列表项的方法有多种,下面以列表框为例演示添加列表项的方法。使用RowSource属性添加列表项使用RowSource属性将列表框直接与工作表上的一个单元格区域相链接,如下面的代码所示。#001PrivateSubUserForm_Initialize()#002DimiRowAsInteger#003iRow=("A65536").End(xlUp).Row#005EndSub代码解析:在窗体初始化时使用RowSource属性为列表框添加列表项。RowSource属性的语法如下:[=String]参数object是必需的,一个有效的对象。参数String是可选的,组合框或列表框列表的来源。RowSource属性也可以使用单元格地址,第4行代码可以改成下面的代码:需要注意的是,如果RowSource属性指定的工作表区域不是活动工作表的话,Address属性的External参数是不可缺的,设置为True表示是外部引用,如果缺省此参数或为False,将不能为列表框添加列表项。RowSource属性还可以使用命名的单元格区域,如果已把工作表区域命名为“城市”,第4行代码可以改成下面的代码:对于工作表中的列表框控件或使用窗体添加的列表框控件不能使用RowSource属性,需要使用ListFillRange属性指定填充列表框的工作表区域,如下面的代码所示。#001SubListFillRange()#002DimiRowAsInteger#003iRow=("A65536").End(xlUp).Row#005("列表框").="Sheet1!a1:a"&iRow#006EndSub代码解析:ListFillRange过程为工作表中的列表框的填充区域,ListFillRange属性用于指定填充列表框的工作表区域。第4行代码对于使用窗体添加的列表框控件需要使用ControlFormat属性来返回窗体控件以后才能设置其ListFillRange属性。使用List属性添加列表项使用List属性为列表框添加列表项,如下面的代码所示。#001PrivateSubUserForm_Initialize()#002DimArrAsVariant#003DimiRowAsInteger#004iRow=("A65536").End(xlUp).Row#005Arr=("A1:A"&iRow)#007EndSub代码解析:在窗体初始化时使用List属性为列表框添加列表项。List属性的语法如下:(row,column)[=Variant]参数object是必需的,一个有效对象。参数row是必需的,取值范围为0到列表条目数减1之间的数值。参数column是必需的,取值范围为0到总列数减1之间的数值。参数Variant是可选的,列表框中指定条目的内容。第6行代码,使用List属性把数组复制到列表框控件上。除了使用数组外,List属性还可以使用命名的单元格区域,如果已把工作表区域命名为“城市”,可以改成下面的代码:#001PrivateSubUserForm_Initialize()#002#003EndSub对于工作表中使用窗体添加的列表框控件使用List属性添加列表项,如下面的代码所示。#001SubList()#002DimArrAsVariant#003DimiRowAsInteger#004DimmyObjAsObject#005iRow=("A65536").End(xlUp).Row#006Arr=("A1:A"&iRow)#007SetmyObj=("列表框").ControlFormat#008=Arr#009EndSub代码解析:List过程设置列表框的List性,用于指定填充列表框的工作表区域。使用AddItem方法添加列表项使用AddItem方法添加列表项,对于单列的列表框,在列表中添加一项。对于多列的列表框,在列表中添加一行,如下面的代码所示。#001PrivateSubUserForm_Initialize()#002DimiRowAsInteger#003DimiAsInteger#004iRow=("A65536").End(xlUp).Row#005Fori=1ToiRow#007Next#008EndSub代码解析:在窗体初始化时使用AddItem方法为列表框添加列表项。AddItem方法的语法如下:[item[,varIndex]]参数object是必需的,一个有效的对象。参数item是可选的,指定要添加的项或行。第一个项或行的编号为0;第二个项或行的编号为1,依此类推。参数varIndex是可选的,指定新的项或行在对象中的位置。如果提供一个有效的varIndex的值,AddItem方法就把项或行放在列表中的那个位置。如果忽略varIndex,此方法就把项或行添加在列表的末尾。对于多列列表框或者组合框,AddItem方法插入一个完整的行,为控件的每一列都插入一项。为了给第一列后面的项赋值,可用List或Column属性来规定项的行和列。对于工作表中使用窗体添加的列表框控件使用AddItem方法添加列表项,如下面的代码所示。#001SubAddItem()#002DimiRowAsInteger#003DimiAsInteger#004iRow=("A65536").End(xlUp).Row#005With("列表框").ControlFormat#006.RemoveAllItems#007Fori=1ToiRow#008.AddItem(i,1)#009Next#010EndWith#011EndSub代码解析:AddItem过程设置使用AddItem方法添加为工作表中使用窗体控件添加的列表框添加列表项。其中第5行代码使用ControlFormat属性来返回窗体控件,第6行代码使用RemoveAllItems方法删除窗体控件中的列表框的所有数据项,如果控件是ActiveX列表框则需要使用Clear方法。去除列表框数据源的重复值和空格列表框的数据源引用工作表的数据时,如果工作表数据有重复值和空格,列表框也会出现重复值和空格,如图1101所示。图1101 列表框中的重复值和空格为了在窗体显示时去除列表框的重复值和空格,可以使用Add方法,如下面的代码所示。#001PrivateSubUserForm_Initialize()#002OnErrorResumeNext#003DimColAsNewCollection#004DimrngAsRange,arr#005DimiAsInteger#006ForEachrngInRange("A1:A"&[a65536].End(xlUp).Row)#007IfTrim(rng)<>""Then#008rng,key:=CStr(rng)#009EndIf#010Next#011ReDimarr(1To#012Fori=1To#013arr(i)=Col(i)#014Next#016EndSub代码解析:窗体的初始化事件,去除列表框引用工作表数据中的重复值和空格。第2行代码,错误处理语句,忽略错误。第3行到第5行代码,声明变量类型。第6行到第9行代码代码,在列表框引用的工作表数据中循环,把工作表数据源中的空格去除后使用Add方法添加到变量Col中。Add方法添加一个成员到Collection对象,语法如下:item,key,before,after参数object是必需的,一个有效的对象。参数Item是必需的,任意类型的表达式,指定要添加到集合中的成员。参数Key是可选的,唯一字符串表达式,指定可以使用的键字符串,代替位置索引来访问集合中的成员。如果指定的key和集合中现有成员的key发生重复,则会导致错误发生。所以在第2行代码中使用错误处理语句,忽略错误,继续执行下一句代码,这样就将数据源中的重复值去除。参数before是可选的,指定集合中的相对位置。在集合中将添加的成员放置在before参数识别的成员之前。如果参数是数值表达式,则before必须是介于1和集合Count属性值之间的值。如果参数是字符串表达式,则当添加一个被引用的成员到集合时,before必须对应于指定的key值。可以指定before位置或after位置,但不能同时指定这两个位置。参数after是可选的,指定集合中的相对位置。在集合中将添加的成员放置在After参数识别的成员之后。如果参数是数值表达式,则after必须是介于1和集合Count属性值之间的值;如果参数是字符串表达式,则当添加一个被引用的成员到集合时,after必须对应于指定的key值。可以指定before位置或after位置,但不能同时指定这两个位置。第10行到第14行代码,重新定义数组arr大小,把Col中数据赋给数组。第15行代码,把数组arr复制到列表框中。运行窗体,窗体中的列表框引用去除重复值和空格后的工作表数据,如图1102所示。图1102 去除重复值和空格的列表框移动列表框条目将列表框中的条目进行上下移动,如下面的代码所示。#001DimIntlistAsInteger#002DimStrlistAsString#003PrivateSubCommandButton1_Click()#004With#005Intlist=.ListIndex#006SelectCaseIntlist#007Case-1#008MsgBox"请选择一行后再移动!"#009Case0#010MsgBox"已经是最上一行了!"#011CaseIs>0#012Strlist=.List(Intlist)#013.List(Intlist)=.List(Intlist-1)#014.List(Intlist-1)=Strlist#015.ListIndex=Intlist-1#016EndSelect#017EndWith#018EndSub#019PrivateSubCommandButton2_Click()#020WithListBox1#021Intlist=.ListIndex#022SelectCaseIntlist#023Case-1#024MsgBox"请选择一行后再移动!"#025Case.ListCount-1#026MsgBox"已经是最下一行了!"#027CaseIs<.ListCount-1#028Strlist=.List(Intlist)#029.List(Intlist)=.List(Intlist+1)#030.List(Intlist+1)=Strlist#031.ListIndex=Intlist+1#032EndSelect#033EndWith#034EndSub代码解析:第1、2行代码在模块顶部声明两个变量分别用于保存列表框当前选中行的索引和内容。第3行到第18行代码,将列表框当前选中行的内容上移一行的代码。其中第5行代码使用变量Intlist保存列表框当前选中行的索引号,第6行代码判断索引号,,第7、8行代码如果变量Intlist值为-1,说明当前没有选中的行,显示一个消息框进行提示。第9、10行代码变量Intlist值为0,说明当前选中的行已是第一行了。列表框的ListIndex属性指定当前选中的列表框或组合框条目,语法如下:[=Variant]参数object是必需的,一个有效的对象。参数Variant是可选的,控件中当前被选的条目。第11行到第15行代码将当前选中的行向下移动一行,其中第12行代码将当前选中的行的内容赋给变量Strlist,第13行代码将当前选中行的内容更改为下面一行的内容,第14行代码将当前选中行的下面一行的内容更改为变量Strlist保存的内容,第15行代码将选中行向下移动一行,这样就将当前选中的行向下移动了一行。第19行到第34行代码将当前选中的行向上移动一行。将移动后的列表框条目保存到工作表中的代码如下:#001PrivateSubCommandButton3_Click()#002DimiAsInteger#003Fori=1To#004(i+1,1)=(i-1)#005Next#006EndSub代码解析:窗体中“保