存档

‘VBA学习’ 分类的存档

如何在打印时调用宏

2008年12月19日

          可以重写(不知道术语对不对)word命令,因为打印对应的word命令为FilePrint,因此只需把这个命令重新按照自己所需要的结果进行定义,那么调用宏的命令是Run,因此可以在打印中首先运行宏,然后再执行打印,执行打印后可以再进行其他一些操作,比如清除刚才写入的内容等。

 

 

Application.Run
“MakeTime”
 ‘调用宏,其中MakeTime为宏名
 Dialogs(wdDialogFilePrint).Show 

 

‘显示打印窗口

ActiveDocument.Sections(1).Headers(1).Range.Text = “”

ActiveDocument.Sections(1).Headers(2).Range.Text = “”

‘执行其它操作

 

 

VBA学习 , ,

在VB中产生随机数的代码

2008年12月19日

在实际应用中,为防止随意篡改资料,需要一定的防护方法,其中随机数的生成就是一种。VB中生成随机数的代码如下所示:

Function
MakeRand(nLength As Integer) As String
‘随机生成指定长度的字符串,包括英文字母和数字
Randomize
For i = 1 To nLength
r = Int(Rnd * 3)
Select Case r
Case 0 ‘数字
MakeRand = Rand & Int(Rnd * 10)
Case 1 ‘小写字母
Rand = Rand & Chr(Int(Rnd * 26) + 97)
Case 2 ‘大写字母
Rand =Rand & Chr(Int(Rnd * 26) + 65)
End Select
Next
End Function
 

上述程序能够生成任意长度的随机数,包括数字和字母,其中长度由参数nLength决定。下面对用到的函数和语句进行解析。

Rnd函数

功能:返回一个包含随机数值的Single。

语法:Rnd[(number)]可选的number参数是Single或者任何有效的数值表达式。

返回值:如果number的值是Rnd生成,小于0每次都使用number作为随机数种子得到相同的结果;大于0则是序列中的下一个随机数;等于0,则是最近生成的数;缺省状态下是序列中的下一个随机数。

说明:Rnd函数返回值大于等于0小于1;number的值决定了Rnd生成随机数的方式;对最初给定的种子都会生成相同的数列,因为每次调用Rnd函数都用数列中的前一个数作为下一个数的种子;在调用Rnd之前,先使用无参数的Randomize语句初始化随机数生成器,该生成器具有根据系统计时器得到种子的功能。

Ps:生成某个范围内随机整数的公式Int((upperbound-lowerbound+1)*Rnd+lowerbound)

Randomize

功能:初始化随机数生成器

语法:Randomize
{number],可选的number参数是Variant或任何有效的数值表达式

说明:Randomize用number将Rnd函数的随机数生成器初始化,该随机数生成器给number一个新的种子值。弱国省略,则用系统计时器Timer返回值作为新的种子值。如果没有使用Randomize,则(无参数)的Rnd函数使用第一次调用Rnd函数的种子值。

 

 

 

VBA学习

word表格自动求和

2008年12月5日

在word中实现自动求和,有多种方法,下面分别介绍:以下面表格为例,要求每行最左边的单元格的值等于其右侧所有单元格的和

 

         
         

 

1.用域的自动更新。在左侧单元格插入所需的求和公式——加入宏(update)

其中update代码为:

 

Sub update()’

‘ update Macro

‘ 宏在 2008-12-5 由
sunshineyxp 创建

‘更新第一行数据

 

 

 

With ActiveDocument

 

 

 

.Fields(1).update

 

 

 

End With

End Sub

 

 

Sub update1()

‘ update Macro

‘ 宏在 2008-12-5 由
sunshineyxp 创建

‘更新第二行数据

 

 

 

With ActiveDocument

 

 

 

.Fields(6).update

 

 

 

End With

End Sub

 

 

         该种方法的缺陷有两点:第一fields的index需要挨着查看,如果文档很长而且域比较多,那么查找起来将会很复杂,如果一旦修改文档的某一处,那么后面其它的都要跟着变化,程序的可用性很低;第二如果涉及数据比较多,那么可能会出现闪烁现象,尤其是在vista系统下

2.使用控件textbox:使用textbox,则在最左侧的单元格中加入控件textbox,例如分别为textbox1,textbox2,那么update对应的代码为:

 

Sub update()’

‘ update Macro

‘ 宏在 2008-12-5 由
sunshineyxp 创建

‘更新第一行数据

With
ActiveDocument

.TextBox1.Text=Val(.bookmarks(“text1”).Range.text)+Val(.bookmarks(“text2”).Range.text)+……

 

 

 

End
With

End Sub

 

 

Sub update1()

‘ update Macro

‘ 宏在 2008-12-5 由
sunshineyxp 创建

‘更新第二行数据

 

 

 

With ActiveDocument

 

 

 

.TextBox2.Text=Val(.bookmarks(“text8”).Range.text)+Val(.bookmarks(“text7”).Range.text)+……

 

 

 

End With

End Sub

 

3.直接应用单元格

核心代码为: 

.Tables(3).Cell(1,1).Range.Text=
Val(.bookmarks(“text1”).Range.text)+Val(.bookmarks(“text2”).Range.text)+……

 

如果涉及到的表格数据很多,那么第二种和第三种方法比较好,因为速度比较快,但是textbox的安全性比较低,容易受病毒的感染。

做表格的自动求和关键是理清求和的思路,应该对哪些单元格求和,之间的逻辑关系又是怎样的。

VBA学习

VBA部分代码总结

2008年12月5日

1. 取得下拉列表的值

     With ActiveDocument
     i =.FormFields(”DropDown11″).DropDown.Value
     Select Case i
     Case 1: coContent = “甲乙共同所有”
     Case 2: coContent = “甲方所有”
     Case 3: coContent = “乙方所有”
        ……
    End Select
    End With

2.嵌套表格的引用:例如引用全局的第三个表格中的第一个表格的数据
ActiveDocument.Tables(3).Tables(1).Cell(5,4).Range.Text

3.引用标签中的值(文本型窗体域):ActiveDocument.Bookmarks(”Text113″).Range.Text

4.数据格式的转换,例如把结果表示为.00的格式
.Tables(3).Tables(1).Cell(6, 3).Range.Text =
Format(Val(.Bookmarks(”Text113″).Range.Text) + Val(.Bookmarks(”Text108″).Range.Text),”0.00″)

5.引用TextBox的值

ActiveDocument.TextBox29.Text=……

6.字符串的分离
a =Split(.Tables(4).Cell(Row:=9, Column:=3).Range.Text, “”)以空格为界分离字符串

7.获取系统时间
Format$(Now,”yyyy年mm月dd日hh时mm分ss秒”)

 

VBA学习