Archive for 08月 2008

编程为什么有趣?

s1086045左图是经典图书《The Mythical Man-Month》(中文译名:人月神话)的封面,Frederick P. Brooks Jr.著,汪颖译。从书中,我找到了喜欢编程的理由。(注:《人月神话》32周年版已出版,上图为20周年经典纪念版的封面)
书中的一节名为<职业的乐趣>,将内容辑录于此,时刻勉之。
编程为什么有趣?作为回报,它的从业者期望得到什么样的快乐?
首先,这种快乐是一种创建事物的纯粹快乐。如同小孩在玩泥巴时感到快乐一样,成年人喜欢创建事物,特别是自已进行设计。我想这种快乐是上帝创建世界的折射,一种呈现在每片独特、崭新的树叶和雪花上的喜悦。
其次,这种快乐来自于开发对他人有用的东西。内心深处,我们期望我们的劳动成果能够被他人使用,并能对他们有所帮助。从这一角度而言,这同小孩用粘土为“爸爸的办公室”捏制铅笔盒没有任何本质的区别。
第三,快乐来自于整个过程体现出的一股强大的魅力——将相互啮合的零部件组装在一起,看到它们以精妙的方式运行着,并收到预先所希望的效果。比起弹球游戏机或自动电唱机所具有的迷人魅力,程序化的计算机毫不逊色。
第四,这种快乐是持续学习的快乐,它来自于这项工作的非重复特性。人们所面临的问题总有这样那样的不同,因而解决问题的人可以从中学习新的事物:有时是实践上的,有时是理论上的,或者兼而有之。
最后,这种快乐还来自于在易于驾驭的介质上工作。程序员,这像诗人一样,几乎是仅仅工作在单纯的思考中。程序员凭空地运用自已的想像,来建造自已的“城堡”。很少有创造介质如此灵活,如此易于精炼和重建,如此容易实现概念上的设想(不过我们将会看到,容易驾驭的特性也有它自已的问题)。
然而程序毕竟同诗歌不同:它是实实在在的东西;它可以移动和运行,能独立产生可见的输出;它能打印结果,绘制图形,发出声音,移动支架。神话和传说中的魔术在我们的时代已变成了现实。在键盘上键入正确的咒语,屏幕会活动、变幻,显示出前所未有的也不可能存在的事物。
编程的快乐在于它不仅满足了我们内心深处进行创造的渴望,而且还唤醒了每个人内心的情感。

Excel的条件格式技术(1)

条件格式可以在很大程度上改进电子表格的设计和可读性,允许指定多个条件来确定单元格的行为,根据单元格的内容自动地应用单元格的格式。可以设定多个条件,但Excel只会应用一个条件所对应的格式,即按顺序测试条件,如果该单元格满足某条件,则应用相应的格式规则,而忽略其他条件测试。
(以下内容适合于Excel 2003及其以前版本)
在使用条件格式时,首先选择要应用条件格式的单元格或单元格区域,然后单击菜单“格式─—条件格式”,出现如图1所示的“条件格式”对话框。在Excel 2003及以前的版本中,条件格式最多只能设置三个条件。
conditionalformat
图1:选择“单元格数值”时的条件格式对话框
此时,若在第一个组合框中选择“单元格数值”,则右侧的组合框中将提供“介于”、“未介于”、“等于”、“不等于”、“大于”、“小于”、“大于或等于”、“小于或等于”等选项,并且在其右侧的输入框中可以输入相应的数值,也可以选择工作表中的单元格。然后,单击“格式”按钮,设置当条件为真时所应用的格式。
其中,选择“介于”时,包括设置的最大值和最小值,而选择“未介于”时,不包括设置的最大值和最小值。
若在第一个组合框中选择“公式”,则“条件格式”对话框如图2所示。
conditionalformat1
图2:选择“公式”时的条件格式对话框
此时,可在右侧的输入框中输入公式或者选择含有公式的单元格。注意,公式的值必须返回True或False。当公式返回True时,将应用条件格式;否则,不会应用设定的格式。这也从另一个侧面可以看出,对Excel公式与函数掌握的熟练程度,有助于灵活运用条件格式。换句话说,正是由于公式的强大功能,才使得条件格式才能发挥其真正的魅力。
关于条件格式,请注意下面的几点:
(1)复制单元格并将其粘贴到包含条件格式的单元格或者单元格区域中,将会删除该单元格或单元格区域中的条件格式,Excel不会给您任何警告信息。如果非得使用粘贴,并且要保留条件格式,那么可使用“选择性粘贴”功能。
(2)当复制一个包含条件格式的单元格时,将同时复制该单元格的条件格式。在包含条件格式的单元格区域中插入行或者列时,在新的单元格中将有相同的条件格式。
(3)如果要删除条件格式,仅在含有条件格式的单元格中按Delete键,不会删除条件格式。要删除条件格式,需要使用“编辑─—清除─—格式”命令或者“编辑─—清除─—全部”命令。还可以使用“条件格式”对话框,删除其中的条件。
(4)复制某单元格到含有条件格式的单元格中,也将清除条件格式。
(5)要快速查看所有包含条件格式的单元格,使用Excel的“定位”对话框,单击“定位条件”按钮,在“定位条件”中选择“条件格式”选项,如图3所示。
conditionalformat4
图3:利用“定位条件”中的“条件格式”选项选择所有包含条件格式的单元格
下面是《Escape From Excel Hell》一书中关于条件格式的两个示例,供参考。
示例1:在条件格式中使用公式且公式引用另一个单元格中的内容,如图4所示。
conditionalformat2
图4:条件公式中引用另一单元格中的内容
对单元格区域C6:D20应用条件格式,三个条件公式的含义分别为,其左侧B列相应单元格的值若大于且等于1,则单元格底纹为粉红色且字体加粗;若大于0,则单元格底纹为靛蓝色;若小于且等于0,则单元格底纹为浅灰色且字体为斜体。
示例2:在条件中使用其他工作表或工作簿中的内容
在应用条件格式时,通常不能直接引用其他工作表或工作簿,但如果为需要引用的单元格区域定义了名称,那么可以在条件中通过名称来引用其他工作表或工作簿中的内容。如下图5所示。
conditionalformat3
图5:通过定义名称来在条件格式中引用另一工作表中的数据
如图5,在工作表SearchAnExternalWorksheet中内容为“Trans 01”的单元格中应用了条件格式,在条件公式中引用了另一个工作表LookupTable中名称为MyLookupTable的单元格区域中的内容,如果相应的收益(损失)值大于1000则该单元格内容使用绿底斜体字显示,若小于-1000则该单元格内容使用红底粗体字显示。
还有一种方法来引用其他工作表中的单元格。例如在需要使用条件格式的工作表中的某单元格中输入公式来引用其他工作表中的单元格,然后在条件格式中引用此单元格。
<未完待续……>

Excel Hacks #4:避免表面上不必要的提示

Excel总会提示您确认您刚才要求Excel执行的操作,退出该会话并让Excel回去执行操作。
我们探讨的提示类型是询问您是否想启用宏,或者是否确定想删除工作表。这里,介绍如何坚决地去除最常见的提示。
当没有任何宏时提示启用宏
当用于在工作簿中录制宏时,Excel的记忆象钢夹一样。不幸的是,即使您通过VBE编辑器删除了一个或多个宏,宏的记忆却不会“消失”。因此,当您重新打开该工作簿时,Excel仍然会提示您是否启用宏,即使没有什么宏。
当然,如果您将安全性设置为“不通知而禁用所有宏”,则不会出现是否启用宏的提示。
当录制宏时,Excel会插入一个VB模块来包含命令和自定义函数。在打开工作簿时,Excel检查模块的存在,是否为空或者有宏。删除工作簿的宏仅删除模块内的任何代码,而不是模块本身。要避免不必要的宏提示,需要删除模块。下面介绍如何实现。
打开VBE编辑器,您将看到如图1所示的图。
enablemacro
图1:工程资源管理器中的模块(示例)
在工程资源管理器中找到工作簿,并单击其左侧的加号(+)展开该工作簿的组件,特别是如果模块没有显示时。依次右键单击每个模块并从菜单中选择“移除模块”。建议导出模块。在删除可能包含有用的代码的模块前,依次双击每个模块确保您不再需要它们。
提示保存不存在的变化
您可能已经注意到了,有时简单地打开工作簿并且没有对该工作簿作过实质的修改,但仍会触发Excel提示您去保存对您的个人宏工作簿的修改。无论您是否知道,在个人宏工作簿中有一个易失性函数。
个人宏工作簿是第一次录制宏时创建的隐藏工作簿(单击“开发工具”─—“代码”─—“录制宏”,在“录制新宏”对话框的“保存在”下拉菜单中指定“个人宏工作簿”)。每次使用Excel都会打开该工作簿。易失性函数(或公式)每次在Excel执行几乎任何操作时都会自动重新计算,包括打开和关闭工作簿或整个应用程序。最常见的两个易失性函数是Today()和Now()函数。
因此,虽然您可能相信您没有对工作簿作出过任何修改,但这些易失性函数可能在后台正在运行。这会被当作对工作簿作出了修改,并且触发Excel提示保存这些不可见的变化。
如果您想Excel停止提示您保存实际上没有做出修改的工作簿,您要开启一些选项。最明显的是首先不要在个人宏工作簿中存储易失性函数,并且删除任何已经存在于该工作簿的易失性函数,您能够使用下面所示的相当简单的代码欺骗Excel认为在其打开时已保存个人宏工作簿,从而绕开检查:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Me.Saved = True
End Sub

上面的代码必须放置在个人宏工作簿的ThisWorkbook模块中。要达到此目的,选择“视图─—窗口─—取消隐藏”,从“取消隐藏工作簿”中选择“Personal.xlsb”并单击“确定”。打开VBE编辑器并输入上述代码。
当然,如果有希望重新计算的易失性函数并且希望保存修改,那么需要明确地告诉Excel这样做:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Me.Saved
End Sub

这个宏将在每次打开工作簿时自动保存个人宏工作簿。
为所录制的宏停止Excel的警告提示
录制的宏的缺陷之一是,虽然在摸仿几乎任何命令方面都相当好,但是却忽略了响应提示的操作。删除一个工作表时,将会出现需要确认的提示;运行相同功能的宏,仍然会被提示。让我们避开这些提示吧。
选择“开发工具─—代码─—宏”或者按“Alt+F8”组合键打开“宏”对话框,确保“位置”下拉列表中选择“所有打开的工作簿”,选择相应的宏并单击“编辑”按钮,在过程代码的第一行添加下列语句:
Application.DisplayAlerts = False
在代码结束前,即过程代码段的结尾,添加下列语句:
Application.DisplayAlerts = True
此时,该宏应该如下:
Sub MyMacro()
    
    ‘MyMacro Macro
    ‘Deletes the Active worksheet
    
    
    
    Application.DisplayAlerts = False
    ActiveSheet.Delete
    Application.DisplayAlerts = True
End Sub

注意,在宏结束时应该恢复警告,以重新启用在Excel操作时标准的Excel提示。否则,您将再不会看到Excel给您的一些重要提示。
好了,现在您知道如何在使用Excel时避免提示的方法了,但是要小心,因为这些提示的出现都是有其缘故的。在关闭提示之前,您应该完全确保理解了提示的目的。

注:初译自《Excel Hacks》,仅供参考。

标签: , ,

专注与实践

最近在看两本书,一本名为《求医不如求已》,中里巴人著,是关于医学和健康方面的书藉;一本名为《.NET 2.0面向对象编程揭秘》,金旭亮著,是一本关于计算机编程技术方面的书。两本书的内容大相径庭,但看书的过程中,两位作者的思想和观点都给我很大的启发。
专注
《求医不如求已》一书讲述了很多利用人体自身来治疗、养生、保健的实用妙法,很值得大家研读,并在平时加以使用,毫不夸张地说,这些会为自已的健康带来极其巨大的帮助。在阅读该书,感受到一件件奇妙的事物的同时,也有一些其它的感受。我是指与学习知识有关的感受,例如看看该书第一章中的“7.必须学会与疾病切磋”中的最后一段:
“举这些不经意间治疗成功的例子是想告诉您,不要把治病搞成很繁琐的事。有的朋友每天要按摩很多穴位,还要刮痧、拔罐、练功,总觉得运用的方法越多,治疗的效果越好。其实并非如此,我们的气血就那么多,我们需集中力量,逐个解决身体的问题;切不可将气血分散各处,无的放矢,这样越治问题会越多,终将失去信心和耐心。记住:简单才有效,顺势才迅捷。”
我想,治疗身体如此,平时的学习知识和做事情又何偿不是呢。我们所需要做的就是,集中于一点,各个突破,这样才会有收获。也就是说,无论干什么事情,我们需要的是专注,否则,什么都想要,什么都抓,结果什么都得不到,反倒身心俱惫。
实践
“请读者牢记:学习软件技术的最终目的是应用它来解决现实生活中的实际问题。我们不要当一个’C#语法手册’(在这点上人脑比得过电脑?),也不要当一个只会记忆知识的’两脚书橱’(只顾着吸收知识而不去消化,知识越多,头脑就越僵化),要主动应用知识通过实践去创造真正的价值,以让我们的生活过得更好!”
这是金老师在他的《.NET 2.0面向对象编程揭秘》一书的前言中写下的一段话,非常的中肯,能够让沉迷在理想的技术世界中的人眼前一亮。是的,唯有实践,边学习边实践,在实践中进一步学习,才能积累更多更好的经验,也能体现学习的价值。
乐趣
“我不喜欢那种满纸术语、满页公式、一脸严肃的技术书籍,那总让我回想起令人痛苦的学生阶段——硬着头皮学枯燥无味的教科书,被考试压得透不过气来。
学习不应该变得如此枯燥,探索未知的世界应该是一件有趣的事。尤其是编程,更是一件好玩的事,一件很让人有成就感的事。”
这也是金老师在他的《.NET 2.0面向对象编程揭秘》一书的前言中的话语。在学习中找到乐趣,在乐趣中学习!
附链接
金旭亮老师在CSDN中的博客:http://blog.csdn.net/bitfan
金旭亮老师在新浪中的博客:http://blog.sina.com.cn/bitfan
中里老师的网站:http://www.mr2dr.com/
中里老师的博客:http://jinjiduli.blog.hexun.com/

在工作表中动态添加窗体控件

下面的内容及程序代码模仿自《Excel 2007 VBA Programmer’s Reference》,可能在某些情形下极其有用,因此特辑录于此,供参考。
如下图所示,双击工作表Sheet1的列A中的任一单元格,将出现一组合框,允许用户选择其中的项目。当用户选取某项目后,将自动输入到该单元格,并在该单元格右侧的单元格中输入相应的价格数字,组合框同时消失。
addcomboxdynamic1
下面是程序代码。在工作表Sheet1的代码模块中输入BeforeDoubleClick事件代码:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
     If Not Intersect(Target, Columns(”A”)) Is Nothing Then
         Call AddDropDown(Target)
         Cancel = True
    End If
End Sub

在任一模块中,输入下面的代码:
Sub AddDropDown(Target As Range)
    Dim ddBox As DropDown
    Dim vProducts As Variant
    Dim i As Integer
    ‘创建产品数组
    vProducts = Array(”香蕉”, “苹果”, “菠萝”, “葡萄”)
    ‘在目标单元格中添加下拉控件
    With Target
        Set ddBox = Sheet1.DropDowns.Add(.Left, .Top, .Width, .Height)
    End With
    ‘定义执行的宏并填充列表
    With ddBox
        .OnAction = “EnterProdInfo”
        For i = LBound(vProducts) To UBound(vProducts)
            .AddItem vProducts(i)
        Next i
    End With
End Sub

Private Sub EnterProdInfo()
    Dim vPrices As Variant
    ‘创建价格数组
    vPrices = Array(6, 8, 5, 4)
    ‘输入所选项到相应的单元格
    With Sheet1.DropDowns(Application.Caller)
        .TopLeftCell.Value = .List(.ListIndex)
        .TopLeftCell.Offset(0, 1).Value = vPrices(.ListIndex + LBound(vPrices) - 1)
        ‘删除
        .Delete
    End With
End Sub

如下图所示:
addcomboxdynamic2