Archive for 10月 2007

VBA代码引用工作表的方法探讨

在VBA代码中引用工作表时,可以考虑三种方式:
(1)使用工作表在工作簿中的位置,即索引值。在工作簿的底部,从左到右顺序编号。如果在工作簿使用过程中,移动工作表的位置,则其索引值也会相应改变。
(2)使用工作表名称,即工作表标签。在工作簿使用过程中,用户可能随时改变其名称。
(3)使用工作表“真正的”名称,即代码名称。当创建工作表时,Excel会自动赋给该工作表代码名称,缺省情况下为Sheet后接数字,除非您在VBE中为其重命名。
在VBE中的工程窗口中,通常您可以看到:Sheet1(Sheet1),其中左侧为该工作表的代码名称,右侧括号内的为工作表标签名称(即用户为该工作表起的名字),您也可以为该工作表起别的名字如“汇总”。
下图指出了VBE中工作表代码名称和工作表名称,以及修改方法。
projectWindow

探讨
(1)编写VBA代码时,如果使用工作表索引值或工作表名称,有可能在代码运行时,用户会改变工作表的位置或工作表名称,从而会导致代码运行错误。
(2)这三种方式中,唯一不变的是工作表代码名称,除非最终用户删除了工作表或者在VBE窗口中对其重命名。这样,在用户移动工作表或者改变工作表标签时,代码仍会正常运行。因此,这种方式相对来说,应该是最安全的。
您可以在VBE中将工作表的代码名称改为有意义的名称。
(3)例如,要激活上图中的第一个工作表,则相对应的引用工作表的三种方式是:

  • 通过索引值:Sheets(1).Activate
  • 通过工作表名称:Sheets(“汇总”).Activate
  • 通过代码名称:Sheet1.Activate

(4)再举一个例子,要将上图中“汇总”工作表上A1:C10中的数据复制到“上半年”工作表中的A1:C10中,相应的也有三种方式:

  • 通过索引值:Sheets(1).[A1:C10].Copy Sheets(2).[A1]
  • 通过工作表名称:[汇总!A1:C10].Copy [上半年!A1]
  • 通过代码名称:Sheet1.[A1:C10].Copy [Sheet3.A1]

(5)不可以跨工作簿使用工作表代码名称,即不能在一个工作簿中使用另一个工作簿中的工作表代码名称。

2007 Office Fluent Ribbon定制用户指南(连载4)

添加基于文档的加载项到Fluent UI
下面的步骤概述了在Excel 2007中创建包含简单的自定义UI文档的基本过程,该自定义UI可以调用自定义宏:
1、创建一个启用宏的Excel工作簿,该工作簿中包含一个宏。
2、创建一个自定义Fluent UI的文件,该文件将在Ribbon中添加一个选项卡、一个组和一个按钮。
3、创建一个Fluent UI调用的VBA过程,来响应单击按钮的操作。
4、在按钮的标记里指定onAction回调属性,以便于调用在文档中创建的宏。
5、修改启用宏文档容器的内容,以便包含自定义Fluent UI的文件。
6、保存启用宏的文件,然后在Excel 2007中打开。
注:在创建启用宏的Word或PowerPoint文档时,可以按照相同的步骤。
(一) 创建一个启用宏的Excel工作簿
1、开启Excel 2007。
2、单击“开发工具”选项卡,然后单击“Visual Basic”。
注:如果在Ribbon中没有看到“开发工具”选项卡,必须自已调出该选项卡。可以单击“Office按钮”,然后单击“Excel选项”,单击“常用”,然后选择“在功能区显示开发工具选项卡”。这是一个全局设置,在某应用程序中进行该设置后,将在所有的Office应用程序中起作用。
3、在VBE中,双击ThisWorkbook打开代码窗口。
4、输入下面的VBA函数,然后单击工具栏左侧的Excel图标来返回Excel。
Sub MyMacro(ByVal control As IRibbonControl)
    MsgBox (”Hello World”)
End Sub
5、以启用宏工作簿来保存该文档,其扩展名为.xlsm。
注:如果以标准的.xlsx文档来保存该文档,则不可能运行宏代码。当保存该文档时,必须明确地选择“另存为”选项,然后选择“Excel启用宏的工作簿(*.xlsm)”。
6、退出Excel。
(二) 创建包含XML标记的文件来修改Fluent UI
1、在桌面上创建一个名为customUI的文件夹。
2、创建一个新的文本文件,添加下面的XML,然后将其以customUI.xml文件名保存在桌面上的customUI文件夹中。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon startFromScratch=”true”>
    <tabs>
      <tab id=”CustomTab” label=”我的选项卡”>
        <group id=”SimpleControls” label=”我的组”>
          <button id=”Button1″ imageMso=”HappyFace” size=”large”
            label=”大按钮”
            onAction=”ThisWorkbook.MyMacro” />
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
(三) 修改包含在启用宏的文件容器中的文件
1、在Windows资源管理器中,在刚创建的Excel文档后面添加.zip扩展名。
2、双击该zip文件,打开它。
3、将customUI文件夹从桌面中拖放到zip文件容器中。
4、将zip文件容器中的_rels文件夹拖放到桌面中。
5、打开该文件夹,然后在文本编辑器中打开该.rels文件。
6、在最后的元素和元素之间添加下面的文本,然后保存并关闭该文件。
<Relationship Id=”customUIRelID” Type=”http://schemas.microsoft.com/office/2006/relationships/ui/extensibility” Target=”customUI/customUI.xml” />
7、从桌面中拖放.rels文件到压缩文件夹中的_rels文件夹中,替换已有的.rels文件。
8、从该容器文件名中移除.zip扩展名。
9、在Excel 2007中打开该启用宏的文件,可以看到自定义的UI取代了内置的Fluent UI,如图所示。
customUIReplaceBuildinUI
注:取决于Excel的安全设置,可能会看到一个安全警告,告诉已禁用了宏。此时,需要单击在警告旁出现的选项按钮,选择“启用此内容”,然后单击“确定”按钮。
10、单击“Large Button”,将触发onAction回调,调用工作簿中的宏,显示“Hello World”消息。
(四) 自定义带COM加载项的Fluent UI
应用程序级的定制导致修改过的Fluent UI出现在打开的任何文档中。通常,COM加载项来产生这些修改。通过使用可管理的代码创建COM加载项通常有两种方式:可以使用包括在Visual Studio 2005中的共享加载项模板,或者使用Visual Studio 2005 Tools for Office Second Edition可以更容易创建加载项。随后的步骤描述了定制Ribbon的COM加载项调用顺序的方法。虽然创建加载项的概念是相同的,但需要编写的指定的代码是不同的,正如您将在本文随后的内容中所介绍的创建加载项的示例。
(五) 使用COM加载项自定义Fluent UI
1、创建一个COM加载项工程。
创建的加载项必须执行Extensibility.IDTExtensibility2接口和IRibbonExtensibility接口(在Microsoft.Office.Core命名空间中查找)。
2、创建该加载项和安装项,然后安装该项目。
3、开启Office应用程序。
当装载该加载项时,将触发IDTExtensibility2::OnConnection事件初始化加载项,就像在以前的Office版本中一样。
接下来,Office调用QueryInterface方法(为不可管理的加载项)或QueryService方法(为可管理的加载项),确定该加载项是否实现IRibbonExtensibility接口。如果是,则Office调用IRibbonExtensibility::GetCustomUI方法,返回XML标记(从一个XML定制文件或从嵌入在过程中的XML标记),然后Office装载定制的Fluent UI到应用程序中。最后,已为用户准备好定制的UI。
注意:因为内置的Ribbon回调机制的架构,除了为Ribbon准备和返回XML标记,在GetCustomUI方法里执行非初始化是重要的。特别地,不会从该回调方法里显示对话框或消息窗口。
指定在XML标记中的每个控件通过调用其回调过程来公布其功能。例如,为某按钮控件的XML标记可以指定一个onAction属性,指向当用户单击该按钮时执行的过程。在大多数情况下,该回调过程公布一个IRibbonControl接口来识别控件。该回调也可以传递其它参数,例如Boolean对象来指定切换按钮按下或没按下的状态。IRibbonControl接口实现三个属生:Context对象、Id对象和Tag属性。Context对象是包含触发回调的Ribbon的活动窗口;Id对象是在标记里指定的自定义控件的字符串识别器;Tag属性是一个非独立的属性,可以选择在标记中是否指定。

使用Open Office XML格式自定义Excel Fluent Ribbon

现在,根据2007 Office Fluent Ribbon定制用户指南(连载3)所介绍的内容,以自定义Excel 2007功能区为例,讲解使用Open Office XML格式自定义Excel Fluent Ribbon的详细步骤。
步骤1在桌面上创建一个名为customUI的文件夹。
步骤2:打开任何文本编辑器,这里打开Windows中的记事本,在其中输入下面的XML标记并在customUI文件夹中将其保存为customUI.xml。
<customUI xmlns=”http://schemas.microsoft.com/office/2006/01/customui“>
  <ribbon>
    <tabs>
      <tab idMso=”TabAddIns”>
        <group id=”myGroup” label=”My Group”>
          <button id=”b1″ imageMso=”HyperlinkInsert” size=”large” label=”Surf the Net” onAction=”surf”/>
          <button id=”b2″ imageMso=”HappyFace” label=”Smile” onAction=”smile”/>
          <button id=”b3″ imageMso=”FormatPainter” label=”Paint” onAction=”paint”/>
          <button id=”b4″ imageMso=”AutoFilterClassic” label=”Filter” onAction=”filter”/>
       </group>
     </tab>
   </tabs>
  </ribbon>
</customUI>
步骤3:打开Excel 2007新建一个工作簿,将其保存为OOXMLCustomUI.xlsm。因为上面的XML代码中需要提供产生回调的代码,因此在该工作簿的VBE中新建一个模块,并输入下面的VBA代码:
‘Callback for b1 onAction
Sub surf(control As IRibbonControl)
End Sub
‘Callback for b2 onAction
Sub smile(control As IRibbonControl)
End Sub
‘Callback for b3 onAction
Sub paint(control As IRibbonControl)
End Sub

‘Callback for b4 onAction
Sub filter(control As IRibbonControl)
End Sub
当然,您可以在Sub过程中输入具体的代码,来执行相应的操作。
步骤4:关闭OOXMLCustomUI.xlsm。
步骤5:在Windows资源管理器中,对该文档文件名后添加文件扩展名.zip,将其变为压缩文件(容器文件),如图1所示。
Excel2007ChangeZip
图1:将xlsm文件变为zip文件
步骤6:双击这个zip文件,打开该文件。
步骤7:将刚才创建的customUI文件夹拖放到zip容器中,如图2所示。
ZipFile
图2:zip文件中的内容
步骤8:将zip文件中的_rels文件夹拖到桌面上。
步骤9:打开这个文件夹,然后在文本编辑器中打开.rels文件,在最后的元素和结束的元素之间,添加一行语句(如下)来创建文档文件和自定义文件之间的联系。
确保正确地指定文件夹和文件名(Id属性为customUI(其值是任意的)提供了唯一的联系ID)
步骤10:保存这个.rels文件。
步骤11:将该.rels文件从桌面上拖回到zip文件中的_rels文件夹中,替换已存在的.rels文件。
步骤12:关闭zip。
步骤13:将OOXMLCustomUI.xlsm.zip中的.zip扩展名删除,此时文档恢复为OOXMLCustomUI.xlsm。
步骤14:打开OOXMLCustomUI.xlsm,此时将在“加载项”选项卡中添加自定义组,如图3所示。
AddGroup1
图3:Excel 2007功能区中自定义的组

使用VBA处理数组的几个简单示例

本文介绍了使用VBA处理数组的几个简单示例。您可以对这些示例进行调整和充实,以满足实际需要。
填充数组并将其数据复制到工作表
Sub Sheet_Fill_Array()
    Dim myArray As Variant
    myArray = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
    Range(”A1:A10″).Value = Application.WorksheetFunction.Transpose(myArray)
End Sub

代码中使用了Excel工作表函数Transpose将数组值进行转置,以垂直填充工作表单元格。
从工作表中获取数值并填充数组
Sub From_sheet_make_array()
    Dim myArray As Variant, i As Integer
    myArray = Range(”A1:A10″).Value
    ‘遍历数组
    For i = 1 To UBound(myArray)
        MsgBox myArray(i, 1)
    Next
End Sub

注意,该数组是一个二维数组。
传递和接收数组
Sub Pass_array()
    Dim myArray As Variant
    myArray = Range(”a1:a10″).Value
    Receive_array myArray
End Sub
Sub Receive_array(thisArray)
    Dim i As Integer
    For i = 1 To UBound(thisArray)
        MsgBox thisArray(i, 1)
    Next
End Sub

本示例演示了将数组作为参数进行传递。

2007 Office Fluent Ribbon定制用户指南(连载3)

通过使用Office Open XML格式文件自定义Fluent UI
1、在桌面上创建一个名为customUI的文件夹。
2、在任何文本编辑器中创建自定义文件,编写XML标记在Fluent UI中添加新的组件、修改已存在的组件或者隐藏组件。也可以使用以前示例中的XML标记。在刚才创建的文件夹中,将该文件保存为customUI.xml(或其它名称)。
3、根据自定义Fluent UI架构(可选的)验证XML标记。
4、在Office应用程序中创建一个文档然后将其保存为Office Open XML文件格式,其扩展名为:.docx、.docm、.xlsx、.xlsm、.pptm或.pptx。
文件扩展名中带有“m”后缀的文件中包含宏,这些文件可以包含能够被RibbonX命令和控件调用的过程。
注:如果想添加代码来响应Ribbon定制的用户界面,则必须将文档保存为启用宏的格式,带有这种功能的文档包括.docm、.xlsm和.pptm格式。对于本文中包括VBA代码的所有示例,必须将其宿主文档保存为上述格式之一。
5、退出Office应用程序。
6、在Windows资源管理器中,对该文档文件名后添加文件扩展名.zip,然后双击打开该压缩文件。
7、从桌面上通过拖动customUI文件夹到被压缩的文件夹中,这样将添加定制文件到容器中。
8、拖动_rels文件夹到桌面上。一个包含.rels文件的名为_rels的文件夹出现在桌面上。
9、打开这个新文件夹,然后在文本编辑器中打开.rels文件。
10、在最后的<Relationship>元素和结束的<Relationships>元素之间,添加一行来创建文档文件和自定义文件之间的联系。确保正确地指定文件夹和文件名(Id属性为customUI(其值是任意的)提供了唯一的联系ID)
<Relationship Type=”http://schemas.microsoft.com/office/2006/
  relationships/ui/extensibility” Target=”/customUI/customUI.xml”
  Id=”customUIRelID” />
11、保存.rels文件。
12、将.rels文件从桌面上拖放到压缩文件中的_rels文件夹中,替换已存在的.rels文件。
13、从容器文件中删除.zip扩展名。
当在Office应用程序中打开该文件时,在Office功能区中将出现自定义的UI。如果在本例中使用前面所提供的标记,可能在打开文档时收到几条警告消息,因为您没有提供相应回调过程的代码,事实上仍没有创建一个完整的自定义UI。