Excel VBA Application 方法属性大全(5)

2019-04-17 15:45

End Sub

这个过程使用了和StartTimer过程相同的OnTime语法,将schedule参数设置为False告诉Excel取消该过程的执行。可能希望在Auto_Close宏或Workbook_BeforeClose事件中包括一个对该过程的调用。在StopTimer过程中,使用On Error Resume Next语句忽略当你企图删除一个不存在的过程时可能产生的任何错误。

下面的示例演示当在单元格B1中输入一个值后,如果A1单元格中不为空,那么将在10秒后自动清除单元格A1和B1中的内容。示例代码如下:

在标准模块中输入如下代码: Sub DeleteContents()

Worksheets(\End Sub Sub MyEntry()

Range(\End Sub

在工作表sheet1代码模块中输入如下代码:

Private Sub Worksheet_Change(ByVal Target As Range) If Target.Address <> \

If IsEmpty(Target) Or IsEmpty(Target.Offset(0, -1)) Then ExitSub Application.OnTime Now + TimeSerial(0, 0, 10), \End Sub 扩展话题一:

在VBA帮助系统的OnTime方法介绍中,只对其参数EarliestTime, Procedure, LatestTime, Schedule进行了说明,并列举了定时运行某过程和撤销OnTime设置的三个代码示例。对OnAction属性的介绍中,也只简要介绍了单击某图形或菜单项时运行指定宏的示例。均没有介绍当OnTime方法或OnAction属性中设置的所要运行的宏带有参数时,如何传递参数到这些宏程序中。下面是自已总结的一些参数的传递方法,供分享。

因为运用Application.OnTime或Object.OnAction调用宏程序的语法基本相似,因此下面介绍的OnTime方法所使用的语法同样适用于OnAction属性。

为了便于理解,以下介绍均使用一段相似的代码,只不过传递给所调用宏程序MyProcedure的参数不同而已,以此来讲解传递给宏程序不同参数的方法。例如,下面的代码将使MyProcedure宏程序在从现在起的2秒后运行:

Application.OnTime Now + TimeValue(\

问题1:假设MyProcedure宏程序接受参数,如何传递参数到该宏程序中?有下面几种情形:

(1)所调用的宏程序接受一个参数

如果是在正常代码过程中传递参数给宏程序,可以使用” MyProcedure (42)”,其中“42”

为传递给MyProcedure程序的参数。但如果这样的传递参数方法用在OnTime方法中,该程序将不会运行。

正确的语法是外层为双引号,内层再加上一组单引号,里面是程序名和程序所接受的参数。如下所示:

?MyProcedure宏程序接受一个数值参数

Application.OnTime Now + TimeValue(\(2)所调用的宏程序接受多个参数

如果所调用的宏程序接受几个参数,那么在这些参数之间应该用逗号分隔。如下所示: 'MyProcedure宏程序接受两个数值参数Application.OnTime Now + TimeValue(\

(3)所调用的宏程序接受字符串参数

如果所调用的宏程序所接受的参数是字符串,因为字符串已经带有一对双引号,因此应该将字符串包含在双层双引号中,即字符串参数周围有两对双引号。如下所示:

'MyProcedure宏程序接受一个字符串Hello!作为其参数Application.OnTime Now + TimeValue(\

问题2:当MyProcedure宏程序所接受的参数是变量,如何传递参数到该宏程序中? (1)该变量为局部变量,用如下所示的方式。

'MyProcedure宏程序接受一个字符串变量strText参数,该变量为局部变量strText = \\

(2)该变量为全局变量,用如下所示的方式,即不必加双层双引号。

'MyProcedure宏程序接受一个字符串变量g_strText参数,该变量必须声明为公有的g_strText = \g_strText'\

注意,在这种情况下变量必须声明为公共变量,否则MyProcedure宏程序将不能找到该变量参数。

扩展话题二:

除了Excel的OnTime方法外,还能使用Windows API库提供的Timer函数。在某些情况下,使用API过程比使用OnTime方法更容易:第一,告诉Windows需要计时器发生的时间间隔而不是某天的特定时间;第二,API过程将自动更新,计时器将每隔一段时间发生直到你告诉它停下来为止。

这些过程需要在Office2000或更新的版本中运行,因为我们使用了AddressOf函数,他们不会在Excel97或更早的版本中运行。

为了使用Windows计时器,将下面的代码放在一个标准代码模块中。 Public Declare Function SetTimer Lib \nIDEvent As Long, ByVal uElapse As Long, ByVal lpTimerFunc As Long) As LongPublic

Declare Function KillTimer Lib \

Long) As Long

Public TimerID As Long Public TimerSeconds As Single Sub StartTimer()

TimerSeconds = 1 ' 指定计时器的间隔.

TimerID = SetTimer(0&, 0&, TimerSeconds * 1000&, AddressOf TimerProc) End Sub Sub EndTimer() On Error Resume Next KillTimer 0&, TimerID End Sub

Sub TimerProc(ByVal HWnd As Long, ByVal uMsg As Long, ByVal nIDEvent As Long, ByVal dwTimer As Long) ' '由Windows调用的过程. ' 将与计时器相关的代码放置于此. '

End Sub

执行StartTimer过程开始计时。变量TimerSeconds指明计时器之间间隔有多少秒。这个值可能少于1。注意SetTimer过程在毫秒范围内取值,于是当我们调用SetTimer时我们通过将TimerSeconds乘以1000来增加间隔值。Windows每隔一段计时器发生的时间来调用TimerProc过程。可以将这个过程命名为想要的名字,但必须如示例中所示声明这些参数变量。如果变换了过程的名称,那么要确保也变换了SetTimer中的名字。Windows将传递下面的值到TimerProc过程:

HWnd Excel应用程序的Windows句柄。一般可忽略这个参数。 uMsg 值为275。一般可忽略这个参数。

nIDEvent 这个值通过SetTimer获得TimerID变量返回。如果不止一次调用SetTimer,那么能检查nIDEvent参数确定哪次调用SetTimer导致调用该过程。

dwTimer 计算机运行的毫秒数。相同的值通过GetTickCount Windows过程被返回。 调用EndTimer过程来停止计时器循环,这个过程调用KillTimer,通过SetTimer返回的值传递给它。

API计时器和Excel的OnTime方法间有两个重要的区别:第一,API计时器有着更精确的时间间隔(达到1秒或更少);第二,即便Excel处在编辑模式(也就是说,当正在编辑单元格时),API计时器也将执行。注意,当Excel处于编辑模式时,如果TImerProc企图修改工作表单元格,Excel将会立即退出。

Application对象的其它一些属性和方法 Caller属性

Application对象的Caller属性返回调用或执行宏过程的对象的引用,适用于窗体工具栏控件、指定宏的绘图对象和用户自定义函数。在确定调用用户自定义函数的单元格时特别

有用,例如下面的示例使用自定义函数WorksheetName函数显示调用该函数的工作表的名称。

Function WorksheetName() Application.Volatile WorksheetName = Application.Caller.Parent.NameEnd Function

在工作表单元格中输入“=WorksheetName()”,将显示该工作表的名称。Application.Caller作为一个Range对象返回对调用该函数的单元格的引用,然后使用Range对象的Parent属性产生对包含该Range对象的Worksheet对象的引用,最后将Worksheet对象的Name属性赋给该函数的返回值。当每次重新计算工作表时,Appliaction对象的Volatile方法强制Excel重新计算该函数。因此,如果改变了工作表的名称,那么该函数将显示新的工作表名称。

在WorksheetName函数中,使用下面的代码是错误的: WorksheetName = ActiveSheet.Name

如果激活的工作表不是包含该公式的工作表并发生重新计算,则将在原单元格中返回错误的名称。例如,如果在工作表Sheet1中已使用该函数,那么在工作表Sheet2中再次使用该函数时工作表Sheet1中将返回错误的名称,即工作表Sheet2的名称。

CutCopyMode属性

当我们在Excel工作表中使用剪切或复制时,在单元格区域周边会出现连续移动的虚线,即使执行完复制操作,原单元格区域周边的虚线框仍存在,直到您按Esc键或者开始单元格中输入操作。如果需要在执行完复制操作后,不要在Excel中看到复制时产生的虚线框,那么可以将Excel剪切复制模式关闭,即设置CutCopyMode属性为False:

Application.CutCopyMode=False Evaluate方法

Evaluate方法用于将名称转换为一个对象或者一个值,其语法如下: Evaluate(\表达式\也可以使用简写格式: [表达式]

表达式可以是任何有效的工作表计算,在其左边有或者没有等号均可,或者是对单元格区域的引用,包括定义的名称或外部引用,或者是图表对象。工作表计算包含在VBA中不能使用的工作表函数,或者是工作表数组公式。

例如,可以在工作表中使用ISBLANK函数,但不能在VBA中使用该函数,因为VBA的等效函数IsEmpty提供了相同的功能。然而,如果需要,仍然可以使用ISBLANK函数。下面的二个示例是等价的,如果单元格A1为空,则返回 True;如果单元格A1不为空,则返回False。

MsgBox Evaluate(\

第一个示例用法的好处是能够非常灵活地使用代码产生字符串值。第二个示例用法更简短,但仅通过编辑代码来修改表达式。下面的过程显示True或者False表明活动单元格是否为空,同时演示了第一个示例用法的灵活性。

Sub IsActiveCellEmpty()

Dim sFunctionName As String, sCellReference As String sFunctionName = \sCellReference = ActiveCell.Address

MsgBox Evaluate(sFunctionName & \End Sub

注意,使用第二个示例用法不能计算包含变量的表达式。

下面的两行代码演示使用Evaluate方法引用Range对象的两种方式,并且给该对象赋值:

Evaluate(\

第一个表达式是不实用的并且极少使用,而第二个表达式虽然极不灵活,却是引用Range对象更简便的方式。通过省略Value属性进一步简化表达式,因为该属性是Range对象的默认属性:

[A1] = 10

总之,使用方括号的优点在于代码简短,而使用Evaluate方法的优点在于参数是字符串,这样即可以在代码中构造该字符串,也可以使用变量。再举一个示例,下面的代码将工作表Sheet1中单元格A1的字体加粗:

Worksheets(\\

此外,Evaluate方法能够返回工作簿名称集合的内容以及有效地产生数组值。下面的代码创建一个隐藏的名称用来保存密码。在“插入”→“名称”→“定义”对话框中不能看到隐藏的名称,因此这是在工作簿里存储信息的便利方式,不会弄乱用户界面:

Names.Add Name:= \然后,像下面的代码一样在表达式里使用隐藏的数据:

sUserInput = InputBox(\Evaluate方法同样适用于数组。下面的表达式产生一个二维的Variant型数组,100行1列,包含从101 到 200的值。执行该过程比使用For…Next循环更有效率。

vRowArray = [ROW(101:200)]

下面的代码将101至200的值赋给单元格区域B1:B100,同样比For…Next循环更有效率:

[B1:B100] = [ROW(101:200)] OnKey方法

使用OnKey方法按特定的键或组合键运行指定的过程,也可以禁用内置的组合键。其语法为:

Application.OnKey(Key,Procedure)

参数Key指定要按的键的字符串。参数Procedure指定要运行的过程名称的字符串,


Excel VBA Application 方法属性大全(5).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:五笔常见最难打的字

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: