﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>完美Excel</title>
	<atom:link href="http://www.excelperfect.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.excelperfect.com</link>
	<description>Excel资讯 技术 技巧 资源 应用 相关技术 …… 还有Excel外的生活</description>
	<lastBuildDate>Sat, 13 Mar 2010 01:26:44 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Word操作技巧(一)</title>
		<link>http://www.excelperfect.com/2010/03/13/wordtips1/</link>
		<comments>http://www.excelperfect.com/2010/03/13/wordtips1/#comments</comments>
		<pubDate>Sat, 13 Mar 2010 01:26:44 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[Word]]></category>
		<category><![CDATA[Word技巧]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1575</guid>
		<description><![CDATA[上周在分部内为同事进行了一场Word操作技巧培训，引起了大家比较强烈的反响，很多人都惊讶于每天使用的Word有如此多的技巧和功能，对Word又有了重新的认识。通过这次培训，也使我认识到，虽然大家经常使用Word，但对其的了解还远远不够，以致于如此一款优秀的软件，没有得到很好的使用，甚至得到了许多误解。
由于时间有限，没有更深入的讲解，特别是长篇文档的编辑，还有很多有用的技巧还没有提及。不过，以后有时间还会组织类似的培训。
下面，将培训的内容整理于此。
学习和使用Word的一些感受

想要提高效率，轻松操作Word，必须得下一些功夫来研究，学心一些技巧。掌握的方法越多，越能有效地处理各种问题
养成规范合理使用Word的习惯，正确使用Word的功能。Word非常强大，关键在于你对她的了解和如何使用。很多时候，不是软件本身不好，而是太灵活了，使得你可以随心所欲，结果把软件给用烂了
使用Word，不能技机取巧，也不能钻牛角尖。要根据实际工作特点而运用

Word里的彩蛋——主要是引起大家的兴趣
1.（Word 2003）“狐狸与懒狗”彩蛋
（Word 2007）变种的“狐狸与懒狗”彩蛋
在英文输入法下，输入=rand(n,m)，n和m都是自然数。随着n和m的变化，重复显示一些句子。
主要是为了方便快速输入便于练习编辑的文字。
2.胡万进印
在Word 2007 Beta版中有，即在文档中输入一个“胡”字，将其设置为幼圆字体或隶书，再将其设置为空心，就会看到字中间有一个“胡万进印”。
Word操作的几种情形

基本的操作技术和技巧
长篇文档的操作技巧
制作大量类似的文档
文档合并

一些约定
1.单击——指按下鼠标左键
2.右击——指按下鼠标右键
3.双击——指连续按鼠标左键或右键两下
4.组合键——指同时按下两个或多个键盘键
5.除非特别指明，表明适合Word 2003和2007两个版本
Word 2007中独有的特点
1.为什么Office 2007变化如此之大——全面创新 方便用户快速找到和利用已有的功能；不同的文件格式，文档容量大量减少，方便存储和共享
2.功能区
3.Office菜单——相当于老版本的“文件”菜单
4.Mini工具栏
5.库——实时预览
6.根据内容显示上下文选项卡（显示该显示的，隐藏不该显示的）
7.SmartArt
8.状态栏更丰富和便于使用
9.原则上不允许像以前版本那样随心所欲地自定义（演示一下），但其实自定义更方便和可靠
10.除界面外，两个版本中的中心功能大致相同。
好习惯还是坏习惯
下面列举了很多人在使用Word时的一些不好的习惯，以及一些好习惯。
(坏习惯)
1.按空格键来对齐或居中
2.按回车键来调整段落的间距
3.自已手工为目录编号
4.忽视帮助文件
5.页面设置不规范（没有使用文档网格功能）
6.绘制表格而不是插入表格
7.表格跨页时没有标题
8.忽视样式
(好习惯)
经常按Ctrl+S
输入技巧

利用剪贴板实现快速输入。（Word 2003）视图——任务窗格——剪贴板，从中选择短语或词组，实现快速输入。（Word 2007）开始——剪贴板组中的对话框启动器，从中选择短语或词组，实现快速输入。
多个整篇文档一次性导入。（Word 2003）插入——文件，选择要导入的文档（可选择多篇），插入。（Word 2007），插入——文本——对象——文件中的文字，选择要导入的文档，插入。
规范大写的中文日期。例如，要输入中文的2000，右击中文输入法状态条右侧的小键盘，选择单位符号，再输入二○○○。当然，这里面还有许多选项，可以输入很多特殊字符。
（Word 2003）插入——日期和时间
（Word 2007）插入——文本组中的日期和时间
输入系统当前的日期和时间。日期：Shift+Alt+D，时间：Shift+Alt+T
使用查找和替换功能一次输入多张图片。先插入一张图片，在其他需要插入的地方输入字母z（也可输入其他的文字，但前后要一致），先中图片，复制，按Ctrl+H，查找内容填z，替换为输入^c(c为小写)
简化常用专业用语的输入。使用自动更正功能，（Word 2003）工具-自动更正选项，如“SG”替换“《三峡工程水工建筑物巡视检查和维护检修规程》”，经常输入时会很方便。（Word 2007）该功能不在功能区中，需要使用选项调出来。
快速输入大写中文数字。（Word 2003）选择数字，插入-数字（或者在出现的对话框中输入数字），选大写的数字类型，注：不能转换小数部分。（Word 2007）插入——符号——编号。
让字符转换为特殊符号。通过特殊字体，如z设置为Webdings则变为禁烟符号等。
几个特殊符号的特殊输入。“Alt+Ctrl+C”-版权符号，“Alt+Ctrl+R”-注册符号，“Alt+Ctrl+T”-商标符号，“Alt+Ctrl+E”-欧元符号，“Shift+Alt+Ctrl+？”-&#191;，”Shift+Alt+Ctrl+!”&#161;。

(常用快捷键)
Ctrl+C(复制)、Ctrl+V(粘贴)，Ctrl+B(加黑)，Ctrl+I(斜体)，Ctrl+H(查找与替换)，有些快捷键按两下回到原状态
重复输入按F4，撤销按Ctrl+z
显示和编辑小技巧

取消隐藏的显示。即从Word 2002起，折叠的菜单（Microsoft的失误）。工具——自定义——始终显示整个菜单。
单击或双击两页之间的空隔，使页面合起来。更易阅读，特别是段落或表格分在两页且屏幕较小时
双击打开常用对话框。
        在横向标尺上边缘和竖向标尺上双击打开“页面设置”对话框；
        双击横向标尺下边缘打开“制表位”对话框；
        （Word 2003）在插入的文本框等对象上双击，则打开“设置文本框格式”等对话框；
           [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">上周在分部内为同事进行了一场Word操作技巧培训，引起了大家比较强烈的反响，很多人都惊讶于每天使用的Word有如此多的技巧和功能，对Word又有了重新的认识。通过这次培训，也使我认识到，虽然大家经常使用Word，但对其的了解还远远不够，以致于如此一款优秀的软件，没有得到很好的使用，甚至得到了许多误解。<br />
由于时间有限，没有更深入的讲解，特别是长篇文档的编辑，还有很多有用的技巧还没有提及。不过，以后有时间还会组织类似的培训。</span><br />
下面，将培训的内容整理于此。<br />
<strong>学习和使用Word的一些感受</strong></p>
<ul>
<li>想要提高效率，轻松操作Word，必须得下一些功夫来研究，学心一些技巧。掌握的方法越多，越能有效地处理各种问题</li>
<li>养成规范合理使用Word的习惯，正确使用Word的功能。Word非常强大，关键在于你对她的了解和如何使用。很多时候，不是软件本身不好，而是太灵活了，使得你可以随心所欲，结果把软件给用烂了</li>
<li>使用Word，不能技机取巧，也不能钻牛角尖。要根据实际工作特点而运用</li>
</ul>
<p><strong>Word里的彩蛋</strong>——主要是引起大家的兴趣<br />
1.（Word 2003）“狐狸与懒狗”彩蛋<br />
（Word 2007）变种的“狐狸与懒狗”彩蛋<br />
在英文输入法下，输入=rand(n,m)，n和m都是自然数。随着n和m的变化，重复显示一些句子。<br />
主要是为了方便快速输入便于练习编辑的文字。<br />
2.胡万进印<br />
在Word 2007 Beta版中有，即在文档中输入一个“胡”字，将其设置为幼圆字体或隶书，再将其设置为空心，就会看到字中间有一个“胡万进印”。<br />
<strong>Word操作的几种情形</strong></p>
<ul>
<li>基本的操作技术和技巧</li>
<li>长篇文档的操作技巧</li>
<li>制作大量类似的文档</li>
<li>文档合并</li>
</ul>
<p><strong>一些约定</strong><br />
1.单击——指按下鼠标左键<br />
2.右击——指按下鼠标右键<br />
3.双击——指连续按鼠标左键或右键两下<br />
4.组合键——指同时按下两个或多个键盘键<br />
5.除非特别指明，表明适合Word 2003和2007两个版本<br />
<strong>Word 2007中独有的特点</strong><br />
1.为什么Office 2007变化如此之大——全面创新 方便用户快速找到和利用已有的功能；不同的文件格式，文档容量大量减少，方便存储和共享<br />
2.功能区<br />
3.Office菜单——相当于老版本的“文件”菜单<br />
4.Mini工具栏<br />
5.库——实时预览<br />
6.根据内容显示上下文选项卡（显示该显示的，隐藏不该显示的）<br />
7.SmartArt<br />
8.状态栏更丰富和便于使用<br />
9.原则上不允许像以前版本那样随心所欲地自定义（演示一下），但其实自定义更方便和可靠<br />
10.除界面外，两个版本中的中心功能大致相同。<br />
<strong>好习惯还是坏习惯</strong><br />
下面列举了很多人在使用Word时的一些不好的习惯，以及一些好习惯。<br />
(坏习惯)<br />
1.按空格键来对齐或居中<br />
2.按回车键来调整段落的间距<br />
3.自已手工为目录编号<br />
4.忽视帮助文件<br />
5.页面设置不规范（没有使用文档网格功能）<br />
6.绘制表格而不是插入表格<br />
7.表格跨页时没有标题<br />
8.忽视样式<br />
(好习惯)<br />
经常按Ctrl+S<br />
<strong>输入技巧</strong></p>
<ul>
<li>利用剪贴板实现快速输入。（Word 2003）视图——任务窗格——剪贴板，从中选择短语或词组，实现快速输入。（Word 2007）开始——剪贴板组中的对话框启动器，从中选择短语或词组，实现快速输入。</li>
<li>多个整篇文档一次性导入。（Word 2003）插入——文件，选择要导入的文档（可选择多篇），插入。（Word 2007），插入——文本——对象——文件中的文字，选择要导入的文档，插入。</li>
<li>规范大写的中文日期。例如，要输入中文的2000，右击中文输入法状态条右侧的小键盘，选择单位符号，再输入二○○○。当然，这里面还有许多选项，可以输入很多特殊字符。<br />
（Word 2003）插入——日期和时间<br />
（Word 2007）插入——文本组中的日期和时间</li>
<li>输入系统当前的日期和时间。日期：Shift+Alt+D，时间：Shift+Alt+T</li>
<li>使用查找和替换功能一次输入多张图片。先插入一张图片，在其他需要插入的地方输入字母z（也可输入其他的文字，但前后要一致），先中图片，复制，按Ctrl+H，查找内容填z，替换为输入^c(c为小写)</li>
<li>简化常用专业用语的输入。使用自动更正功能，（Word 2003）工具-自动更正选项，如“SG”替换“《三峡工程水工建筑物巡视检查和维护检修规程》”，经常输入时会很方便。（Word 2007）该功能不在功能区中，需要使用选项调出来。</li>
<li>快速输入大写中文数字。（Word 2003）选择数字，插入-数字（或者在出现的对话框中输入数字），选大写的数字类型，注：不能转换小数部分。（Word 2007）插入——符号——编号。</li>
<li>让字符转换为特殊符号。通过特殊字体，如z设置为Webdings则变为禁烟符号等。</li>
<li>几个特殊符号的特殊输入。“Alt+Ctrl+C”-版权符号，“Alt+Ctrl+R”-注册符号，“Alt+Ctrl+T”-商标符号，“Alt+Ctrl+E”-欧元符号，“Shift+Alt+Ctrl+？”-&iquest;，”Shift+Alt+Ctrl+!”&iexcl;。</li>
</ul>
<p>(常用快捷键)<br />
Ctrl+C(复制)、Ctrl+V(粘贴)，Ctrl+B(加黑)，Ctrl+I(斜体)，Ctrl+H(查找与替换)，有些快捷键按两下回到原状态<br />
重复输入按F4，撤销按Ctrl+z<br />
<strong>显示和编辑小技巧</strong></p>
<ul>
<li>取消隐藏的显示。即从Word 2002起，折叠的菜单（Microsoft的失误）。工具——自定义——始终显示整个菜单。</li>
<li>单击或双击两页之间的空隔，使页面合起来。更易阅读，特别是段落或表格分在两页且屏幕较小时</li>
<li>双击打开常用对话框。<br />
        在横向标尺上边缘和竖向标尺上双击打开“页面设置”对话框；<br />
        双击横向标尺下边缘打开“制表位”对话框；<br />
        （Word 2003）在插入的文本框等对象上双击，则打开“设置文本框格式”等对话框；<br />
           （Word 2007）选中文框框后，出现“文本框工具”上下文选项卡。<br />
          在状态栏右侧“中文(中国)”上双击，打开“语言”设置对话框；<br />
          （Word 2003）在状态栏上的“录制”上双击，打开“录制宏”对话框；（Word 2007）状态栏上有一个”录制宏”按钮；<br />
          （Word 2003）在状态栏右侧“书形”按钮上双击，执行“拼写和语法检查”，每双击一次选中一处有语法错误的文本，并弹出“输入错误或特殊用法”对话框；（Word 2007）状态栏上有一个相应的按钮；<br />
          （Word 2003）在状态栏左侧“位置”区域双击，则打开“查找和换”对话框，并指向“定位”标签。（Word 2007）左下角的”页面”有相应的功能。
</li>
<li>F8键，连续选择。有时大段大段选择时，不方便<br />
按住Shift键不放，也可以达到同样的效果</li>
<li>按住Ctrl键不放，可以选择不连续的区域</li>
<li>清除页眉下的横线。有时，页眉下面有一根横线，一直顽固地在那儿，即使取消页眉也在。<br />
（Word 2003） (1)格式—格式和样式，选中页眉项，选修改，单击格式按钮，选边框确定样式即可(2)在页眉处双击，单击格式—边框和底纹，在边框标签中选中设置下的无，单击应用于选段落，确定返回即可。<br />
（Word 2007）(1)开始—样式组的对话框启动器，选中页眉项，修改——格式，边框中设置；(2)开始——段落——边框和底纹中设置</li>
<li>奇偶页设置不同的页眉(页脚)。（Word 2003）文件—页面设置，单击版式，选中奇偶页不同，确定。单击视图—页眉和页脚，按提示进行。（Word 2007）插入——页眉，在页眉页脚工具中选择。</li>
<li>设置字号。增大反复按Ctrl+](或Ctrl+Shift+>)，减小反复按Ctrl+[(或Ctrl+Shift+<)。注意，每个操作的两种快捷方式大同小异，也就是说还是有差异，主要是Ctrl+Shift+>会跳过某些字号，而Ctrl+]这种快捷方式则不会，即属于微调。</li>
<li>剪切。选中需要剪切的内容，按F2，将光标移至需要插入剪切内容的地方（注意光标的变化），按下Enter键。还有一个快捷键，Ctrl+X。</li>
<li>快速定位上次编辑点。打开相应文档，按下Shift+F5，即定位在退出文档时光标所在位置。</li>
<li>分屏显示长文档。（Word 2003）窗口—拆分（Word 2007）视图——窗口——拆分</li>
<li>在文档中插入工具栏上的图标（仅Word 2003 ）。保证自定义对话框处于打开状态，选中工具栏上需要的图标，右击选复制按钮图标选项。</li>
<li>按Alt+Tab组合键可以在打开的应用程序窗口之间切换。</li>
</ul>
<p><strong>表格操作技巧</strong></p>
<ul>
<li>用键盘输入表格。两个字符“+”和“-”，如输入“+&#8212;-+&#8212;-+&#8212;-+”后按回车键即可插入一个1行3列的表格。增加表格行数，将光标定位在该表格右外侧，按下回车键即可。</li>
<li>选中整个表格。光标在表格中，注意左上角出现一个带十字向箭头的方框，单击该方框即可选中整个表格。</li>
<li>固定列宽的表格与自动调整列宽的表格。</li>
<li>为跨页表格自动添加标题行。选中表格标题行，（Word 2003）表格—标题行重复。（Word 2007）表格工具——布局——数据——重复标题行。（很多跨页的表格没有标题行，让阅读的人不得不回头去看标题，这也是一个不好的操作习惯）</li>
<li>让两个(多个)表格并排排列。将多个表格的数据填充在一个大的表格中，然后仿照“隐藏表格边框”，将表格中间分隔列的边框清除掉即可。</li>
<li>任意调整表格位置。表格—表格属性，在表格标签中，选中“环绕”选项，确定。然后用鼠标按住表格“控制柄”，即可任意调整表格位置。要进一步设置，单击其中的“定位”按钮进行。</li>
<li>表格单元格自动编号</li>
</ul>
<p><strong>打印技巧</strong></p>
<ul>
<li>一张纸打印多页文档。将多页文件打印在一张纸上，文件—打印，在缩放选项下单击“每页的版数”右侧的下拉按钮，选择一种版式即可。</li>
<li>打印指定页面、打印指定区域。</li>
<li>字体打印问题。（Word 2003）当另一台机未装本文档字体时，可在本文档保存前设置，单击工具—选项，单击保存，选中嵌入TrueType字体。（Word 2007）Office菜单——保存——工具——保存选项——将字体嵌入文件。</li>
<li>打印文档附加信息。（Word 2003）如打印域，工具—选项—打印，选择打印文档的附加信息中的对象。（Word 2007）Word选项——显示——打印选项。</li>
</ul>
<p><strong>保护文档技巧</strong></p>
<ul>
<li>启动自动保存功能（防止意外，当然最好的方式还是经常按Ctrl+S）、给文档加密（工具——保护文档）、保存文档时加密（03中保存对话框中的安全措施选项07中保存对话框中工具的常规选项）、设置只读密码。</li>
<li>防止别人修改文档。（Word 2003）工具—保护文档，选中仅允许在文档中进行此类编辑，单击“是，启动强制保护”按钮。（Word 2007）审阅——保护组中的保护文档。</li>
<li>给文档添加数字许可证 以判断他人是否修改，工具—选项，单击“安全性”，单击“数字签名”，单击添加，打开“选择证书”，选择事先制作的数字签名证书，确定。如果他人对文档进行修改，该数字证书即刻失效。<br />
使用此功能，需事先制作数字证书，单击“开始—所有程序—Microsoft Office—Microsoft Office工具—VBA项目的数字证书，打开创建数字证书对话框，根据自已的需要输入创建的数字证书名称。</li>
</ul>
<p><strong>其他技巧</strong></p>
<ul>
<li>连续按Shift键5次将启动粘滞键，即对于一些快捷键来说，不需要同时按住，一次只需按下一个键即可。例如上面的技巧中，在启动粘滞键后，只需分别按Alt键和Tab键。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/03/13/wordtips1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>用Excel绘制世界名画</title>
		<link>http://www.excelperfect.com/2010/03/09/exceldrawing/</link>
		<comments>http://www.excelperfect.com/2010/03/09/exceldrawing/#comments</comments>
		<pubDate>Tue, 09 Mar 2010 05:41:34 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[Excel应用]]></category>
		<category><![CDATA[ExcelArt]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1573</guid>
		<description><![CDATA[在cnbeta上看到的，觉得挺有意思，特辑录于此。
有句老话说的好，做个有心人，处处皆学问，只要我们有心，有些平时看着没什么作用的工具也能为我们所用发挥意想不到的功效，比如说用Excel画画。
用Excel画画其实是件力气活，只要有足够的细致与耐心，我们可以利用和画图风马牛不相及的微软Excel办公软件来绘出精美的图画。


不过不是人人都有足够的耐心去利用一款非专业工具来画画，今天要给大家介绍的是一款Excel画画速成工具，只要将一张现有的图片导入到这款名为ExcelArt的小工具中，保你也能马上成为Excel绘画大师。


ExcelArt下载地址：
https://secure.boydevlin.co.uk/2/enduser/dload_ea.htm
]]></description>
			<content:encoded><![CDATA[<p>在<a href="http://www.cnbeta.com" target="_blank">cnbeta</a>上看到的，觉得挺有意思，特辑录于此。<br />
有句老话说的好，做个有心人，处处皆学问，只要我们有心，有些平时看着没什么作用的工具也能为我们所用发挥意想不到的功效，比如说用Excel画画。<br />
用Excel画画其实是件力气活，只要有足够的细致与耐心，我们可以利用和画图风马牛不相及的微软Excel办公软件来绘出精美的图画。<br />
<a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing1.bmp"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing1.bmp" class="alignnone" width="450" height="368" /></a><br />
<a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing2.bmp"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing2.bmp" class="alignnone" width="417" height="485" /></a><br />
不过不是人人都有足够的耐心去利用一款非专业工具来画画，今天要给大家介绍的是一款Excel画画速成工具，只要将一张现有的图片导入到这款名为ExcelArt的小工具中，保你也能马上成为Excel绘画大师。<br />
<a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing3.bmp"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing3.bmp" class="alignnone" width="550" height="541" /></a><br />
<a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing4.bmp"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/exceldrawing4.bmp" class="alignnone" width="542" height="757" /></a><br />
ExcelArt下载地址：<br />
<a href="https://secure.boydevlin.co.uk/2/enduser/dload_ea.htm" target="_blank">https://secure.boydevlin.co.uk/2/enduser/dload_ea.htm</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/03/09/exceldrawing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在用户窗体文本框中创建上下文菜单</title>
		<link>http://www.excelperfect.com/2010/03/03/createcontexualmenus/</link>
		<comments>http://www.excelperfect.com/2010/03/03/createcontexualmenus/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 05:24:36 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[上下文菜单]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[文本框]]></category>
		<category><![CDATA[用户窗体]]></category>
		<category><![CDATA[类]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1571</guid>
		<description><![CDATA[这是Andy Pope贡献的一个示例，能够在用户窗体文本框中使用上下文菜单。如下图所示。

在这个示例中，使用类来为文本框添加上下文菜单。
这个类模块处理上下文菜单指令，捕获文本框中的右击操作，并处理剪切、复制和粘贴行为。类模块使用了用户窗体的ActiveControl对象。这段代码甚至可以处理诸如框架和多页等容器控件里的控件。
下面是用户窗体初始化代码，展示了定义和使用类对象是如此的简单。仅需要声明该对象，然后设置每个想要具有上下文菜单功能的文本框的引用。

Private m_colContextMenus As Collection
&#160;
Private Sub UserForm_Initialize()
&#160;
    Dim clsContextMenu As CTextBox_ContextMenu
&#160;
    Set m_colContextMenus = New Collection
&#160;
    Set clsContextMenu = New CTextBox_ContextMenu
    With clsContextMenu
        Set .TBox = UserForm1.TextBox1
        Set .Parent [...]]]></description>
			<content:encoded><![CDATA[<p>这是<a href="http://andypope.info/index.htm" target="_blank">Andy Pope</a>贡献的一个示例，能够在用户窗体文本框中使用上下文菜单。如下图所示。<br />
<a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/txtContextualMenu.png"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/03/txtContextualMenu.png" class="alignnone" width="392" height="437" /></a><br />
在这个示例中，使用类来为文本框添加上下文菜单。<br />
这个类模块处理上下文菜单指令，捕获文本框中的右击操作，并处理剪切、复制和粘贴行为。类模块使用了用户窗体的ActiveControl对象。这段代码甚至可以处理诸如框架和多页等容器控件里的控件。<br />
下面是用户窗体初始化代码，展示了定义和使用类对象是如此的简单。仅需要声明该对象，然后设置每个想要具有上下文菜单功能的文本框的引用。</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">Private</span> m_colContextMenus <span style="color: #000080;">As</span> <span style="color: #000080;">Collection</span>
&nbsp;
<span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> UserForm_Initialize()
&nbsp;
    <span style="color: #000080;">Dim</span> clsContextMenu <span style="color: #000080;">As</span> CTextBox_ContextMenu
&nbsp;
    <span style="color: #000080;">Set</span> m_colContextMenus = <span style="color: #000080;">New</span> <span style="color: #000080;">Collection</span>
&nbsp;
    <span style="color: #000080;">Set</span> clsContextMenu = <span style="color: #000080;">New</span> CTextBox_ContextMenu
    <span style="color: #000080;">With</span> clsContextMenu
        <span style="color: #000080;">Set</span> .TBox = UserForm1.TextBox1
        <span style="color: #000080;">Set</span> .Parent = Me
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
    m_colContextMenus.Add clsContextMenu, <span style="color: #000080;">CStr</span>(m_colContextMenus.Count + 1)
&nbsp;
    <span style="color: #000080;">Set</span> clsContextMenu = <span style="color: #000080;">New</span> CTextBox_ContextMenu
    <span style="color: #000080;">With</span> clsContextMenu
        <span style="color: #000080;">Set</span> .TBox = UserForm1.TextBox2
        <span style="color: #000080;">Set</span> .Parent = Me
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
    m_colContextMenus.Add clsContextMenu, <span style="color: #000080;">CStr</span>(m_colContextMenus.Count + 1)
&nbsp;
    <span style="color: #000080;">Set</span> clsContextMenu = <span style="color: #000080;">New</span> CTextBox_ContextMenu
    <span style="color: #000080;">With</span> clsContextMenu
        <span style="color: #000080;">Set</span> .TBox = UserForm1.TextBox3
        <span style="color: #000080;">Set</span> .Parent = Me
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
    m_colContextMenus.Add clsContextMenu, <span style="color: #000080;">CStr</span>(m_colContextMenus.Count + 1)
&nbsp;
    <span style="color: #000080;">Set</span> clsContextMenu = <span style="color: #000080;">New</span> CTextBox_ContextMenu
    <span style="color: #000080;">With</span> clsContextMenu
        <span style="color: #000080;">Set</span> .TBox = UserForm1.TextBox4
        <span style="color: #000080;">Set</span> .Parent = Me
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
    m_colContextMenus.Add clsContextMenu, <span style="color: #000080;">CStr</span>(m_colContextMenus.Count + 1)
&nbsp;
    <span style="color: #000080;">Set</span> clsContextMenu = <span style="color: #000080;">New</span> CTextBox_ContextMenu
    <span style="color: #000080;">With</span> clsContextMenu
        <span style="color: #000080;">Set</span> .TBox = UserForm1.TextBox5
        <span style="color: #000080;">Set</span> .Parent = Me
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
    m_colContextMenus.Add clsContextMenu, <span style="color: #000080;">CStr</span>(m_colContextMenus.Count + 1)
&nbsp;
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span></pre></div></div>

<p>示例下载：<br />
<iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-20bf8b0bc70443f9.skydrive.live.com/embedicon.aspx/%e7%94%a8%e6%88%b7%e7%aa%97%e4%bd%93/UF^_ContextualMenu.zip"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/03/03/createcontexualmenus/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Excel 2007国际象棋棋盘</title>
		<link>http://www.excelperfect.com/2010/02/23/excel2007chessgameviewer/</link>
		<comments>http://www.excelperfect.com/2010/02/23/excel2007chessgameviewer/#comments</comments>
		<pubDate>Tue, 23 Feb 2010 06:17:17 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[Excel函数与公式]]></category>
		<category><![CDATA[Excel图表与图形]]></category>
		<category><![CDATA[Excel应用]]></category>
		<category><![CDATA[Excel技巧]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1569</guid>
		<description><![CDATA[Excel 2007 Chess Game Viewer，是一个极具创造性的Excel应用程序，由Daniel Ferry制作。
没有使用宏，而是：

没有使用VBA的动态图表
XY散点图和堆积柱状图的组合
使用图片文件进行标记填充
条件图表格式形成棋盘样式
没有IF()函数。而是使用REPT()和逻辑函数作为IF() INDEX/MATCH的替代品


详见：Excel 2007 Chess Game Viewer
示例下载：

有兴趣的朋友可以下载研究。
]]></description>
			<content:encoded><![CDATA[<p>Excel 2007 Chess Game Viewer，是一个极具创造性的Excel应用程序，由Daniel Ferry制作。<br />
没有使用宏，而是：</p>
<ul>
<li>没有使用VBA的动态图表</li>
<li>XY散点图和堆积柱状图的组合</li>
<li>使用图片文件进行标记填充</li>
<li>条件图表格式形成棋盘样式</li>
<li>没有IF()函数。而是使用REPT()和逻辑函数作为IF() INDEX/MATCH的替代品</li>
</ul>
<p><a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/02/chessgameviewer.png"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/02/chessgameviewer.png" title="Chess Game Viewer" class="alignnone" width="408" height="329" /></a><br />
详见：<a href="http://www.excelhero.com/blog/2010/02/excel-2007-chess-game-viewer.html" target="_blank">Excel 2007 Chess Game Viewer</a><br />
示例下载：<br />
<iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-20bf8b0bc70443f9.skydrive.live.com/embedicon.aspx/.Public/chess^_game^_viewer.xlsx"></iframe><br />
有兴趣的朋友可以下载研究。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/02/23/excel2007chessgameviewer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的七个建议</title>
		<link>http://www.excelperfect.com/2010/02/22/my7suggestion/</link>
		<comments>http://www.excelperfect.com/2010/02/22/my7suggestion/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 04:36:34 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[软件随想录]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1563</guid>
		<description><![CDATA[作者：Joel Spolsky
[编者按]由于Joel Spolsky的双重身份（昔日耶鲁大学计算机系学长，今日Fog Creek软件公司的CEO），所以听听他的建议，对于当今无数困扰于就业压力的中国高校计算机专业学子来说，是大有裨益的。你们会发现，大多数建议，都在强调“软实力”的价值。本文转载自《软件随想录》(作者：Joel Spolsky ，译者: 阮一峰，2009年12月出版)，感谢北京图灵文化发展有限公司的支持。
如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念“热爱你的工作”，其实是一个很现代的概念。通常的看法是，工作是一种让人很不开心的事，你为了拿工资才不得不去上班。你工作的目的是为了攒下钱去干那些自己真正喜欢干的事，但是前提是你得等到65岁退休之后才行，而且还有不少条件。条件一，你的积蓄必须足够多；条件二，你没有老到走不动，你还有体力去干那些事情；条件三，你喜欢的事情不需要用到脆弱的膝盖、昏花的视力，也不要求你走上一里地不喘气，等等。
我刚才说到哪里了？对了，我要提建议。
毕业前练好写作
如果不是Linus Torvalds不断地散布福音，请问Linux操作系统会成功吗？虽然他是一个非常聪明的计算机天才，但是Linux吸引来全世界一大批志愿者的真正原因却是Linus Torvalds的表达能力。他通过电子邮件和邮件列表用书面形式传播自己的想法，最终引起了所有人的注意。
你听说过现在风靡一时的“极限编程[ ] ”（Extreme Programming）吗？我在这个地方不谈我对极限编程的看法，我只说如果你听过这个词，那么原因就是它的倡导者都是一些非常有才华的作家和演说家。
即使我们缩小范围，将目光局限在任何一个软件开发团体中，你也会发现该团体中最有权势和影响力的程序员正是那些表达能力强的程序员，他们无论是做书面表达还是做口头表达，都能够清晰、自如、具有说服力地传达观点。此外，长得高也有助于提升影响力，不过这个不取决于你。
一个普通程序员与一个优秀程序员的区别，不在于他们懂得的编程语言谁多谁少，也不在于他们喜欢用Python语言还是喜欢用Java语言，而在于他们能否与他人交流思想。如果你能说服其他人，你的力量就可以得到放大。如果你能写出清晰的注释和技术规格说明书，其他程序员就能够理解你的代码，因此他们就能在自己的代码中使用，而不必重写。如果你做不到这一点，你的代码对其他人就没有价值。如果你能为最终用户写出清晰的使用手册，其他人就能明白你的代码是用来干什么的，这是唯一让别人明白你的代码有何价值的方法。SourceForge[ ]上有许多优美的、有用的代码，但是它们都像被埋葬了一样，根本没人来用，原因就是它们的作者没有写好使用说明（或者压根就没写）。这样一来就没有人知道他们的成果，他们杰出的代码就衰亡了。
如果一个程序员不会用英语写作、没有良好的写作能力，我就不会雇他。如果你能写，不管你去哪家公司工作，你很快就会发现写作技术文档的任务会落到你头上，这意味着你已经开始在放大自己的影响力了，管理层正在注意到你。
大学里有些课程被公认为“写作密集型”（writing intensive）课程，这就是说为了拿到学分，你必须写作多得可怕的文字。一定要去上这样的课程！不要管学科，只要这门课每周甚至每天都要你写东西，你就去上。
你还可以动手写日记或者网志。你写得越多，写作就会变得越容易。写起来越容易，你就会写得越多。这是一个良性循环。
毕业前学好C语言
第二点我要讲的是C语言。请注意，我说的是C语言，而不是C++。虽然在实际使用中C语言已经越来越罕见，但是它仍然是当前程序员的共同语言。C语言让程序员互相沟通，更重要的是，它比你在大学中学到的“现代语言”（比如ML语言、Java语言、Python语言或者其它正在教授的流行垃圾语言）都更接近机器。你至少需要花一个学期来了解机器原理，否则你永远不可能在高级语言的层次写出高效的代码。你也永远无法开发编译器和操作系统，而它们恰恰属于目前程序员能够得到的最佳工作之列。别人也永远不会放心将大型项目的架构设计交给你。我不管你懂多少延续（continuation）、闭包（closure）、异常处理（exception handling），只要你不能解释为什么while (*s++ = *t++)；这句代码的作用是复制字符串，或者不觉得这是世界上对你来说再自然不过的事情，那么你就是在盲目无知的情况下编程。在我看来，这就好像一个医生不懂得最基本的解剖学就在开处方，他看病的根据完全是因为那些娃娃脸的医药厂商销售代表说这种药有用。
毕业前学好微观经济学
如果你没有上过任何经济学课程，那么我首先来做一个超短的评论：经济学是这样的学科之一，刚开始学的时候轰轰烈烈，有许多有用的、言之有理的理论和可以在真实世界中得到证明的事实，等等；但是，再学下去就每况愈下，有用的东西就不多了。经济学一开始那个有用的部分正是微观经济学，它是商业领域所有重要理论的基础。跟在微观经济学后面的东西就不行了。你接下来学的是宏观经济学，如果你愿意，尽管跳过去，也不会有什么损失。宏观经济学开头的部分是利息理论，内容比方说是利率与失业之间的关系，但是怎么说呢，看上去这部分里面还没有被证实的东西多于已经被证实的东西。学完这部分，后面的内容越来越糟糕，许多经济学专业的学生实际上都变成在搞物理学，因为这样才能在华尔街上找到更好的工作。但是不管怎样，你一定要去学微观经济学，因为你必须搞懂供给和需求，你必须明白竞争优势，你必须理解什么是净现值（NPV），什么是贴现，什么是边际效用。只有这样，你才会懂得为什么生意是现在这种做法。
为什么计算机系的学生也应该学经济学？因为，从经营一家公司的角度来看，比起那些不懂的程序员，一个理解基本商业规则的程序员将会更有价值。就是这么简单。我无法告诉你有多少次我是那样地充满挫折感，因为我看到了太多的提出一些疯狂的想法的程序员，这些想法在代码上也许可行，但在资本主义世界中毫无意义。如果你懂得商业规则，你就是一个更有价值的程序员，你会因此得到回报的，但是前提是你要去学习微观经济学。
不要因为枯燥就不选修非计算机专业的课程。
想提高GPA绩点的一个好方法就是多选修非计算机系的课程。请千万不要低估你的GPA的重大意义。千千万万的人事经理和招聘人员在拿到一份简历的时候，第一眼就会去看GPA，包括我也是这样。我们不会为这种做法道歉。为什么？因为GPA不反映单个的成绩，而是代表了许多个教授在一段很长的时间中，在不同的情况下，对你的表现的一个总的评估。SAT成绩难道不够吗？哈，那只不过是一场几个小时的测试罢了。GPA中包括了四年大学期间你的小论文、期中考试和课堂表现，总数有几百次之多。当然，GPA也有自己的问题，不是百分之百准确。比如，这些年来，老师对学生的打分越来越宽松，学习成绩有通货膨胀的趋势。再比如，GPA无法反映课程的难度，没人能够看出你的GPA是来自无名社区大学家政系的轻松课程还是来自加州理工学院针对研究生的量子力学课程。渐渐地，我形成了一套自己的做法，首先我会过滤掉所有来自社区大学、GPA低于2.5的简历，然后我会要求剩下的人给我寄成绩单和推荐信。我再从中发现那些成绩一贯优秀的人，而不是那些仅仅在计算机系课程中得到高分的人。
为什么我要关心某人的“欧洲历史”课程成绩呢，毕竟作为雇主我要找的应该是程序员啊？何况，历史是那么枯燥，不得高分很正常。哦，这么说来，你的意思是我应该雇用你，而不用考虑一旦工作变得枯燥你会不会努力工作？别忘了，在编程工作中也有很枯燥的东西。每一项工作都有枯燥难耐的时刻。我不想雇用那些只想干有趣事情的人。
选修有大量编程实践的课程
我依然清楚记得我发誓绝不读研究生的那一刻。那是在一门叫做“动态逻辑”的课程上，教师是活力十足的耶鲁大学教授Lenore Zuck，她是计算机系那些聪明的老师中最聪明的人之一。
如今， 由于记忆力糟糕， 我已经差不多把这门课的内容忘光了，但是不管怎么说，在这里我还是想要对付着说一下。大致上，形式逻辑的意思是说，如果条件成立，你就能证明结论也成立。比如，根据形式逻辑，已知“只要成绩好，就能被雇用”，然后假定“Johnny的成绩好”，你就可以得到一个崭新的结论“Johnny会被雇用”。这完全是经典方法。但是，一个解构主义者（deconstructionist）只需要10秒钟就能破坏形式逻辑中所有有用的东西。这样一来，留给你的只是一些趣味性，而不是实用性。
现在再来说动态逻辑。它与形式逻辑其实是一回事，但是必须再多考虑时间因素。比如，“你打开灯之后，就能看见自己的鞋子”，已知“灯以前是亮的”，那么这就意味着“你看见了自己的鞋子”。
对于像Zuck教授那样聪明的理论家，动态逻辑充满了吸引力，因为它看上去很有希望让你在形式上证明一些计算机程序的相关理论问题。这样做说不定很有用。比如，你可以用它在形式上证明，火星漫游车的闪存卡不会发生溢出（overflow）问题，不会因而整天一遍又一遍地重启，耽误了它在那颗赤红色的星球上漫游寻找火星人马文（Marvin the Martian）。
在第一堂课上，Zuck博士写满了整整两面黑板，甚至黑板旁边的墙上都写上了很多证明步骤。需要证明的问题是，有一个控制灯泡的开关，现在灯泡没有亮，这时你打开了开关，请证明灯泡将会点亮。
整个证明过程复杂得不可思议，处处都是陷阱，必须十分小心。保证这个证明不出错太困难了，还不如直接相信打开开关灯就会亮。真的，虽然证明过程写满了许多块黑板，但是还是有许多中间步骤被省略了，因为如果要从形式逻辑上完整证明所有步骤，那就琐碎得无法形容了。许多步骤是用各种经典的逻辑证明方法推导得到的，包括归纳法、反证法等，甚至有些部分还是由旁听的研究生证明的。
留给我们的课后作业是证明逆命题：如果灯原来是关着的，现在却亮了，那么请证明开关的状态一定同原来相反。
我动手开始证明，我真的去证明了。
我在图书馆里待了很长时间。
我对照着Zuck博士的原始证明想依样画葫芦。研究了几个小时之后，我在其中发现了一个错误。可能我抄写的时候抄错了，但是这使得我想通了一件事。如果花费3个小时，写满了一块又一块的黑板，每一秒钟都可能出错，最后能够证明的却只是一个很琐碎的结论，那么这种方式有多大的实用性呢？在活生生、充满趣味的现实世界中，你永远都不会有机会使用它。
但是，动态逻辑的理论家们对这一点不感兴趣。他们看上它不是因为它有用，而是因为它可以为他们带来终身教职。
我放弃了这门课，并且发誓绝不会去读计算机科学的研究生。
这个故事告诉我们，计算机科学与软件开发不是一回事。如果你真的非常幸运，你的学校可能会开设很像样的软件开发课程。但是另一种可能是，你的学校根本不教你在现实中如何编程，因为精英学校都觉得，教授工作技能最好留给职业技术学校、犯人重返社会的培训项目去做。你到处都能学怎么写代码。别忘了，我们是耶鲁大学，我们的使命是培养未来的世界领袖。你交了16万美元的学费，却在学循环语句的写法，这怎么可以？你以为这是什么地方，难道是机场沿途的酒店里临时拼凑起来不靠谱的Java语言培训班？哼哼。
麻烦在于我们没有一种真正教授软件开发的专门学校。你如果想成为一个程序员，你可能只能选择计算机科学专业。这是一个不错的专业，但是它同软件开发不是一回事。在那些400等级的课程代号中，去寻找名称中带有“Practicum”这个词的课程吧（编者注：指供人实习的课程）。不要被这个拉丁语单词吓倒，这些都是有用的课程，之所以起这种名字，只是为了让那些文绉绉、装腔作势、满嘴胡说八道的公司经理们觉得高深莫测。
别担心所有工作都被印度人抢走
我首先要说的是，如果你本身就已经在印度了，或者你就是印度人，那么你真的毫无必要去想这件事，根本不用琢磨所有的工作机会是不是都跑到了印度。那些都是非常好的工作，好好地享受吧，祝你身体健康。
但是，我不断听说计算机系的入学人数下降得很厉害，已经到了危险的程度。根据我听到的说法，其中的一个原因是“学生们不愿去学一个工作机会都流向印度的专业”。这种担心大错特错，有很多理由可以反驳。首先，根据一时性的商业潮流决定个人的职业选择，这是愚蠢的。其次，即使编程工作无一幸存地都流向了印度和中国，但是学习编程本身依然是一种第一流的素质训练，可以为各种超级有趣的工作打下基础，比如业务流程工程（business process engineering）。再次，不管是在美国还是在印度，真正优秀的程序员依然是非常非常短缺的，这一点请相信我。不错，确实有相当一批失业的IT从业者在那里鼓噪，抱怨他们长时间找不到工作，但是你知道吗？即使冒着触怒这些人的风险，我还是要说，真正优秀的程序员根本不会失业。最后，你还能找到更好的专业吗？你觉得什么专业好？主修历史学？如果那样，你毕业的时候就会发现，根本没有其他选择，只能去法学院。不过我倒是知道一件事：99%的律师都痛恨他们的工作，痛恨他们当律师的每一分钟。可是，律师每周的工作时间偏偏长达90小时。就像我前面说过的：如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。
不过说实话，我不觉得学生们真的有上面的想法。近年来，计算机系入学人数的下降只是回到了历史上的正常水平，因为前些年的互联网狂热使得入学人数出现了大泡沫，抬高了基数。由于这种泡沫，许多并不真的喜欢编程的人也来读计算机系。他们心里想的是，只要进了计算机系，将来就能找到诱人的高薪工作，就能获得24岁当上CEO、进行IPO的机会。谢天谢地，这些人现在都离计算机系远远的了。
找一份好的暑期实习工作
精明的招聘负责人都知道，喜欢编程的人高中时就将牙医的信息输入了数据库，进入大学前就去过三次电脑夏令营，为校报做过内容管理系统，有过软件公司的夏季实习经历。招聘负责人就是要在你的简历上找这些东西。
如果你喜欢编程， 就不要随便什么工作都答应，否则你会犯下最大的错误。不管是暑期工作，还是兼职或者其他性质的工作，只要与编程无关，就不要轻易接受。我知道，其他19岁的孩子都想去购物中心里打工，在那里折叠衬衫。但是你与他们不同，你19岁时就已经掌握了一门非常有价值的技能。将时间浪费在折叠衬衫上是很愚蠢的，等到毕业的时候，你的简历上本应该写满了一大堆与编程相关的经历。就让那些财经类的毕业生去租车公司“帮助人们满足他们租车的需要”吧，你要干的是别的事（在电视中扮演超人的Tom Welling注1除外）。
为了让你的生活变得更容易一些，也为了强调这整篇文章完全是为了满足我的个人目的，我要告诉你，我的公司——Fog Creek软件公司——提供软件开发方面的暑期实习机会。我们非常看重简历。“比起其他公司的实习工作，你在Fog Creek最有可能学到更多的编写代码、软件开发、商业运作方面的知识。”这是去年夏天我们的一个实习生Ben说的。他会这样说，并不完全是因为我派了人到他的宿舍让他这样说。我们接受实习申请的截止日期是2月1日。一起来吧。
如果你听从了我的建议，你还是有可能落得一个悲惨的下场，比如很早就卖掉了微软公司的股票，再比如拒绝了谷歌公司的工作机会，原因是你想要一间自己的可以关上门的独立办公室，或者做出了其他生命中愚蠢的决定。但是，这些可不是我的错。我一开始就告诉过你，不要听我的话。
（注1 ： T o m W e l l i n g是一个美国演员， 在电视剧《超人前传》（Smallville）中扮演超人。该电视剧讲述还没有成长为后来超人的克拉克·肯特少年时代的故事。）
作者简介：
Joel Spolsky，世界最具影响的程序员网志Joel on Software的主人，软件业一位旗帜鲜明的思想者，一位传统软件管理理念的挑战者。他创办的这个网站被程序员誉为“反呆伯特宣言书”，并被翻译为三十多种语言。Joel毕业于耶鲁大学，随后即进入微软公司工作，曾任微软公司E x c e l 开发小组项目经理。现在他在自己创办的Fog Creek软件公司任CEO。此外，他与人合办的Stack Overflow已经成为如今最热门的技术网站。
（本文来自《程序员》杂志2010年1月刊）
]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/02/softthink.bmp"><img alt="" src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/02/softthink.bmp" title="软件随想录" class="alignleft" width="200" height="280" /></a>作者：Joel Spolsky<br />
<em>[编者按]由于Joel Spolsky的双重身份（昔日耶鲁大学计算机系学长，今日Fog Creek软件公司的CEO），所以听听他的建议，对于当今无数困扰于就业压力的中国高校计算机专业学子来说，是大有裨益的。你们会发现，大多数建议，都在强调“软实力”的价值。本文转载自《软件随想录》(作者：Joel Spolsky ，译者: 阮一峰，2009年12月出版)，感谢北京图灵文化发展有限公司的支持。</em><br />
如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。大多数人没有这么幸运。你认为理所当然的观念“热爱你的工作”，其实是一个很现代的概念。通常的看法是，工作是一种让人很不开心的事，你为了拿工资才不得不去上班。你工作的目的是为了攒下钱去干那些自己真正喜欢干的事，但是前提是你得等到65岁退休之后才行，而且还有不少条件。条件一，你的积蓄必须足够多；条件二，你没有老到走不动，你还有体力去干那些事情；条件三，你喜欢的事情不需要用到脆弱的膝盖、昏花的视力，也不要求你走上一里地不喘气，等等。<br />
我刚才说到哪里了？对了，我要提建议。<br />
<strong>毕业前练好写作</strong><br />
如果不是Linus Torvalds不断地散布福音，请问Linux操作系统会成功吗？虽然他是一个非常聪明的计算机天才，但是Linux吸引来全世界一大批志愿者的真正原因却是Linus Torvalds的表达能力。他通过电子邮件和邮件列表用书面形式传播自己的想法，最终引起了所有人的注意。<br />
你听说过现在风靡一时的“极限编程[ ] ”（Extreme Programming）吗？我在这个地方不谈我对极限编程的看法，我只说如果你听过这个词，那么原因就是它的倡导者都是一些非常有才华的作家和演说家。<br />
即使我们缩小范围，将目光局限在任何一个软件开发团体中，你也会发现该团体中最有权势和影响力的程序员正是那些表达能力强的程序员，他们无论是做书面表达还是做口头表达，都能够清晰、自如、具有说服力地传达观点。此外，长得高也有助于提升影响力，不过这个不取决于你。<br />
一个普通程序员与一个优秀程序员的区别，不在于他们懂得的编程语言谁多谁少，也不在于他们喜欢用Python语言还是喜欢用Java语言，而在于他们能否与他人交流思想。如果你能说服其他人，你的力量就可以得到放大。如果你能写出清晰的注释和技术规格说明书，其他程序员就能够理解你的代码，因此他们就能在自己的代码中使用，而不必重写。如果你做不到这一点，你的代码对其他人就没有价值。如果你能为最终用户写出清晰的使用手册，其他人就能明白你的代码是用来干什么的，这是唯一让别人明白你的代码有何价值的方法。SourceForge[ ]上有许多优美的、有用的代码，但是它们都像被埋葬了一样，根本没人来用，原因就是它们的作者没有写好使用说明（或者压根就没写）。这样一来就没有人知道他们的成果，他们杰出的代码就衰亡了。<br />
如果一个程序员不会用英语写作、没有良好的写作能力，我就不会雇他。如果你能写，不管你去哪家公司工作，你很快就会发现写作技术文档的任务会落到你头上，这意味着你已经开始在放大自己的影响力了，管理层正在注意到你。<br />
大学里有些课程被公认为“写作密集型”（writing intensive）课程，这就是说为了拿到学分，你必须写作多得可怕的文字。一定要去上这样的课程！不要管学科，只要这门课每周甚至每天都要你写东西，你就去上。<br />
你还可以动手写日记或者网志。你写得越多，写作就会变得越容易。写起来越容易，你就会写得越多。这是一个良性循环。<br />
<strong>毕业前学好C语言</strong><br />
第二点我要讲的是C语言。请注意，我说的是C语言，而不是C++。虽然在实际使用中C语言已经越来越罕见，但是它仍然是当前程序员的共同语言。C语言让程序员互相沟通，更重要的是，它比你在大学中学到的“现代语言”（比如ML语言、Java语言、Python语言或者其它正在教授的流行垃圾语言）都更接近机器。你至少需要花一个学期来了解机器原理，否则你永远不可能在高级语言的层次写出高效的代码。你也永远无法开发编译器和操作系统，而它们恰恰属于目前程序员能够得到的最佳工作之列。别人也永远不会放心将大型项目的架构设计交给你。我不管你懂多少延续（continuation）、闭包（closure）、异常处理（exception handling），只要你不能解释为什么while (*s++ = *t++)；这句代码的作用是复制字符串，或者不觉得这是世界上对你来说再自然不过的事情，那么你就是在盲目无知的情况下编程。在我看来，这就好像一个医生不懂得最基本的解剖学就在开处方，他看病的根据完全是因为那些娃娃脸的医药厂商销售代表说这种药有用。<br />
<strong>毕业前学好微观经济学</strong><br />
如果你没有上过任何经济学课程，那么我首先来做一个超短的评论：经济学是这样的学科之一，刚开始学的时候轰轰烈烈，有许多有用的、言之有理的理论和可以在真实世界中得到证明的事实，等等；但是，再学下去就每况愈下，有用的东西就不多了。经济学一开始那个有用的部分正是微观经济学，它是商业领域所有重要理论的基础。跟在微观经济学后面的东西就不行了。你接下来学的是宏观经济学，如果你愿意，尽管跳过去，也不会有什么损失。宏观经济学开头的部分是利息理论，内容比方说是利率与失业之间的关系，但是怎么说呢，看上去这部分里面还没有被证实的东西多于已经被证实的东西。学完这部分，后面的内容越来越糟糕，许多经济学专业的学生实际上都变成在搞物理学，因为这样才能在华尔街上找到更好的工作。但是不管怎样，你一定要去学微观经济学，因为你必须搞懂供给和需求，你必须明白竞争优势，你必须理解什么是净现值（NPV），什么是贴现，什么是边际效用。只有这样，你才会懂得为什么生意是现在这种做法。<br />
为什么计算机系的学生也应该学经济学？因为，从经营一家公司的角度来看，比起那些不懂的程序员，一个理解基本商业规则的程序员将会更有价值。就是这么简单。我无法告诉你有多少次我是那样地充满挫折感，因为我看到了太多的提出一些疯狂的想法的程序员，这些想法在代码上也许可行，但在资本主义世界中毫无意义。如果你懂得商业规则，你就是一个更有价值的程序员，你会因此得到回报的，但是前提是你要去学习微观经济学。<br />
不要因为枯燥就不选修非计算机专业的课程。<br />
想提高GPA绩点的一个好方法就是多选修非计算机系的课程。请千万不要低估你的GPA的重大意义。千千万万的人事经理和招聘人员在拿到一份简历的时候，第一眼就会去看GPA，包括我也是这样。我们不会为这种做法道歉。为什么？因为GPA不反映单个的成绩，而是代表了许多个教授在一段很长的时间中，在不同的情况下，对你的表现的一个总的评估。SAT成绩难道不够吗？哈，那只不过是一场几个小时的测试罢了。GPA中包括了四年大学期间你的小论文、期中考试和课堂表现，总数有几百次之多。当然，GPA也有自己的问题，不是百分之百准确。比如，这些年来，老师对学生的打分越来越宽松，学习成绩有通货膨胀的趋势。再比如，GPA无法反映课程的难度，没人能够看出你的GPA是来自无名社区大学家政系的轻松课程还是来自加州理工学院针对研究生的量子力学课程。渐渐地，我形成了一套自己的做法，首先我会过滤掉所有来自社区大学、GPA低于2.5的简历，然后我会要求剩下的人给我寄成绩单和推荐信。我再从中发现那些成绩一贯优秀的人，而不是那些仅仅在计算机系课程中得到高分的人。<br />
为什么我要关心某人的“欧洲历史”课程成绩呢，毕竟作为雇主我要找的应该是程序员啊？何况，历史是那么枯燥，不得高分很正常。哦，这么说来，你的意思是我应该雇用你，而不用考虑一旦工作变得枯燥你会不会努力工作？别忘了，在编程工作中也有很枯燥的东西。每一项工作都有枯燥难耐的时刻。我不想雇用那些只想干有趣事情的人。<br />
<strong>选修有大量编程实践的课程</strong><br />
我依然清楚记得我发誓绝不读研究生的那一刻。那是在一门叫做“动态逻辑”的课程上，教师是活力十足的耶鲁大学教授Lenore Zuck，她是计算机系那些聪明的老师中最聪明的人之一。<br />
如今， 由于记忆力糟糕， 我已经差不多把这门课的内容忘光了，但是不管怎么说，在这里我还是想要对付着说一下。大致上，形式逻辑的意思是说，如果条件成立，你就能证明结论也成立。比如，根据形式逻辑，已知“只要成绩好，就能被雇用”，然后假定“Johnny的成绩好”，你就可以得到一个崭新的结论“Johnny会被雇用”。这完全是经典方法。但是，一个解构主义者（deconstructionist）只需要10秒钟就能破坏形式逻辑中所有有用的东西。这样一来，留给你的只是一些趣味性，而不是实用性。<br />
现在再来说动态逻辑。它与形式逻辑其实是一回事，但是必须再多考虑时间因素。比如，“你打开灯之后，就能看见自己的鞋子”，已知“灯以前是亮的”，那么这就意味着“你看见了自己的鞋子”。<br />
对于像Zuck教授那样聪明的理论家，动态逻辑充满了吸引力，因为它看上去很有希望让你在形式上证明一些计算机程序的相关理论问题。这样做说不定很有用。比如，你可以用它在形式上证明，火星漫游车的闪存卡不会发生溢出（overflow）问题，不会因而整天一遍又一遍地重启，耽误了它在那颗赤红色的星球上漫游寻找火星人马文（Marvin the Martian）。<br />
在第一堂课上，Zuck博士写满了整整两面黑板，甚至黑板旁边的墙上都写上了很多证明步骤。需要证明的问题是，有一个控制灯泡的开关，现在灯泡没有亮，这时你打开了开关，请证明灯泡将会点亮。<br />
整个证明过程复杂得不可思议，处处都是陷阱，必须十分小心。保证这个证明不出错太困难了，还不如直接相信打开开关灯就会亮。真的，虽然证明过程写满了许多块黑板，但是还是有许多中间步骤被省略了，因为如果要从形式逻辑上完整证明所有步骤，那就琐碎得无法形容了。许多步骤是用各种经典的逻辑证明方法推导得到的，包括归纳法、反证法等，甚至有些部分还是由旁听的研究生证明的。<br />
留给我们的课后作业是证明逆命题：如果灯原来是关着的，现在却亮了，那么请证明开关的状态一定同原来相反。<br />
我动手开始证明，我真的去证明了。<br />
我在图书馆里待了很长时间。<br />
我对照着Zuck博士的原始证明想依样画葫芦。研究了几个小时之后，我在其中发现了一个错误。可能我抄写的时候抄错了，但是这使得我想通了一件事。如果花费3个小时，写满了一块又一块的黑板，每一秒钟都可能出错，最后能够证明的却只是一个很琐碎的结论，那么这种方式有多大的实用性呢？在活生生、充满趣味的现实世界中，你永远都不会有机会使用它。<br />
但是，动态逻辑的理论家们对这一点不感兴趣。他们看上它不是因为它有用，而是因为它可以为他们带来终身教职。<br />
我放弃了这门课，并且发誓绝不会去读计算机科学的研究生。<br />
这个故事告诉我们，计算机科学与软件开发不是一回事。如果你真的非常幸运，你的学校可能会开设很像样的软件开发课程。但是另一种可能是，你的学校根本不教你在现实中如何编程，因为精英学校都觉得，教授工作技能最好留给职业技术学校、犯人重返社会的培训项目去做。你到处都能学怎么写代码。别忘了，我们是耶鲁大学，我们的使命是培养未来的世界领袖。你交了16万美元的学费，却在学循环语句的写法，这怎么可以？你以为这是什么地方，难道是机场沿途的酒店里临时拼凑起来不靠谱的Java语言培训班？哼哼。<br />
麻烦在于我们没有一种真正教授软件开发的专门学校。你如果想成为一个程序员，你可能只能选择计算机科学专业。这是一个不错的专业，但是它同软件开发不是一回事。在那些400等级的课程代号中，去寻找名称中带有“Practicum”这个词的课程吧（编者注：指供人实习的课程）。不要被这个拉丁语单词吓倒，这些都是有用的课程，之所以起这种名字，只是为了让那些文绉绉、装腔作势、满嘴胡说八道的公司经理们觉得高深莫测。<br />
<strong>别担心所有工作都被印度人抢走</strong><br />
我首先要说的是，如果你本身就已经在印度了，或者你就是印度人，那么你真的毫无必要去想这件事，根本不用琢磨所有的工作机会是不是都跑到了印度。那些都是非常好的工作，好好地享受吧，祝你身体健康。<br />
但是，我不断听说计算机系的入学人数下降得很厉害，已经到了危险的程度。根据我听到的说法，其中的一个原因是“学生们不愿去学一个工作机会都流向印度的专业”。这种担心大错特错，有很多理由可以反驳。首先，根据一时性的商业潮流决定个人的职业选择，这是愚蠢的。其次，即使编程工作无一幸存地都流向了印度和中国，但是学习编程本身依然是一种第一流的素质训练，可以为各种超级有趣的工作打下基础，比如业务流程工程（business process engineering）。再次，不管是在美国还是在印度，真正优秀的程序员依然是非常非常短缺的，这一点请相信我。不错，确实有相当一批失业的IT从业者在那里鼓噪，抱怨他们长时间找不到工作，但是你知道吗？即使冒着触怒这些人的风险，我还是要说，真正优秀的程序员根本不会失业。最后，你还能找到更好的专业吗？你觉得什么专业好？主修历史学？如果那样，你毕业的时候就会发现，根本没有其他选择，只能去法学院。不过我倒是知道一件事：99%的律师都痛恨他们的工作，痛恨他们当律师的每一分钟。可是，律师每周的工作时间偏偏长达90小时。就像我前面说过的：如果你喜欢编程，那么你真是受到了上天的眷顾。你是非常幸运的少数人之一，能够以自己喜欢的事谋生。<br />
不过说实话，我不觉得学生们真的有上面的想法。近年来，计算机系入学人数的下降只是回到了历史上的正常水平，因为前些年的互联网狂热使得入学人数出现了大泡沫，抬高了基数。由于这种泡沫，许多并不真的喜欢编程的人也来读计算机系。他们心里想的是，只要进了计算机系，将来就能找到诱人的高薪工作，就能获得24岁当上CEO、进行IPO的机会。谢天谢地，这些人现在都离计算机系远远的了。<br />
<strong>找一份好的暑期实习工作</strong><br />
精明的招聘负责人都知道，喜欢编程的人高中时就将牙医的信息输入了数据库，进入大学前就去过三次电脑夏令营，为校报做过内容管理系统，有过软件公司的夏季实习经历。招聘负责人就是要在你的简历上找这些东西。<br />
如果你喜欢编程， 就不要随便什么工作都答应，否则你会犯下最大的错误。不管是暑期工作，还是兼职或者其他性质的工作，只要与编程无关，就不要轻易接受。我知道，其他19岁的孩子都想去购物中心里打工，在那里折叠衬衫。但是你与他们不同，你19岁时就已经掌握了一门非常有价值的技能。将时间浪费在折叠衬衫上是很愚蠢的，等到毕业的时候，你的简历上本应该写满了一大堆与编程相关的经历。就让那些财经类的毕业生去租车公司“帮助人们满足他们租车的需要”吧，你要干的是别的事（在电视中扮演超人的Tom Welling注1除外）。<br />
为了让你的生活变得更容易一些，也为了强调这整篇文章完全是为了满足我的个人目的，我要告诉你，我的公司——Fog Creek软件公司——提供软件开发方面的暑期实习机会。我们非常看重简历。“比起其他公司的实习工作，你在Fog Creek最有可能学到更多的编写代码、软件开发、商业运作方面的知识。”这是去年夏天我们的一个实习生Ben说的。他会这样说，并不完全是因为我派了人到他的宿舍让他这样说。我们接受实习申请的截止日期是2月1日。一起来吧。<br />
如果你听从了我的建议，你还是有可能落得一个悲惨的下场，比如很早就卖掉了微软公司的股票，再比如拒绝了谷歌公司的工作机会，原因是你想要一间自己的可以关上门的独立办公室，或者做出了其他生命中愚蠢的决定。但是，这些可不是我的错。我一开始就告诉过你，不要听我的话。<br />
（注1 ： T o m W e l l i n g是一个美国演员， 在电视剧《超人前传》（Smallville）中扮演超人。该电视剧讲述还没有成长为后来超人的克拉克·肯特少年时代的故事。）</p>
<p>作者简介：<br />
Joel Spolsky，世界最具影响的程序员网志Joel on Software的主人，软件业一位旗帜鲜明的思想者，一位传统软件管理理念的挑战者。他创办的这个网站被程序员誉为“反呆伯特宣言书”，并被翻译为三十多种语言。Joel毕业于耶鲁大学，随后即进入微软公司工作，曾任微软公司E x c e l 开发小组项目经理。现在他在自己创办的Fog Creek软件公司任CEO。此外，他与人合办的Stack Overflow已经成为如今最热门的技术网站。<br />
（本文来自《程序员》杂志2010年1月刊）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/02/22/my7suggestion/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>中国电信，一言难尽！牛，真牛！</title>
		<link>http://www.excelperfect.com/2010/02/22/mythinktotel/</link>
		<comments>http://www.excelperfect.com/2010/02/22/mythinktotel/#comments</comments>
		<pubDate>Mon, 22 Feb 2010 04:13:04 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[社会记录]]></category>
		<category><![CDATA[感想]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1550</guid>
		<description><![CDATA[本来不想说的，但心中实在气愤，可又无处倾诉，只好在这里一吐为快了。 
我们是今年7月27日发现家里的座机电话被盗打的。当天，发现电话停了，打10000号询问，才知道欠费。于是，老婆到电信交费，发现话费竟然达到100多元。当时就起了疑心，家里一般用的是手机，很少用座机啊，怎么会有这么多话费呢？在网上一查询，发现很多往安康和西宁的电话，从5月底开始，几乎每天都有，但通话时间都不是很长。（而我们并没有安康和西宁的亲戚朋友，也没往那方打过电话啊！）
于是，我们将情况向电信反映，他们的人也来了，查了查线路，说没问题，然后说回去再查查，后来说也没问题，就没下文了。
没办法，我们只好向省电信的投诉电话说明情况，这下可好了，宜昌电信态度马上好起来，说再查，叫我们安心等待，还说直接打宜昌的10000号就行了，不要打省里的，他们会处理的。
“安心等待”，说得好轻松啊！别人每天在打电话，我们替他买单，还要“安心等待”。
实在安不下心来，过了几天，我们又打10000号查询，别人说他们正在监控和跟踪我们的电话，要监控两个星期。天啊！如果监控不出来，那这话费不还是我们在买单吗？
可，又有什么办法呢？等吧。
两周后，也就是昨天，8月24日，我们又打10000号查询情况，人家的回复是“他们没问题”，还一个劲说“对不起，请您谅解”。天啊！难道这是我们的问题吗？电话在我们家里，难道有人每天愉跑进来打吗？您一句“对不起，请谅解”，难道每天我们仍然要替别人买单吗？
我们在网上查了查，这期间仍然不断的有电话打到安康和西宁。于是，我们向省电信投诉，回答是一样的，“他们没问题，没办法”。
怎么办？电信没问题，我们也没向那两个方向打电话，可费用每天还是在发生。
我们想到了向有关部门投诉，可结果也是“没办法”&#8230;&#8230;真的是解决无门，投诉也无门了。
“没办法”，什么意思？那我就躲吧！我不用了总该行吧。
于是，今天上午，老婆到电信要求取消座机，可人家却说“您的座机是和宽带绑在一起的，取消座机就必须取消宽带，并且不会退款”。可我们的宽带还有6个多月才到期呢？“那先将座机停了可以吧？”，人家的回复是“不行，不能停”。“那为什么话费欠费了会停机呢？”，可人家仍然坚持“不行，不能停”。
没办法，真是没办法。也没有什么好说的了。老婆给我打电话，声音有点哽咽。无助啊！
“好吧，宽带也取消吧，我们认了” 
中国电信！多好的牌子啊！可我真不该怎么说才好了！
只能说：您的服务，我们用不起！
2009-8-25
注：去年我的一个贴子，转存于此，作个记录。
]]></description>
			<content:encoded><![CDATA[<p>本来不想说的，但心中实在气愤，可又无处倾诉，只好在这里一吐为快了。 </p>
<p>我们是今年7月27日发现家里的座机电话被盗打的。当天，发现电话停了，打10000号询问，才知道欠费。于是，老婆到电信交费，发现话费竟然达到100多元。当时就起了疑心，家里一般用的是手机，很少用座机啊，怎么会有这么多话费呢？在网上一查询，发现很多往安康和西宁的电话，从5月底开始，几乎每天都有，但通话时间都不是很长。（而我们并没有安康和西宁的亲戚朋友，也没往那方打过电话啊！）<br />
于是，我们将情况向电信反映，他们的人也来了，查了查线路，说没问题，然后说回去再查查，后来说也没问题，就没下文了。<br />
没办法，我们只好向省电信的投诉电话说明情况，这下可好了，宜昌电信态度马上好起来，说再查，叫我们安心等待，还说直接打宜昌的10000号就行了，不要打省里的，他们会处理的。<br />
“安心等待”，说得好轻松啊！别人每天在打电话，我们替他买单，还要“安心等待”。<br />
实在安不下心来，过了几天，我们又打10000号查询，别人说他们正在监控和跟踪我们的电话，要监控两个星期。天啊！如果监控不出来，那这话费不还是我们在买单吗？<br />
可，又有什么办法呢？等吧。<br />
两周后，也就是昨天，8月24日，我们又打10000号查询情况，人家的回复是“他们没问题”，还一个劲说“对不起，请您谅解”。天啊！难道这是我们的问题吗？电话在我们家里，难道有人每天愉跑进来打吗？您一句“对不起，请谅解”，难道每天我们仍然要替别人买单吗？<br />
我们在网上查了查，这期间仍然不断的有电话打到安康和西宁。于是，我们向省电信投诉，回答是一样的，“他们没问题，没办法”。<br />
怎么办？电信没问题，我们也没向那两个方向打电话，可费用每天还是在发生。<br />
我们想到了向有关部门投诉，可结果也是“没办法”&#8230;&#8230;真的是解决无门，投诉也无门了。<br />
“没办法”，什么意思？那我就躲吧！我不用了总该行吧。<br />
于是，今天上午，老婆到电信要求取消座机，可人家却说“您的座机是和宽带绑在一起的，取消座机就必须取消宽带，并且不会退款”。可我们的宽带还有6个多月才到期呢？“那先将座机停了可以吧？”，人家的回复是“不行，不能停”。“那为什么话费欠费了会停机呢？”，可人家仍然坚持“不行，不能停”。<br />
没办法，真是没办法。也没有什么好说的了。老婆给我打电话，声音有点哽咽。无助啊！<br />
“好吧，宽带也取消吧，我们认了” </p>
<p>中国电信！多好的牌子啊！可我真不该怎么说才好了！<br />
只能说：您的服务，我们用不起！</p>
<p>2009-8-25</p>
<p>注：去年我的一个贴子，转存于此，作个记录。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/02/22/mythinktotel/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VBA7的新功能</title>
		<link>http://www.excelperfect.com/2010/02/01/vba7newfeatures/</link>
		<comments>http://www.excelperfect.com/2010/02/01/vba7newfeatures/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 06:38:56 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[VBA7]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1528</guid>
		<description><![CDATA[据Excel产品团队博客的文章《Programmability Improvements in Excel 2010》，VBA增加了一些新功能。
将Excel 4宏迁移到VBA
在将VBA引入到Excel之前，有自已的宏工具，称之为Excel 4宏，在Excel宏工作表中使用。很多人都早已将他们的Excel 4宏迁移到VBA，然而，一些Excel 4宏的功能在VBA中消失了，这使得迁移发生了困难。
在Excel 2010中，目标是为必须完全将Excel 4宏迁移到VBA中的人移除任何现有的阻碍。这项工作通常分为两类：

在Excel的对象模型中添加新的对象、方法和属性，代表一些现有的而在VBA中没有等价的Excel 4宏函数。
改进VBA中页面设置操作的性能，提供Excel 4宏中PAGE.SETUP()功能相似的性能。

对图表和形状的宏录制
当Excel 2007引入新的图表引擎时，主要集中在现代化的图表和形状的渲染能力。由于这项工作巨大，因此必须作一些痛苦的取舍决定，这导致Excel 2007在图表和形状对象模型方面失去了与Excel 2003的兼容性，即宏录制能力。
在Excel 2010中，宏录制器又可用于图表格式了，Excel 2003中的绝大多数图表格式录制功能又回来了。（极少数例如，包括坐标轴文本格式）
64位支持和代码兼容性
Office 2010将发布32位版本和64位版本。因此，VBA7将随Office 2010发布，支持能够运行32位和64位Office的代码的开发。
]]></description>
			<content:encoded><![CDATA[<p>据<a href="http://blogs.msdn.com/excel/default.aspx" target="_blank">Excel产品团队博客</a>的文章《<a href="http://blogs.msdn.com/excel/archive/2010/01/27/programmability-improvements-in-excel-2010.aspx" target="_blank">Programmability Improvements in Excel 2010</a>》，VBA增加了一些新功能。<br />
<strong>将Excel 4宏迁移到VBA</strong><br />
在将VBA引入到Excel之前，有自已的宏工具，称之为Excel 4宏，在Excel宏工作表中使用。很多人都早已将他们的Excel 4宏迁移到VBA，然而，一些Excel 4宏的功能在VBA中消失了，这使得迁移发生了困难。<br />
在Excel 2010中，目标是为必须完全将Excel 4宏迁移到VBA中的人移除任何现有的阻碍。这项工作通常分为两类：</p>
<ul>
<li>在Excel的对象模型中添加新的对象、方法和属性，代表一些现有的而在VBA中没有等价的Excel 4宏函数。</li>
<li>改进VBA中页面设置操作的性能，提供Excel 4宏中PAGE.SETUP()功能相似的性能。</li>
</ul>
<p><strong>对图表和形状的宏录制</strong><br />
当Excel 2007引入新的图表引擎时，主要集中在现代化的图表和形状的渲染能力。由于这项工作巨大，因此必须作一些痛苦的取舍决定，这导致Excel 2007在图表和形状对象模型方面失去了与Excel 2003的兼容性，即宏录制能力。<br />
在Excel 2010中，宏录制器又可用于图表格式了，Excel 2003中的绝大多数图表格式录制功能又回来了。（极少数例如，包括坐标轴文本格式）<br />
<strong>64位支持和代码兼容性</strong><br />
Office 2010将发布32位版本和64位版本。因此，VBA7将随Office 2010发布，支持能够运行32位和64位Office的代码的开发。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/02/01/vba7newfeatures/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>VBA7来了</title>
		<link>http://www.excelperfect.com/2010/02/01/vba7/</link>
		<comments>http://www.excelperfect.com/2010/02/01/vba7/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 05:56:26 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[Excel资讯]]></category>
		<category><![CDATA[VBA7]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1524</guid>
		<description><![CDATA[VBA6已经将近10余年了，而今，VBA7即将到来。
据The official blog of the Microsoft Excel product team的一篇文章：Programmability Improvements in Excel 2010：VBA的新版本——VBA7，将随Office 2010发布，支持能够在32位和64位Office上运行的代码的开发。
VBA7, the new version of VBA that ships with Office 2010, supports the development of code that can run in both 32- and 64-bit Office.
]]></description>
			<content:encoded><![CDATA[<p>VBA6已经将近10余年了，而今，VBA7即将到来。<br />
据<a href="http://blogs.msdn.com/excel/default.aspx" target="_blank">The official blog of the Microsoft Excel product team</a>的一篇文章：<a href="http://blogs.msdn.com/excel/archive/2010/01/27/programmability-improvements-in-excel-2010.aspx" target="_blank">Programmability Improvements in Excel 2010</a>：VBA的新版本——VBA7，将随Office 2010发布，支持能够在32位和64位Office上运行的代码的开发。</p>
<blockquote><p>VBA7, the new version of VBA that ships with Office 2010, supports the development of code that can run in both 32- and 64-bit Office.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/02/01/vba7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让Excel自动响应消息框中的提示</title>
		<link>http://www.excelperfect.com/2010/01/26/autoreponsemessages/</link>
		<comments>http://www.excelperfect.com/2010/01/26/autoreponsemessages/#comments</comments>
		<pubDate>Tue, 26 Jan 2010 04:53:54 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[Windows API]]></category>
		<category><![CDATA[技巧]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1517</guid>
		<description><![CDATA[这是以前收录的一段程序示例：
使用VBA在调用工作簿中打开被调用工作簿，并运行其中的宏。该宏将弹出一个消息框，如果用户没有响应，那么程序会在指定时间后自动响应。
调用工作簿中的程序代码如下：

Public Declare Function SetTimer&#38; Lib &#34;user32&#34; (ByVal hwnd&#38;, _
    ByVal nIDEvent&#38;, ByVal uElapse&#38;, ByVal lpTimerFunc&#38;)
Private Declare Function KillTimer&#38; Lib &#34;user32&#34; (ByVal hwnd&#38;, _
    ByVal nIDEvent&#38;)
Public Const NV_INPUTBOX As Long = &#38;H5000
&#160;
Public Sub TimerProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long)
  [...]]]></description>
			<content:encoded><![CDATA[<p>这是以前收录的一段程序示例：<br />
使用VBA在调用工作簿中打开被调用工作簿，并运行其中的宏。该宏将弹出一个消息框，如果用户没有响应，那么程序会在指定时间后自动响应。<br />
调用工作簿中的程序代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">Public</span> <span style="color: #000080;">Declare</span> <span style="color: #000080;">Function</span> SetTimer&amp; <span style="color: #000080;">Lib</span> <span style="color: #800000;">&quot;user32&quot;</span> (<span style="color: #000080;">ByVal</span> hwnd&amp;, _
    <span style="color: #000080;">ByVal</span> nIDEvent&amp;, <span style="color: #000080;">ByVal</span> uElapse&amp;, <span style="color: #000080;">ByVal</span> lpTimerFunc&amp;)
<span style="color: #000080;">Private</span> <span style="color: #000080;">Declare</span> <span style="color: #000080;">Function</span> KillTimer&amp; <span style="color: #000080;">Lib</span> <span style="color: #800000;">&quot;user32&quot;</span> (<span style="color: #000080;">ByVal</span> hwnd&amp;, _
    <span style="color: #000080;">ByVal</span> nIDEvent&amp;)
<span style="color: #000080;">Public</span> <span style="color: #000080;">Const</span> NV_INPUTBOX <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span> = &amp;H5000
&nbsp;
<span style="color: #000080;">Public</span> <span style="color: #000080;">Sub</span> TimerProc(<span style="color: #000080;">ByVal</span> hwnd <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, <span style="color: #000080;">ByVal</span> uMsg <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, <span style="color: #000080;">ByVal</span> idEvent <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, <span style="color: #000080;">ByVal</span> dwTime <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>)
    SendKeys <span style="color: #800000;">&quot;%Y&quot;</span>
    KillTimer hwnd, idEvent
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span>
&nbsp;
<span style="color: #000080;">Sub</span> test()
&nbsp;
    <span style="color: #000080;">With</span> Application
        .Calculation = xlCalculationManual
        .ScreenUpdating = <span style="color: #000080;">False</span>
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
&nbsp;
    <span style="color: #000080;">Dim</span> targetworkbook <span style="color: #000080;">As</span> Workbook
&nbsp;
    <span style="color: #000080;">Dim</span> usersave <span style="color: #000080;">As</span> VbMsgBoxResult
&nbsp;
    <span style="color: #000080;">Set</span> targetworkbook = Workbooks.<span style="color: #000080;">Open</span>(<span style="color: #800000;">&quot;C:\test2.xls&quot;</span>, UpdateLinks:=0)
&nbsp;
    Calculate
    targetworkbook.Activate
    SetTimer 0, NV_INPUTBOX, 1000, <span style="color: #000080;">AddressOf</span> TimerProc
    Application.Run targetworkbook.Name &amp; <span style="color: #800000;">&quot;!tester&quot;</span>
&nbsp;
    targetworkbook.Activate
&nbsp;
    <span style="color: #000080;">With</span> Application
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = <span style="color: #000080;">True</span>
    <span style="color: #000080;">End</span> <span style="color: #000080;">With</span>
&nbsp;
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span></pre></div></div>

<p>假设被调用工作簿存储在C盘，工作簿名为test2.xls，那么其中的代码如下：</p>

<div class="wp_syntax"><div class="code"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">Sub</span> tester()
    TimedMsgBox
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span>
&nbsp;
<span style="color: #000080;">Sub</span> TimedMsgBox()
    <span style="color: #000080;">Dim</span> cTime <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>
    <span style="color: #000080;">Dim</span> WSH <span style="color: #000080;">As</span> <span style="color: #000080;">Object</span>
&nbsp;
    <span style="color: #000080;">Set</span> WSH = CreateObject(<span style="color: #800000;">&quot;WScript.Shell&quot;</span>)
    cTime = 5 <span style="color: #008000;">'5 秒
</span>    <span style="color: #000080;">Select</span> <span style="color: #000080;">Case</span> WSH.Popup(<span style="color: #800000;">&quot;Open an Excel file?!&quot;</span>, cTime, <span style="color: #800000;">&quot;Question&quot;</span>, vbOKCancel)
        <span style="color: #000080;">Case</span> vbOK
            MsgBox <span style="color: #800000;">&quot;你单击了确定&quot;</span>
        <span style="color: #000080;">Case</span> vbCancel
            MsgBox <span style="color: #800000;">&quot;你单击了取消&quot;</span>
        <span style="color: #000080;">Case</span> -1
            MsgBox <span style="color: #800000;">&quot;超时&quot;</span>
    <span style="color: #000080;">End</span> <span style="color: #000080;">Select</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span></pre></div></div>

<p>运行调用工作簿中的程序后，被调用的工作簿test2.xls会被打开，并运行其中的程序，该程序会弹出一个消息框，如果用户没有响应该消息框，那么在5秒后，会自动响应，即弹出一个内容为“超时”的消息框。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/01/26/autoreponsemessages/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>带有菜单栏的用户窗体</title>
		<link>http://www.excelperfect.com/2010/01/21/menubarsinuserform/</link>
		<comments>http://www.excelperfect.com/2010/01/21/menubarsinuserform/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 05:17:12 +0000</pubDate>
		<dc:creator>excelperfect</dc:creator>
				<category><![CDATA[VBA]]></category>
		<category><![CDATA[技巧]]></category>
		<category><![CDATA[用户窗体]]></category>

		<guid isPermaLink="false">http://www.excelperfect.com/?p=1512</guid>
		<description><![CDATA[今天，给大家分享Jan Karel Pieterse的作品：带有菜单栏的用户窗体。如下图所示。

示例文档下载：

]]></description>
			<content:encoded><![CDATA[<p>今天，给大家分享Jan Karel Pieterse的作品：带有菜单栏的用户窗体。如下图所示。<br />
<a href="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/01/CreateMenuInUserform.png"><img src="http://www.excelperfect.com/wordpress/wp-content/uploads/2010/01/CreateMenuInUserform.png" alt="CreateMenuInUserform" title="CreateMenuInUserform" class="alignnone size-full wp-image-1515" /></a><br />
示例文档下载：<br />
<iframe title ="Preview" scrolling="no" marginheight="0" marginwidth="0" frameborder="0" style="width:98px;height:115px;padding:0;background-color:#fcfcfc;" src="http://cid-20bf8b0bc70443f9.skydrive.live.com/embedicon.aspx/%e7%94%a8%e6%88%b7%e7%aa%97%e4%bd%93/UserFormMenu.xls"></iframe></p>
]]></content:encoded>
			<wfw:commentRss>http://www.excelperfect.com/2010/01/21/menubarsinuserform/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
