66、.用VBA(编程)保护Excel文档
VBA(Visual Basic for Application)是Excel应用程序中功能非常强大的编程语言,为了规范不同的用户对Excel应用程序的访问能力,需要对Excel文档及有关的数据进行有效的保护, 这里根据自己及同行们的体会,从以下二个方面介绍用VBA编程法实现对Excel文档的保护。 对工作簿的保护
1.利用VBA中Workbook对象的SaveAs方法实现对工作簿的保护, 下面就对SaveAs有 关的参量作一介绍:
Filename:该字符串表示要保存的文件名。 可包含完整路径。 如果不指定路径,Microsoft Excel 将文件保存到当前文件夹。 FileFormat: 可选,文件的保存格式。
Password :为一个区分大小写的字符串(不超过15个字符) ,用于指定文件的保护密码。
WriteResPassword: 该字符串表示文件的写保护密码。 如果文件保存时带有密码,但打开文件时不输入密码,则该文件以只读模式打开。
ReadOnlyRecommended :如果为True则在打开文件时显示一条信息,提示该文件以只读模式打开。
下例就是在Excel应用程序中添加一工作簿,将工作簿按常规文件格式存为―C:\\pj\\obj\\经济评价.xls‖文件,并给该文件指定保护密码―12‖以及写保护密码―23‖。 Sub 保护工作簿()
NewWorkbook = Workbooks.add
NewWorkbook.SaveAs FileName: =\经济评价.xls\XlNormal,Password:=\ End sub
2.利用VBA中Workbook对象的Protect方法对工作簿的结构和窗口进行保护,Workbook对象的Protect方法带有以下三个参量:
Password: 为加在工作表或工作簿上区分大小写的密码字符串。 如果省略本参数,不用密码就可以取消对该工作簿的保护。否则,取消对该工作表或工作簿的保护时必须提供该密码。如果忘记了密码,就无法取消对该工作表或工作簿的保护。最好在安全的 地方保存一份密码及其对应文档名的列表。
Structure: 若为True则保护工作簿结构(工作簿中工作表的相对位置)。默认值为False。 Windows 若为True则保护工作簿窗口。
下例就是对一名为―经济评价.xls‖的工作簿实现―结构‖和―窗口‖保护: Sub 保护工作簿()
Workbooks (″经济评价″) .Protect Password: =\Windows:=True End sub
Workbook对象的Unprotect方法用于取消对工作簿的保护。Unprotect方法只有一个参量,就是保护工作表时所用的口令。 3.对工作簿进行隐藏保护,可使他人无法看到其对应的窗口。操作方法如下:
在VBA中使用Workbook对象下面的Windows对象的Visible属性对工作簿进行隐藏和取消隐藏,Visible属性的值可取―True‖和―False‖两种。
下面程序代码完成对工作簿―book.xls‖的隐藏: Sub 隐藏工作簿() Workbooks(\ActiveWindow.Visible = False End sub 或:
Sub 隐藏工作簿()
Workbooks(\(1).Visible=False End sub 对工作表的保护
1.对工作表实现口令保护利用VBA调用Worksheet对象的Protect方法对工作表进行保护,Protect带有以下参量:
Password 用于保护工作表的口令。
Drawingobjects 若为True,则对工作表中的Drawingobjects对象进行保护,缺省值为True。 Contents 若为True,则对单元格内容进行保护,缺省值为True。 下面程序代码完成对工作表―基础数据表‖的保护: Sub 保护工作表()
Worksheets(″基础数据表″).Protect Password:=\End sub
2.对工作表实现隐藏保护,使他人无法看到工作表:
利用VBA设置Worksheet对象的Visible属性来隐藏工作表;Visible属性的值为以下三个值中的一个: True 工作表为显示状态。 False 工作表为隐藏状态。
XlVerHidden 工作表为隐藏状态,且用户不能通过―取消隐藏‖对话框将其改为显示状态。当Visible的值为XlVerHidden时,只能利用VBA将其重新设置为True。 Sub 隐藏工作表()
Worksheets(\基础数据表\ End sub
67、求:将所选区域中的数值全部转化为\万元\的最简代码. 求:将所选区域中的数值全部转化为\万元\的最简代码. 或能完成此功能的最便捷的命令操作. 写了一个,抛砖引玉: Sub convt() Dim cel As Range Dim dec As Variant
Application.EnableEvents = False
yesorno = MsgBox(\确实将区域所有数值转换为―万元‖?\ If yesorno = vbYes Then
1: dec = Application.InputBox(\请输入小数位数:\ If dec = \ GoTo 1 End If
For Each cel In Selection If IsNumeric(cel.Value) Then
'cel = (Round(cel.Value / 10000, 2)) & \万元\ cel = (Round(cel.Value / 10000, dec)) End If Next
ElseIf yesorno = vbNo Then Exit Sub End If End Sub
以下当为最简代码吧. Sub Macro2()
Selection.NumberFormatLocal = \End Sub
68、在VBA开发环境中,点击工具――附加控件,出现如下窗口:
在可选控件中选择microsoft orogressbar control,再点击确定,这时,你会发现在你的工具箱中增加了进度条工具,如图:
下面说说进度条的用法:
属性:Max: 设置进度条控件的最大值 Min: 设置进度条控件的最小值 Value:设置进度条控件对象的当前值
Scrolling: 进度条的式样,即一格一格的进度条或是没有间隔的进度条。 例子:Private Sub UserForm_Activate() For i = 1 to 5000
ProgressBar1.Max = 5000 ?设置进度条控件的最大值 ProgressBar1.Value = I ?进度条控件对象的当前值 next End Sub
在程序中加入进度条的办法是将ProgressBar1.Max=最大值,ProgressBar1.Value = 当前值放入循环中去。
69、Excel是一个优秀的电子表格软件,如果你编的程序需要以报表的形式显示最终结果,它会是个不错的选择。你可以通过VB控制Excel显示数据表格。如果你不愿意深入了解Excel这些琐碎的细节,也不是没有权宜之计:你可以打开Excel中的工具→宏→录制新宏,然后进行手工操作,结束后把所录的宏代码贴进你的VB程序就行。这样得到的程序一般都能正常运行,但其中的宏代码往往不够简洁,效率和可读性都不高。
Excel编程碰到的第一个问题是表头。有时表头的形式比较复杂,需要横向或纵向合并单元格。请放心,只要没有斜杠,Excel都能应付得了。
例如合并A2~A5这4个单元格,你录制的宏代码会是这样: Range(\With Selection
.HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With Selection.Merge
而自己编程只要一句 Range.(―A2:A5‖).mergecells=True 就可以解决问题。
表头形式定了,再就是表头的内容。如果单元格中的文本长度超过了列宽,往往只能显示部分内容,行尾那一格的内容则会―越境‖进入右边那个空白单元格,很不美观。这个问题可以通过在程序中设置列宽加以解决。 Columns(14).columnwidth=12 ?设置第14列列宽为12(缺省列宽为8.38) 如果你不愿意劳神去逐列估计实际所需的列宽,干脆来一行 Columns(―a:i‖).autofit ?a到i列自动调整列宽 让Excel随机应变吧。
但也许你不喜欢这种方法,认为表头撑大了列宽,弄得浏览一张小表格还得向右滚动,太不方便了。要是能保持默认列宽,让文本自动换行就好了。没问题,Excel包你满意。
Rows(3).WrapText=True ?让第三行各单元格中的文本自动换行
不过你最好再加一句 Rows(3) .VerticalAlignment = xlTop 让表头自动向上对齐,这样比较符合习惯。 你还可以给表头打上底色,让你的读者不至于看了打哈欠。 Rows(2). Interior .ColorIndex = 5 设置第2行底色为蓝色 再给表格的标题上色,这样更醒目一点。
Rows(1).Font.ColorIndex=4
表头完成后该填数据了,一个一个地填实在是太? ,如果你的数据是存放在一个二维数组中,那问题就简单多了。 Dim Data(3,4) ………… ?数据处理
Range(―a2:d4‖).Value=Data
这样可以一次填入一个表的所有数据,够快了吧!不过提醒一句,Range对象大小最好与数组匹配,小了无法显示所有数据,大了则会在空白单元格只填入―N/A‖表示没有取得数据。
如果需要在结果中显示多个同样规格的数据表,想在Range对象中加入循环变量,这也好办。 Dim cell11,cell2 Dim Data(3,4) ………… For I =1 to 40 ………… ?数据处理
Set cell1=Worksheets(\Set cell2=Worksheets(\Worksheets(\Next I
表格填完了,现在该打表格线了,以下几条语句可以满足你的要求: With Worksheets(\.LineStyle=xlContinuous .weight=xlThin End With
70、《计算机实用软件》2001-2002第一学期试卷(2) 一、填空题(每空1分,共20分)
1.在Excel的系统默认状态下,某个工作表的标签呈白色显示,表示其为 。在工作表中被粗线框住的的格子称为 。
2.在Excel工作表中可以输入两类数据它们是 和 3. 工作表由 行和 列组成
4.输入Excel公式应以 或者 开头,然后再输入具体的计算公式
5.在Excel中,系统默认状态下,输入文字的对齐方式是 ,输入数字的对齐方式是
6.在VB5的标准控件中 控件适用于在一组按钮中显示多个选项,但用户只能而且必须选择其中一项。 控件适用于放置用户只能看到但不能修改的少量文本。
7.在VB中,要改变Text1文本框内显示的信息时,应当在其 窗口中, 将 属性进行重新设置。
8.VB5表达(40 Mod 7)\\2的值是 2x2的VB5表达式为
9.如下程序实现在当前窗口中显示一个消息框,消息框中显示有―是(Y)‖和―否(N)‖两个按钮,试将该程序填写完整,使用户点击―是(Y)‖按钮后能显示出数字1,点击―否(N)‖按钮后能显示出数字2 Private Sub Form_Click() Msg=‘你想要继续吗?‖ Style=vbYesNo
Response=msgbox(msg , ) If Response vbYes Print―1‖ Else End if End Sub
二、单选题(每题3分,共30分) 1. Excel主要用于( )领域。
. A. 美术设计、装璜 B. 数据分析、财务管理 C工业设计、机械制造 D.多媒体制作 2. 对话框窗口中的―确定‖按钮的作用是( ) A. 确定输入的信息 B. 确定各选项并开始执行 C. 关闭对话框不做任何事 D.退出对话框
3. 在个人计算机上,通常Excel是在( )系统环境下运行的。 A.office97 B.MS-DOS C.Windows D.UNIX 4、Sheet1是Excel中的一个默认( )
A.工作薄 B.单元格 C.工作表 D.页 5、在Excel中,如果输入分数,则需在数值闪加上() A. 0与空格 B. 空格与0 C. 空格 D. 0
6、在Excel中,公式―SUM+($D2:$C$7)‖中的$C$7属于()引用。 A. 绝对 B. 相对 C. 列相对行绝对的混合 D. 行相对列绝对的混合 7、在Excel工作表中,系统默认状态下,日期和时间数据会自动()对齐。 A. 靠左 B. 靠右 C. 居中 D. 靠上 8、下述( )不是数据清单应具有的特征。
A. 一个数据清单独占一个工作表 B. 数据清单中避免对单元格进行格式化 C. 其它信息不要放在数据清单的区域内 D. 数据清单中避免出现空行或空列 9、下列VB5控件中( )可以自动设置滚动条。 A. 文本框 B. 图片框 C. 框架 D. 复选框 10、若想在窗体显示一句提示信息,下列()控件最适宜实现 A. 框架 B. 标签 C. 单选钮 D. 列表框 11、下述哪个是VB5合法变量名?( ) A. Then B. If C. %h121 D. Then_1
12、若想要建立一个学生管理的输入界面,其中要很要求选择学生的性别和选择选修课情况(共有5门课,供任选),应如何在窗体利用单选按钮和复选框来实现
A. 将5门课程用一组5个复选框来表示,将性别用一组两个复选框来表示 B. 将5门课程用一组5个单选框来表示,将性别用一组两个复选框来表示 C. 将5门课程用一组5个复选框来表示,将性别用一组两个单选框来表示 D. 将5门课程用一组5个单选框来表示,将性别用一组两个单选框来表示
13、假设在当前VB5窗体有一个个文本框Test3,并有Text3_keyPress过程如下(其中变量S1的初始值为0) Private Sub Text3_keyPress (keyAscii As Integer) Static S1
If keyAscii=13 Then ?13是回车符的ASCII码) S1=S1+1 Form1.Print S1
If Text3.Text=‖11‖ Then MsgBox ―It is OK!‖ Text3.Enabled+False End Else
If S1=3 Then
MsgBox ―Sorry,invalid password!‖ End