[总结]
客观地说,做为竞赛题,本题并不难。恰逢春节,主要想添个喜庆。做一下总结: 1.数数算法 为了确保送出福数,必须得到福数的前一个数,考虑规则3“当上一次对方数的数距离福数相差在5以内时,可以数比对方大1-5之间的任一数”,这样就必需得到“福数-6”,在此之前,每一回合可控增长为4,只需要减去4N就可以得到起始数。这样,当福数产生后,起始数也就确定了,以后只要比前一次数增4,直到距离福数5以内时,报出福前数就可以了。 2.代码的协调 这是本题的另一个知识点,从答案上看,大家协调代码的基本功都不错。在防止代码产生“递归”效应上,一般都恰当地使用了Application.EnableEvents = False,bluestorm80使用全局变量的方法也是重要的方法,在防止非Application事件“递归”的场合经常用到。此外,“一钮两用”,数据在各过程间的传递,f_qc答案中doevents的使用,各有巧意,不多赘言。 3.图形(窗体)控件的操作(引子) 很多朋友,包括我,喜欢在工作表中使用图型控件和窗体控件(指“视图-工具栏-窗体”或在菜单工具栏右键中的那个“窗体”),喜欢那个小手,喜欢它相比呆板的标准控件更显可爱的样子。但常常让人困惑和失望的是,我们很多想做的事却常常不知道该怎么告诉它,公开的文档也很难找到可以参考的资料。一般情况下,我们首先会想到录制宏,来看一个例子:在你的工作表Sheet1上添加一个窗体控件中的列表框,它的默认名称通常是“下拉框 ?”(此处的问号为数字),改其名称为“CmbTry”,现在开始录制宏,给CmbTry指定数据源C9:C11,录制的宏大体是下面的样子: Sub Macro1() ActiveSheet.Shapes("CmbTry").Select With Selection .ListFillRange = "$C$9:$C$11" .LinkedCell = "" .DropDownLines = 8 .Display3DShading = False End With End Sub 录制宏给我们提供了Selection的解决方案,你可以把With部分简化成Selection.ListFillRange = "$C$9:$C$11",为了消除CmbTry被选中的宭态,再补加一句activecell.activate,通常情况下,这样也可以知足了。如果你觉得繁琐,试图改成ActiveSheet.Shapes("CmbTry").ListFillRange = "$C$9:$C$11"的话,真的对不起,VBA会告诉你不允许!现在我告诉你,名称允许!上面的代码,只需要[CmbTry].ListFillRange = "$C$9:$C$11"一句就够了。呵呵,不为别的,就为这一点,以后也要想着给你的图形取名哈,你看我是不是这样做了。 别走开,还有更出彩的。我们仍以CmbTry为例,想一想标准控件ComboBox,可以通过AddItem方法添加列表项,我们的CmbTry却只能通过工作表的区域来指定列表项,有没有办法使用AddItem等方法呢,可也! 添加列表项: [CmbTry].AddItem "我的项目" 删除第1个列表项: [CmbTry].RemoveItem 1 显示第1个列表项: Debug.Print [CmbTry].List(1) 当前值: 注意不是[CmbTry].Value,Value是当前值在列表项的索引号,而是: [CmbTry].List([CmbTry].Value) 上述是不能从录制宏得到的,而是一种验证的结果。图形控件使用它近亲标准控件的属性方法也不是完全可以照搬,但通常最重要的方法属性大多都是可以的,部分属性可以参考录制宏的代码得到,在事件的处理方式上,图形控件通过OnAction属性(通过录制“指定宏”的宏可以得到)与代码关联,这一般是最重要和基本的事件,象按钮的Click,组合框的Change。但有了这些,配合灵活的使用智慧,对于我们实现大多数我们想实现的功能已经足够! 本总结最后部分属本次竞赛题的外延,作为一个小礼物送给大家。但需要说明的是,这只是表象的素描,只是一个引子,更多的更准确的内容,将找时间和大家专文探讨。
[em12]
[此贴子已经被作者于2007-2-22 22:37:11编辑过] |