Microsoft . 技术之路...

—— 专注于微软技术, 分享是快乐的源泉......
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

保存图表和图形

根据诗人和浪漫主义者的标准,真正的艺术应该是短暂的:它转瞬即逝且永不再现。这种感觉多么美好;但是,如果您在老板要求查看您一直处理的图表和图形时这样说,那可就是完全不同的两码事了。(“老板,您知道,真正的图表和图形应该是短暂的…”)我们不是说您一直忙碌的图表和图形不是真正的艺术;我们只是想说保留那些图表和图形的副本未尝不是一个好主意,哪怕只是一小会儿。

读完上面的引言,您可能已经猜到了今天专栏的主题:删除 Microsoft Outlook 中的约会。不,等一下,我们超前了;今天我们打算探讨的是关于如何保存图表和图形。事实上,在本专栏中,我们将向您介绍用以获取酷图表并进行保存的两种完全不同的方法,请选择更好的一种方法以展示给未来一代(和老板),保证您会得到更多的赞赏。

注意。今天的专栏实际上是关于在 Microsoft Excel 中创建图表和图形系列讲座的第四讲。正因为如此,我们不打算花费时间来讨论创建图表和图形的基本知识。如果发现您需要有关今天讲座中部分内容的详细说明,请转到 Office Space archive,找到 Microsoft Excel Graphs and Charts 一节,然后查看系列讲座中先前的文章。

如果要保存图表和随附的工作表(即含有用于创建图表的数据的工作表),您只需调用 SaveAs 方法。实际上,SaveAs 方法是相当复杂的:它包括密码保护工作表选项、用不同的文件格式保存选项以及自动创建备份文件选项。今天,我们不打算探讨这些选项。这是因为现在我们只需要一个脚本,用它来完成两件事情。首先,用脚本创建一个如下所示的简易小图表:

Microsoft Excel


其次,用脚本将新图表(和工作表)另存为 C:\Scripts\Test.xls。这就是我们需要解决的问题。

真是凑巧,我们正好有一个脚本可以完成上述两件事情:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible 
= True

Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(
1,1= "Africa"
objWorksheet.Cells(
2,1= "Asia"
objWorksheet.Cells(
3,1= "Europe"
objWorksheet.Cells(
4,1= "North America"
objWorksheet.Cells(
5,1= "South America"

objWorksheet.Cells(
1,2= 33
objWorksheet.Cells(
2,2= 54
objWorksheet.Cells(
3,2= 23
objWorksheet.Cells(
4,2= 41
objWorksheet.Cells(
5,2= 56

Set objRange = objWorksheet.UsedRange
objRange.Select

Set colCharts = objExcel.Charts
colCharts.Add()

Set objChart = colCharts(1)
objChart.Activate

objChart.ChartType 
= -4100

objChart.SaveAs 
"c:\scripts\test.xls"

正如我们所说的那样,我们不打算详细分析所有代码;只需说我们创建 Excel.Application 对象的一个实例然后添加一个新的工作簿和一个新的工作表就足够了。我们在该工作表的 Sheet 1 中输入一些数据,选择这些数据,然后在其外部创建一个图表。之后,我们只需激活该图表,然后利用下面这行代码将其转换为令人惊奇的三维柱形图:

objChart.ChartType = -4100

真是激动人心。不过,对于今天的专栏,我们所真正关注的唯一一件事情就是脚本的最后一行,亦即实际保存新工作簿的那一行:

objChart.SaveAs "c:\scripts\test.xls"

正如您所看到的,调用 SaveAs 方法并不一定非常复杂,也可能会非常容易。那好,调用 SaveAs 方法并传递一个参数:新工作簿的路径。仅此而已;执行该行代码,您的图表(以及工作簿的其余部分)将被保存。

嗯,很可能就是这样。如果文件 C:\Scripts\Test.xls 不存在,则将保存您的脚本。如果该文件确实存在,脚本不会自动将其覆盖;而是您必须处理下面这个消息框:

Microsoft Excel


是的,我们知道:您并不处理该消息框。请放轻松;同往常一样,脚本专家会提供答案。(当然,我们的答案并不总是正确,不过……)如果您更喜欢自动覆盖现有文件,仅需在调用 SaveAs 方法的前面添加下面这行代码:

objExcel.DisplayAlerts = False

DisplayAlerts 设置为 False 之后,将会取消错误消息和消息框,脚本将采用默认选项自动运行。当出现与现有文件有关的消息框时,默认选项是覆盖该文件。通过将 DisplayAlerts 设置为 False,脚本将自动覆盖该文件,而不显示消息框。

顺便说一句,无论您的工作簿是否包含图表,SaveAs 方法(以及处理 DisplayAlerts)都将会运行。换言之,如果要保存刚刚创建的电子表格,则您所必须做的就是执行本文介绍的简单步骤。

当然,有时您可能希望仅保存图形,不保存随附的工作表。这可以通过将图形以图片文件的形式导出来实现;此时您会得到一个 .GIF 或 .JPG 图像(准备填充报告或 Web 页面),而不会得到工作表。最大的优势在于,导出图形时仅需调用 Export 方法:

objChart.Export "c:\scripts\test.gif""GIF"

这一次我们传递两个参数:新图片文件的路径以及图形筛选器的名称。要以 JPEG 格式导出文件,请使用以下代码:

objChart.Export "c:\scripts\test.jpg""JPG"

想象一下,这一过程可能会相对简单一些,但却不容易看到如何将图形导出。

但请稍候:还有另外一种方法。也可将图形复制到剪贴板中,制作一个快照,然后将图片粘贴到另一个应用程序中。这种方法听起来好像更为复杂,但即使是将图表复制到剪贴板中也是仅需一行代码:

objChart.CopyPicture()

好的,我们就用它:这种方法是如此简单,简直使人无法适应。

如果您对于如何将图形复制到剪贴板中感到迷惑不解,下面提供了一种方案。下面的脚本将创建一个图形,将该图形作为图片复制到剪贴板中,启动 Microsoft Word,然后将该图片粘贴到 Word 文档中。(您可能会问,“这是它所作的全部事情吗?”)代码如下所示:

Set objExcel = CreateObject("Excel.Application")
objExcel.Visible 
= True

Set objWorkbook = objExcel.Workbooks.Add()
Set objWorksheet = objWorkbook.Worksheets(1)

objWorksheet.Cells(
1,1= "Africa"
objWorksheet.Cells(
2,1= "Asia"
objWorksheet.Cells(
3,1= "Europe"
objWorksheet.Cells(
4,1= "North America"
objWorksheet.Cells(
5,1= "South America"

objWorksheet.Cells(
1,2= 33
objWorksheet.Cells(
2,2= 54
objWorksheet.Cells(
3,2= 23
objWorksheet.Cells(
4,2= 41
objWorksheet.Cells(
5,2= 56

Set objRange = objWorksheet.UsedRange
objRange.Select

Set colCharts = objExcel.Charts
colCharts.Add()

Set objChart = colCharts(1)
objChart.Activate

objChart.ChartType 
= -4100

objChart.CopyPicture()

Set objWord = CreateObject("Word.Application")
objWord.Visible 
= True
Set objDoc = objWord.Documents.Add()
Set objSelection = objWord.Selection
objSelection.Paste

这当然并不短暂。但它仍然是相当酷的:

Microsoft Excel


并且,再次重申,您只需编写很少的代码。在将图形复制到剪贴板之后,我们仅需启动 Word,将 Visible 属性设置为 True(这样我们就能在屏幕上看见所有内容),然后用 Add 方法创建一个新的空文档。我们创建 Word Selection 对象的一个实例,然后调用 Paste 方法将剪贴板的内容(即图形)粘贴到文档中:

objSelection.Paste

英国作家 D. H. Lawrence 曾经说过,“人类灵魂深处对于真实美的追求要胜过于对面包的追求。”换言之,既然您拥有用于创建和保存这些艺术品的脚本,那么,您还需要什么呢?

这样说的意思是既然您已拥有真实的美丽,那何愁没有机会享用面包呢?