用Office VBA实现多控件一次性组合

简介:
本文为原创,如需转载,请注明作者和出处,谢谢!

     最近要做个项目,通过 Office VBA 来自动生成一系列的控件(包括文本框、直线等),并将这些控件组合在一起(这在 Office 里很好实现,只要选中这些控件,使用上下文菜单里的组合菜单项即可)。最开始的代码如下:

Dim element1, element2
Dim i  As  Integer
Set element1 =  Nothing
Set element2 =  Nothing
    
For i =  0  To  7
     Set element1 = Application.ActiveDocument.Shapes.AddTextbox(msoTextOrientationHorizontal, i *  30302525)
     If  Not (element2  Is  NothingThen
        ActiveDocument.Shapes.Range(Array(element1.Name, element2.Name)).Select
        Selection.ShapeRange.Group.Select
         Set element2 = Selection.ShapeRange
     Else
         Set element2 = element1
     End  If        
Next i

     上面的代码生成了 8 TextBox ,将其两个为一组进行组合。这样做虽然从技术上没问题。但是如果生成的 TextBox 很多的话,如 1000 个,就会很慢。主要把时间消耗在了是用 VBA 进行组合操作上。因此,只要将组合的方式改为将所有控件都选中,然后组合一次就可以解决这个问题。在上面的代码中,使用了 Array 函数生成了 Variant 类型的数组。而使用 Array 函数是无法根据实际需要生成实际大小的数组的。因此,需要使用 dim 来定义这个数组,代码如下:

Dim elements( 0  To  7As Variant
Dim i  As  Integer    
For i =  0  To  7
    elements(i) = Application.ActiveDocument.Shapes.
      AddTextbox(msoTextOrientationHorizontal, i *  30302525).Name
Next i     
ActiveDocument.Shapes.Range(elements).Select           
Selection.ShapeRange.Group.Select

应使用Dim elements(数组上标 to数组下标)的形式,不能使用Dim elements(数组下标)的形式。如上面的数组定义代码不能写成Dim elements(7) as Variant

如果在程序运行时改变数组的大小,可以使用如下的代码:

Dim elements( 0  To  7As Variant
Dim newElements  As Variant
Dim i  As  Integer    
For i =  0  To  7
    elements(i) = Application.ActiveDocument.Shapes.
      AddTextbox(msoTextOrientationHorizontal, i *  30302525).Name
Next i     

newElements = elements
ReDim  Preserve newElements( 0  To  10As Variant

For i =  8  To  10
    newElements(i) = Application.ActiveDocument.Shapes.
      AddTextbox(msoTextOrientationHorizontal, i *  302002525).Name
Next i

ActiveDocument.Shapes.Range(newElements).Select           
Selection.ShapeRange.Group.Select

     要注意的是,在使用 Redim 时,不能使用已经指定类型的数组,而需要将这个数组放到 Variant 变量中。如不能使用如下的代码来增加数组长度:

ReDim  Preserve elements( 0  To  10As Variant
本文转自银河使者博客园博客,原文链接http://www.cnblogs.com/nokiaguy/archive/2008/06/02/1212359.html如需转载请自行联系原作者

银河使者
相关文章
|
10月前
|
C#
C#导出到Excel——无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口。
C#导出到Excel——无法嵌入互操作类型“Microsoft.Office.Interop.Excel.ApplicationClass”。请改用适用的接口。
154 0
|
C# 前端开发
WPF Adorner+附加属性 实现控件友好提示
原文:WPF Adorner+附加属性 实现控件友好提示 标题太空泛,直接上图   无论是在验证啊,还是提示方面等一些右上角的角标之类的效果,我们会怎么做? 这里介绍一种稍微简单一些的方法,利用附加属性和Adorner来完成。
949 0
|
C#
WPF实现WORD 2013墨迹批注功能
原文:WPF实现WORD 2013墨迹批注功能 1 前言         WORD 2013可以使用墨迹在文档上面标注,本文讲述通过WPF第三方控件实现类似主要功能如下:          名称 描述 墨迹标注 不论是否触摸屏环境下可以开始墨迹功能,并实现鼠标/触摸在文档任意位置...
1357 0
|
C# BI
wpf中xps文档合并功能实现
原文:wpf中xps文档合并功能实现      跟着上一篇的xps文档套打的文章,近期一直在研究xps打印技术,其中用户提到了一个需求,要求能够多页面进行打印,我的想法是,先生成xps文件,然后将文件读取出来以后,合并成一个文件来处理。
1034 0
|
自然语言处理 计算机视觉
UWP Xaml设计器中输入特殊字符
原文:UWP Xaml设计器中输入特殊字符     字符 语法 说明 > 大于号。 & & “and”符。
842 0
|
JavaScript 前端开发 C++
COM组件开发实践(七)---多线程ActiveX控件和自动调整ActiveX控件大小(上)
声明:本文代码基于CodeProject的文章《A Complete ActiveX Web Control Tutorial》修改而来,因此同样遵循Code Project Open License (CPOL)。
840 0