admin 管理员组文章数量: 1086019
2024年3月27日发(作者:支付宝python使用教程)
第30卷第3期
计算机应用与软件
Vo1.30 No.3
2013年3月
Computer Applications and Software
Mar.2013
Excel的InputBox方法中有缺陷部分的替代解决方案
孔令旗 吴允波 张琛
(焦作师范高等专科学校计算机与信息工程系河南焦作454000)
(焦作师范高等专科学校现代教育技术中心河南焦作454000)
摘要 运用Excel 2003中自定义函数、用户窗体与事件处理的“并发”运行和数据传递技术,设计一个VBA宏程序,它满足了在
任何条件下都能返回用户选定区域引用的VBA编程需求。设计该宏的目的是为了替代Excel 2003 Application.InputBox方法中有缺
陷的部分。程序亦能运行在提供VBA环境、但缺少交互式选择区域方法的wPs 2012专业增强版上。
关键词 Excel软件缺陷 VBA方法 事件处理 区域宏
中图分类号TP391.13 文献标识码A DOI:10.3969/j.issn.1000・386x.2013.03.084
AN ALTERNATIVE SoLUTIoN FoR DEFECTIVE PART OF
INPUTBOX METHoD IN EXCEL
Kong Lingqi Wu Yunbo Zhang Chen
(Department ofComputer and Information Engineering,Jionzuo Teachers College,Jiaozuo 454000,Henan,China)
。(Modern Education Technology Center,Jionzuo Teachers College,Jionzno 454000,Henan,China)
Abstract Using the techniques of“concurrent’’execution of user-defined functions,UserForms and events handling as well as data
transfer in Excel 2003,we design a VBA(Visual Basic for Applications)macro,which meets the programming requirement of VBA that it
can return to citation of user—selected range in any condition.The purpose of designing the macro is to replace the defective part in Application
InputBox method of Excel 2003.And it can also run on WPS 2012 professional plus version which providing VBA environment but lacking a
method for interactive selection of a range.
Keywords Excel Software defect VBA Method Events handling Range Macro
法 为程序设计中人机交互功能的实现提供了语言级支持。
0引 言
当InputBox方法的Type参数取值8时,可让用户用鼠标拖动或
键盘输入方式确定选定区域,并返回该区域的引用。遗憾的是
Excel是微软办公软件Microsoft Ofifce的组件之一,它可以
在Type参数取值8时,InputBox方法存在软件缺陷 。经过反
进行各种数据的处理、统计分析和辅助决策操作,广泛应用于管
复试验发现,当选择的区域符合下列条件之一时:
理、统计、财经、金融等领域。尽管Excel已从2003先后升级到
1)区域中的单元格有逻辑运算公式的条件格式;
2007和2010,但由于用户使用习惯、软件购置成本,以及信息技
2)区域毗邻的单元格有逻辑运算公式的条件格式。
术应用教育内容一般相对滞后等因素,Excel 2003还有相当广
InputBox方法极有可能出现程序运行错误。尽管该软件缺
泛的用户群。
陷在2003以后的版本中已得到了修复,但它还是困扰着Excel
1994年发行的Excel 5.0版本即具备了VBA的宏功能。
2003的VBA开发应用人员。
VBA基于Visual Basic for Windows发展而来,它提供了面向对
使用扩展了VBA功能的WPS 2012专业增强版时,发现它
象的程序设计机制和一种完整的程序设计语言。VBA可以使
不支持Appliacation.InputBox方法,即WPS 2012缺少了在VBA
用宏记录器记录用户的各种操作,将其转换为VBA程序,易于 环境下采用交互方式选定区域的语言级功能,这也在一定程度
学习掌握。VBA程序的开发与应用有助于数据处理工作的自 上影响了国产优秀软件WPS的深度应用。
动化。
针对上述问题,本文给出了一个替代Application.InputBox
区域(Range)是Excel操作中使用最为频繁的对象之一。
方法中有软件缺陷部分的VBA编程解决方案。
进行VBA程序设计开发时,“先获取用户选定区域,再对区域内
对象进行处理”的流程模式,贯彻了“以用户为中心设计和评
收稿日期:2012—04—24。孔令旗,副教授,主研领域:数据库,数据
估”的基本原则…。Excel中Appliacation对象的InputBox方
挖掘。吴允波,讲师。张琛,讲师。
320 计算机应用与软件 2013生
1技术方案
1.1 Excel对象模型简述
VBA环境下,Excel是由不同类型的对象组构成的应用程
序体,同一类型的对象组成一个对象集合,不同类型的对象、对
象集合又按层次结构进行组织。每一种类型的对象都拥有自己
的属性与方法。当对象能主动响应外部发生的随机变化时,该
对象类型还拥有事件。Excel内建对象的方法代码由Excel本
身提供 VBA程序只能调用;而事件处理代码则由有事件捕获
需要的用户自行设计,事件处理代码的程序框架规范由Excel
定义。
Excel的Workbook对象代表打开的一个工作簿,它是
Workbooks集合的成员。Workbooks集合包含当前打开的所有
工作簿的Workbook对象实例。sheetse1ecti0nchange事件是
Workbook对象众多事件中的一个 。当任一工作表上的选定
区域发生变化时,都将触发该事件。Excel的下级对象定义的事
件有时在上级对象中也有定义。例如Application是Workbook
的上级对象,其中也定义了和Workbook一样的SheetSelection.
Change事件。下面的示例用Workbook的sheetselecti0nchange
事件处理代码,在状态栏上显示选定区域所在的工作表名称及
选定区域地址。
Private Sub Workbook
图1 程序模块间的信息与控制流
实线表示数据流;虚线表示控制流
2程序设计
Excel的对象模型与WPS ET(电子表格)的对象模型存在
差异。为了保证所设计的代码在两个系统下都能正常运行,代
码设计时选择二者都支持的对象、属性、方法和事件。
2.1 Global变量设计
在VBAProject的模块夹中创建“模块1”,在其内设计两个
Global变量:
Global rngSelected As Range
Global blnFormRunning As Boolean
SheetSelectionChange(一
ByVal Sh As Object,ByVal Target As Exce1.Range)
Application.StatusBar:Sh.Name&”: &Target.Address
End Sub
在Excel对象模型中,Application位于所有对象的顶部,代
表启动的Excel应用。Excel运行期间,Workbooks对象实例的
多寡依赖于打开工作簿的个数,但Application对象实例有且仅
有一个。
。
Range型变量rngSelected存储选定区域的引用;Boolean型
变量blnFormRunning供UDF检测UserForm是否关闭(判断用
户是否完成区域选定)。UDF启动UserForm时将其置为True,
UserForm关闭时将该变量置为False。
1.2方案目标与思路
本方案的目标是设计一个用户自定义函数UDF(User De—
ifned Flanction),它能接受在工作簿的任一个工作表中用鼠标拖
动或键盘输入确定的一个或多个区域,并返回这些区域所对应
的一个Range对象的引用。程序既能在Excel 2003及后续版本
上运行,也能在扩展了VBA后的wPS 2012上运行。
解决问题的基本思路是运用UDF、UserForm(用户窗体)、
Workbook对象的SheetSelectionChange事件处理的“并发”执行
2.2 UserForm设计
UserForm的名称为InputRangeForm,在VBAPr ̄ect的“用户
窗体”夹中创建。窗体内有提示信息标签控件PromptLabel,文
本框控件AddressTextBox,确定按钮ConfirmButton,取消按钮
CancelButton。ConfirmButton按钮的Click事件代码设计如下:
Private Sub ConfirmButton
—
Click()
Then If AddressTextBox.Text=
MsgBox咻未选择区域!
Else 文本框有非空字符串
捕获文本框键盘输入区域地址错误
On Error GoTo ErrorHandler
和数据传递技术,实现交互式选定区域的功能。细化的逻辑设
计如下:
设计一个UserForm,UserForm中的文本框控件接受用户输
入或鼠标选择的区域地址;用户用鼠标选择区域时,通过Work—
book对象的SheetselectionChange事件处理,把用户选定区域的
Set mgSelected:Range(AddressTextBox.Text)
改变状态变量
blnFormRunning=False
地址置入UserForm中的文本框。
由于UserForm运行时不能直接向UDF传递数据,需要用
Global(全局)变量作为数据交换缓冲,实现它们之问的数据交
换。当UserForm关闭时,UserForm的退出事件处理将地址指向
的Range对象引用写入Global变量;UDF检测到UserForm关闭
后,从Global变量中获取Range引用,再予以返回。
卸载UserForm
Unload Me
Exit Sub
ErrorHandler:
Ms ̄ox愉人的区域地址有错误!
EndIf
End Sub
方案中UDF、UserForm、Workbook及用户四者间的信息流
和控制流参见图1。
CancelButton按钮的Click事件处理完成的操作有:置变量
mgSelected为Nothing,变量blnFormRunning为False,卸载
第3期
UserForm。
孔令旗等:Excel的InputBox方法中有缺陷部分的替代解决方案
Optional ByVal Prompt As Stirng)As Range
321
当UserForm通过标题栏的关闭按钮关闭时,需要对
UserForm的QueryClose事件处理进行编码,当UserForm的
CloseMode属性不等于1时,设置rngSelected为Nothing,bln—
以无模式方式显示用户窗体
InputRangeForm.Show 0
设置UserForm的标题
FormRunning为False。代码如下:
Private Sub UserForm
—
QueryClose(Cancel As Integer,一
CloseMode As Integer)
if CloseMode<>l Then
Set rngSelected=Nothing
blnFormRunning False
End If
End Sub
UserForm的Initialize事件处理将对AddressTextBox文本框
控件的Text属性进行初始化,其值置为Application.Selection.
Address。代码为:
Private Sub UserForm
—
Initialize()
AddressTextBox.Text=Application.Selection.Address
End Sub
2.3 SheetSelectionChange事件代码设计
Workbook对象的SheetSelectionChange事件处理代码比较
简单,处理逻辑为当InputRangeForm窗体对象存在时,进行数据
的推送。即将事件处理过程参数Target所携带区域引用的地址
值置入InputRangeForm中AddressTextBox控件的Text属性。事
件处理代码如下:
Private Sub Workbook
.
SheetSelectionChange(——
ByVal Sh As Object,ByVal Target As.Range)
If Not InputRangeForm is Nothing Then
InputRangeForm.AddressTextBox.Text=
一
Target.Address
EndIf
End Sub
此处的代码放在“ThisWorkBook”夹中。
2.4 UDF设计
设计的UDF函数名为InputRange,它有两个可选参数,其值
分别作为UserForm的标题和提示信息。函数返回值类型为
Range引用。
由图1可以看出,本方案须使UDF、UserForm和WorkBook
事件处理等三个模块“并发”运行。在程序设计初期,本以为
UserForm无模式显示(目的是让用户能对工作表实施操作)后,
UDF等待UserForm关闭,同时用户应该可以对UserForm和工
作表进行操作。但真实情况是UDF进入了查询循环后,独占了
临界资源——cPu资源和变量blnFormRunning资源,使该变量
的值永远保持为True,发生了死锁 。
解决死锁的关键是在UDF查询循环后,能让UserForm和
事件处理过程能获得CPU资源的使用权。查阅了VBA有关资
料后发现,VBA函数库中提供了一个DoEvents函数。该函数执
行时将控制传递给操作系统,操作系统处理完事件队列中所有
事件和SendKeys队列的所有键后,将控制返回到调用DoEvents
的进程中 j。于是在UDF的状态查询的循环体内,加入Do-
Events库函数的调用,使系统有机会处理事件和键盘输入,进而
使blnFormRunning有被改变的机会,死锁问题迎刃而解。
下面是UDF代码。程序中已进行了注释,此处不再说明。
这里的代码存放在“模块1”内。
Function InputRange(Optional ByVal Title As Stirng,—.
IfTitle= ”Then
InputRangeForm.Caption= 选择区域
Else
InputRangeForm.Caption=Title
End If
设置UserForm的信息提示
If Prompt= Then
InputRangeForm.PromptLabe1.Caption=
一
请选择一个或多个区域”
Else
InputRangeForm.PremptLabe1.Caption=Prompt
EndⅡ
blnFormRunning True
循环测试,等待UserForm关闭
使事件处理代码有获得CPU资源的机会
Do Until Not blnFormRunning
DoEvents
Loop
函数返回值置为用户选定区域的引用
Set InputRange=rngSelected
.
Endif
End Function
2.5设计附注
前面提及的“并发”运行的实现并非真正意义上的多进程
或多线程并发运行,而是借助于事件随机触发性和UDF主动出
让CPU资源占有权来实现的。宏观上就象UDF、UserForm和
WorkBook的事件处理在并发运行一样。
上述程序代码在Excel和WPS ET均可正常运行。实验时
发现Excel和WPS ET在程序运行外观上还是存在细微的差异。
对于Workbook的Sheetse1ectionchange事件,在Excel运行上可
理解为:“工作表选定区域改变后”;而WPS ET可理解为:“当
工作表选定区域改变时”。
3宏的封装与使用
3.1加载宏概述
一
个VBA加载宏是一个Excel启动时可以自动加载的.xla
文件。一般而言,加载宏包含了一些Excel本身不具备的功能
函数。创建加载宏是分发用户定义函数、提高软件重用性的一
种有效途径。
加载宏创建初期,它是一个工作簿(.xls)文件,用Visual
Bisic可在其中创建UDF,并进行调试。加载宏中的函数如果都
不涉及对象的事件处理,只需进行一些简单处理后将工作簿另
存为.xla类型文件,就把工作簿文件封装成一个加载宏文件;如
若不然,在封装前需要设计程序代码,将扩展了事件处理的对象
与相应的对象实例关联起来 。
VBA提供了有WithEvents选项的声明语句,用该选项声明
的对象拥有了对象类型的事件处理机能。可以套用VBA事件
处理过程的框架来设计事件处理代码。有了事件处理代码的对
象还是一个“虚对象”,它的事件处理过程代码不会受外界影响
322 计算机应用与软件 2013丘
而触发。虚对象和相同类型的对象实例建立关联后,虚对象的 复选框状态,再点击确定按钮来实现宏的加载或卸载。
程序代码被“嫁接”到对象实例上,对象实例就拥有虚对象定义
的事件处理功能。对象关联需要用“Set虚对象=对象实例”
语句来实现。
由于本加载宏内的自定义函数InputRange返回Range对象
的引用,故只适合在VBA编程中调用。调用的语法格式为:
Set rangeObject=一
Application.Run( SelectRange.xla!InputRange”,一
TitlePara,PromptPara)
3.2封装策略与代码实现
将本程序封装为加载宏的要求是只要Excel完成本宏的加
载,Excel运行期间所有打开、新建或激活的工作簿都可以调用
InputRange函数。
执行上述语句后,如果变量rangeObject is Noting为True,表
明用户没有选定区域;否则rangeObject为选定区域Range对象
的引用。下面是Sheet1的命令按钮的Click事件代码。放在
“Sheetl”夹中:
2.3节中的代码扩展的是WorkBook对象的事件处理,如果
定义WorkBook为虚对象,就意味着打开、新建或激活的工作簿事
件发生时,都要进行对象关联操作,处理代码略显繁琐。由于
Application对象拥有和WorkBook一样的SheetSeleetionChange事
件,而Excel启动后仅有一个Application对象实例,事件处理编码
就会变得非常简洁。所以这里定义一个Application对象类型的
变量app。app对象的app—SheetSelectionChange事件处理将完成
鼠标选定区域地址的推送。事件处理代码设计如下:
声明具有事件处理能力的对象app
Dim WithEvents app As Application
app对象的sheetselectionchange事件处理过程
Private Sub app
—
SheetSelecti0nchange(一
ByVal Sh As Object,ByVal Target As Range)
If Not InputRangeForm Is Nothing Then
InputRangeForm.TextBox1.Text=Target.Address
EndIf
End Sub
上面的程序代码还未实现app虚对象与已经存在的对象实
例Application的关联。
从Excel 2000开始,它有一个内置的Workbook—Open事件,
当工作簿文件打开时该事件仅会触发一次川。加载宏可认为是
一
个特殊的工作簿文件,它被加载时Workbook_Open事件也会触
发一次。可在Workbook_Open事件处理中进行一些初始化工作。
对于本程序而言,初始化工作就是建立app虚对象与Application
对象实例的关联。Workbook_Open事件处理代码如下:
Private Sub Workbook
Open()
Set app=Application
End Sub
本小节的代码放在“ThisWorkBook”夹中。
3.3加载宏的创建与使用
创建加载宏的过程是,启动Excel创建一个空工作簿文件,
单击工具栏中的Visual Basic按钮启动VBE(Visual Basic Edi—
tor)窗口,在VBE中完成UserForm的界面设计和上述代码的录
入;在VBE的工程管理器窗口右击顶级的工程名称(VBA—
Project),弹出快捷菜单,再点击“VBAProject属性”菜单项后弹
出属性对话框,在“通用”选项卡中的工程名称框中输入“交互
式选定区域宏”,然后关闭属性对话框;点击工具栏上的保存按
钮,关闭VBE窗口;将该工作簿另存为SelectRange.xla文件。
Excel会将该加载宏放在约定的文件夹C:\Documents and Set-
tings\<User Name>\Application Data\Microsoft\Add ̄s中。至
此就完成了加载宏的创建。
宏的加载与卸载通过Excel工具栏的“工具”按钮一“加载
宏…”菜单项弹出的“加载宏”对话框完成。如果要加载的宏在
对话框左边的列表框中未出现,点击浏览按钮找到要加载的宏
文件,文件名就会出现在列表框中。改变列表框中加载项前的
Private Sub CommandButtonl
~
Click()
Dim rAs Range
Set r:InputRange()
If Not r Is Nothing Then
 ̄/sgSox 选择的区域为: &Replace(r.Address,一
s” …
Else
MsgBox 未选中区域
EndIf
End SUb
4结语
本文通过一个具体程序的设计,给出了在VBA中实现
UDF、UserForm和事件处理如何“并发”运行,以及它们之间如
何进行数据交换的技术方案。经验也表明,在进行Excel或
WPS的VBA应用开发时,若UDF运行的时间较长,但又不希望
它的运行影响用户与系统的交互,编码中于适当时机调用Do・
Events函数不失为一种好的选择。
本程序在Excel 2003、2007和2010三个版本都进行了测
试,均能正常运行。该程序完全可以替代Excel 2003的Applica—
tion.InputBox方法中Type参数为8时的功能。本程序同时也使
原本不支持Application.InputBox方法的WPS 2012专业增强版
具有了交互式选定区域的VBA功能。因为WPS 2012还没有加
载宏的功能,所以WPS的VBA程序设计人员可以使用第2节
的程序代码。
参考文献
[1]董建明,傅利民,饶培伦.人机交互:以用户为中心的设计和评估
[M].2版.北京:清华大学出版社,2007.
[2]Microsoft.Microsoft Excel 2003 language reference[EB/OL].[2012-
2—10].http://www.microsoft.com/download/en/details.aspx?dis—
pla ylang=en&id=7273.
[3]Patton R.软件测试[M].周予滨,姚静,等译.北京:机械工业出版
社,2002.
[4]汤小丹,梁红兵,哲风屏,等.计算机操作系统[M].3版.西安:西
安电子科技大学出版社,2007.
[5]Microsoft.DoEvents function[EB/OL].[2012-02—12].http://office.
micro soft.com/en—us/access-help/doevents-function—HA001228827.
aspx・
[6]Pearson C.Application events[EB/OL].[2012-02-12].http://www.
cpear son.com/excel/appevent.aspx.
f 7]Microsoft.How to make a macro that automatically starts when you open
a workbook in Excel 2000[EB/OL].[2012-02-12].http://support.
microsoft.com/kb/26511 3/en.US.
版权声明:本文标题:Excel的InputBox方法中有缺陷部分的替代解决方案 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1711480281a596222.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论