您好,欢迎来到华佗小知识。
搜索
您的当前位置:首页Excel宏编程带举例共33文档

Excel宏编程带举例共33文档

来源:华佗小知识
Excel[ 宏编程举例说明

一) 、宏学习 首先需要明确的是,本文不可能教会您关于宏的所有内容。您需要学 会利用\"录制宏\"的方法来学习宏:点击 Excel\" 工具\"下拉菜单中 \"宏\" 下?quot;录制新宏\",此后可象平时一样进行有关操作,待完成后停止录 制。然后再点击 \"工具\"下拉菜单中 \"宏\"下\"宏\"的\"编辑\"选项即可打开刚才 所录制的宏的 Visual Basic 源程序,并且可以在此时的 \"帮助\"下拉菜单 中获得有关的编程帮助。对录制宏进行修改不仅可以学习宏的使用,还能 大大简化宏的编写。

二) 、基本概念

为了学习 Excel 中的宏,我们需要先了解以下一些基本概念。

1、工作簿: Workbooks、Workbook、ActiveWorkbook 、 ThisWorkbook Workbooks 集合包含 Excel 中所有当前打开的 Excel 工作簿,亦即所 有打幵的Excel

文件;Workbook对应 Workbooks中的成员,即其中的Excel 文件; ActiveWorkbook 代表当前处于活动状态的工作簿,即当前显示的 Excel 文件; ThisWorkbook 代表其中有 Visual

Basic 代码正在运行的工 作簿。

在具体使用中可用 Workbooks(index) 来引用 Workbook 对象,其中 index 为工作簿名称或编号;如 Workbooks(1) 、 Workbooks(\" 年度报 表.xls\")。而编号按照创建或打幵工作簿的顺序来确定,第一个打幵的工 作簿编号为1第二个打幵的工作簿为

2……。

2、工作表: Worksheets 、Worksheet 、ActiveSheet

Worksheets 集合包含工作簿中所有的工作表, 即一个 Excel 文件中的 所有数据表页;

而 Worksheet 则代表其中的一个工作表; ActiveSheet 代 表当前处于的活动状态工作表,即当前显示的一个工作表。

可用 Worksheets(index) 来引用 Worksheet 对象,其中 index 为工作 表名称或索引号;如 Worksheets(1) 、Worksheets(\" 第一季度数据 \") 。工 作表索引号表明该工作表在工作表标签中的位置:第一个(最左边的)工 作表的索引号为 1,最后一个(最右边的)

第 1 页

为 Worksheets.Count 。需要注 意的是:在使用过程中 Excel 会自动重排工作表索引号,保持按照其在工 作表标签中的从左至右排列,工作表的索引号递增。因此,由于可能进行 的工作表添加或删除,工作表索引号不一定始终保持不变。

3、图表: Chart 、 Charts 、 ChartObject 、ChartObjects 、 ActiveChart

Chart 代表工作簿中的图表。该图表既可为嵌入式图表(包含在 ChartObject 中),也可

为一个分开的(单独的)图表工作表。

Charts 代表指定工作簿或活动工作簿中所有图表工作表的集合, 但不 包括嵌入式在工作

表或对话框编辑表中的图表。 使用 Charts(index) 可引 用单个 Chart 图表,其中 index 是该图表工作表的索引号或名称;如 Charts(1) 、 Charts(\" 销售图表 \") 。图表工作表的索引号表示图表工作表 在工作簿的工作表标签栏上的位置。 Charts(1) 是工作簿中第一个(最左 边的)图表工作表; Charts(Charts.Count) 为最后一个(最右边的)图表 工作表。

ChartObject 代表工作表中的嵌入式图表,其作用是作为 Chart 对象 的容器。利用 ChartObject 可以控制工作表上嵌入式图表的外观和尺寸。

ChartObjects 代表指定的图表工作表、 对话框编辑表或工作表上所有 嵌入式图表的集合。

可由 ChartObjects(index) 引用单个 ChartObject , 其中 index 为嵌入式图表的编号或名称。如 Worksheets(\"Sheet1\").ChartObjects(1) 、

Worksheets(\"sheet1\").ChartObjects(\"chart1\") 分别对应 \"Sheet1\" 工作 表中的第一个嵌

入式图表、以及名为 \"Chart1\" 的嵌入式图表。

ActiveChart 可以引用活动状态下的图表, 不论该图表是图表工作表, 或嵌入式图表。而

对于图表工作表为活动工作表时,还可以通过

ActiveSheet 属性引用之。

第 2 页

4、单元格: Cells 、ActiveCell 、Range、Areas

Cells(row,column) 代表单个单元格,其中 row 为行号, column 为列

号。如可以用 Cells(1,1) 、Cells(10,4) 来引用\"A1\"、\"D10\"单元格。

ActiveCell 代表活动工作表的活动单元格,或指定工作表的活动单元格。

Range代表工作表中的某一单元格、某一行、某一列、某一选定区域 (该选定区域可包含

一个或若干连续单元格区域)或者某一三维区域。

可用 Range(arg) 来引用单元格或单元格区域, 其中 arg 可为单元格号、 单元格号范围、单元格区域名称。如 Range(\"A5\") 、 Range(\"A1:H8\") 、 Range(\"Criteria\")。虽然可用

Range(\"A1\")返回单元格 A1,但用 Cells 更方便,因为此时可用变量指定行和列。

可将 Range与 Cells 结合起来使用,女口 Range(Cells(1,1),Cells(10,10)) 代表单元格区域

\"A1:J10\" ;而 expression.Cells(row,column) 返回单元格 区域中的一部分,其中 expression

是返回 Range的表达式,row 和column 为相对于该区域的左上角偏移量。 如由

Range(\"C5:C10\").Cells(1,1) 引用 单元格 C5。

Areas 为选定区域内的连续单元格块的集合,其成员是

Range 对象。

而其中的每个Range对象代表选定区域内与其它部分相分离的一个连续单 元格块。某些操作不能在选定区域内的多个单元格块上同时执行;必须在 选定区域内的单元格块数 Areas.Count 上循环,对每个单独的单元格块分 别执行该操作。此时,可用 Areas(index)从集合中返回单个

Range对象,

其中 index 为单元格块编号;如 Areas(1) 。

5、 行与列: Rows、Columns、Row、 Column Rows Columns分别代表活动工作表、单元格区域范围

工作表中的所有行数、列数。对于一个多选单元格区域范围

Range指定 Range的Rows

第 3 页

Colum ns,只返回该范围中第一个区域的行数、列数。例如,如果

对象有两个区域(areas)A1:B2和C3:D4, Rows.Count返回2而不是4。

Range

可通过Rows(行号)、Columns(列号)来引用相应的行与列;女口 Rows(3)、 Columns(4)分别对应第三行、 D列。

利用Rows Column可以获得区域中第一块的第一行行号、第一列列号, 所得值均以十进制数表示。

三) 、处理单元格

1、直接赋值与引用 将变量、常量值直接赋给单元格、或将单元格的值直接赋给变量、常 量,

这是在 Excel 中最简单的单元格赋值及引用方法。如下例将工作表 \"Sheet1\"A1 单元格的值赋给 Integer 变量 I ,并将 I+1 的值赋给当前工作 表中的 B1 单元格:

Dim I As Integer

I=Worksheets(\"Sheet1\").Cells(1,1)

Cells(1,2).Select ' 选定 B1 单元格,使其成为当前单元格 ActiveCell=I+1 ' 以 I+1 为当前单元格赋值

2、用公式赋值 在宏的使用中,可能会更多地用公式来给单元格赋值。如下例将相对 于活

动单元格左侧第 4 列、向上第 6 行至向上第 2行的单元格数值之和赋 给活动单元格(以本行、本列为第 0 行、 0列):

ActiveCell.Formula=\"=AVERAGE(R[-6]C[-4]:R[-2]C[-4])\"

3、引用其它工作表中的单元格 当赋值公式中需要引用其它工作表中的单元格时,在被引用的单

元格 前加上 \"工作表名! \" 即可。如以下即在赋值中引用了 \"Sheet1\" 工作表中的

A1至A4单元格:

第 4 页

Range(\"E10\").Formula=\"=SUM(Sheet1!R1C1:R4C1)\" 但需注意的是:当被引用的工

作表名中含有某些可能引起公式歧义的 字符时,需要用单引号 ' 将工作表名括起来。如:

Worksheets(\"Sheet1\").ActiveCell.Formula=\"=Max('1-1 '!D3:D5)\"

4、引用其它工作簿中的单元格

剖面

在被引用单元格所在工作表名前加上 \"[ 工作簿名 ]\" ,即可引用其它工 作簿中的单元格。如: ActiveCell.Formula=\"=MAX([Book1.xls]Sheet3!R1C:RC[4])\" 同样需注意的是:当被引用的工作簿名中含有某些可能引起公式歧义的字 符时,需要用中括号 \"[\" 、 \"]\" 及单引号 ' 将工作簿名括起来。如:

Cells(1,2).Formula=\"=MIN('[1995-2000 $A$1:$A$6)\"

总结 .xls]1995-1996 年'!

5、避免循环引用 在上述公式赋值过程中,应避免在公式中引用被赋值的单元格,防止 循

环引用错误。

6、添加批注

可按如下方法格给单元格添加批注:

Dim 批注文本 As String

批注文本 =\"批注示例 \" ' 准备批注文本

ActiveCell.AddComment ' 添加批注

ActiveCellment.Text Text:= 临时 ' 写入批注文本 ActiveCellment.Visible=False ' 隐藏批注 7、添加、删除、复制、剪切、粘贴单元格

Range(\"D10\").lnsert Shift:=xlToRight '

第 5 页

在 D10单元格处添加一新

单元格,原D10格右移

Range(\"C2\").lnsert Shift:=xlDown '

格,原C2格下移

在 C2 单元格处添加一新单元

Rows(2).EntireRow.lnsert ' 在第 2 行前添加一空白行,原第 2行下

第 6 页

Columns(3).EntireColumn.lnsert '

右移

在 C列前添加一空白列,原 C列

Columns(\"A:D\").Delete Shift:=xlToLeft '

侧列左移

删除 A列至 D列,其右

Rows(\"3:5\").Delete Shift:=xlUp ' 删除第 3 行至第 5 行,其下方行 上移 Range(\"B2\").EntireRow.Delete ' 删除第 2 行 Range(\"C4\").EntireColumn.Delete ' 删除 C 列 Range(\"B10:C13\").Copy ' 复制 B10 至 C13单元格区域 Cells(1,2).Cut ' 剪切 B1 单元格 Range(\"D10\").Select

ActiveSheet.Paste ' 自 D10 单元格起粘贴剪贴板中的内容

四 ) 、图表

1 、工作表图表

以下为一添加工作表图表的实例

Charts.Add after:=Worksheets(\"Sheet1\") '

添加新图表工作表

在 \"Sheet1\" 工作表之后

ActiveChart.ChartType=xlXYScatterSmooth

散点图

图表类型为XY平滑线

ActiveChart.SetSourceData Source:=Sheets(\" 结点坐标 \").Range(\"A1:B69\"), PlotBy:= _

xlColumns '图表数据来源于\"结点坐标\"工作表的A1至B69单元格,

第 7 页

且按列绘图。

ActiveChart.Location Where:=xlLocationAsNewSheet With ActiveChart

.HasTitle = True

.ChartTitle.Characters.Text = \"

坐标\"

节点坐标 \" ' 图表标题 \" 节点

.Axes(xlCategory, xlPrimary).HasTitle = True

.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text =

\"x\" 'x 轴标题 \"x\"

.Axes(xlValue, xlPrimary).HasTitle = True

.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = \"y\"

'y 轴标题 \"y\"

With ActiveChart.Axes(xlCategory)

.HasMajorGridlines = True ' 为

显示

显示 x 轴主网格线,默认情况下

.HasMinorGridlines = True ' 为

不显示

显示 x 轴次网格线,默认情况下

End With

With ActiveChart.Axes(xlValue)

.HasMajorGridlines = True ' End With

标出 x 轴主网格值,默认情况下

第 8 页

为标注

第 9 页

.HasMinorGridlines = False 取消 x 轴次网格值标注,默认情

况下为不标注

End With

ActiveChart.Legend.Position = xlRight ' 2、嵌入式图表

嵌入式图表仅在添加方式及引用格式上与工作表图表有所不同,而对 图表的设置基本类似。详见下例。

图例显示在图表右侧

Set 嵌入表 =ActiveSheet.ChartObjects.Add(0,0,200,300) ' 在当前 工作表 (0,0) 坐标

处添加宽 200,高 300 的嵌入式图表

嵌入表 .Chart.ChartType = xlColumnClustered ' 图表类型为簇状柱 形图 嵌入表 .Chart.SetSourceData Source:=Sheets(1).Range(\"A2:B2\"),

PlotBy:=xlRows ' 设置图表数据来源

With 嵌入表 .Chart

.HasTitle = False '

无图表标题

无 x 轴标

.Axes(xlCategory, xlPrimary).HasTitle = False '

.Axes(xlValue, xlPrimary).HasTitle = False ' End With

五) 、工作表

无 y 轴标题

1、添加

Sheets.Add before:=Sheets(1) '

在第 1 工作表前添加新工作表

在最后工作表后添加新

Sheets.Add after:=Sheets(Sheets.Count)

第 10 页

工作表

2、移动

ActiveSheet.Move before:=Sheets(2) '

作表之前

将当前工作表移动至第 2 工

3、命名

ActiveSheet.Name=\" 工作表名 \" ' 将当前工作表命名为 \" 工作表名 \" 4、删除

可以用以下语句删除当前工作表。

ActiveSheet.Delete

但在删除前 Excel 会自动弹出提示框, 需在用户确认后方可执行删除。 为避免这一干扰,可以先用以下语句关闭 Excel 的警告提示。

Application.DisplayAlerts = False

在删除完成后,再重新打开 Excel 的警告提示

Application.DisplayAlerts = True

六) 、工作簿

Excel 的宏对工作簿的操作主要为保存。 Dim 存盘文件名 As String

ActiveWorkbook.Save ' 保存当前工作簿

存盘文件名 =\" 工作表名 \"

ActiveWorkbook.SaveAs Filename:= 存盘文件名 ' 当前工作簿另存 为\" 工作表

名 .xls\"

第 11 页

开目录下。而若此存盘文件已存在,也可用关闭

在另存时,若指定的存盘文件名不包含路径,则保存在该工作簿的打

Excel 警告提示的方法以

Dim a

、用过VB的人都应该知道如何声明变量,在

完全一样的! 使用 Dim 语句

' 声明VBA A 中声明变量和为整形变量 VB中是

Dim a

明 A 为变体变量

'声

Dim a as string Dim a,b,c as currency

免其自动弹出提示框。

' 声明 A 为字符串变量 ' 声明 A,b,c 为货币变量

Long、 Currency 、 Single 、

Byte 、

声明变量可以是:

Double 、 Decimal String * length

象类型。 强制声明变量

当前不支持)、 Date 、 String (只限变长字符串)、 定长字符串)、 Object 、 Variant 、用户定义类型或对

Option Explicit

说明:该语句必在任何过程之前出现在模块中。 声明常数,用来代替文字值。

Const

第 12 页

' 常数的默认状态是 Private Const My = 456

第 13 页

' 声明 Public 常数。

Public Const MyString = \"HELP\" ' 声明 Private Integer 常数。

Private Const MyInt As Integer = 5 ' 在同一行里声明多个常数。 Const MyStr = \"Hello\

在EXCEL9冲,有一个十分好的功能,他就是把鼠标放置在

一个有效数据单元格中,执行该段代码,你就可以将连在一起的一片数据 全部选中。只要将该段代码加入到你的模块中 Sub My_Select

Selection.CurrentRegion.Select End sub 删除当前单元格中数据的前后空格。 sub my_trim Trim(ActiveCell.Value) end sub 使单

元格位移 sub my_offset

当前单元格向左移动一格 当前单元格向右移动一格

ActiveCell.Offset(0, 1).Select' ActiveCell.Offset(0, -1).Select' ActiveCell.Offset(1 , ActiveCell.Offset(-1 end sub

0).Select' 当前单元格向下移动一格 , 0).Select'

当前单元格向上移动一格

如果上述程序产生错误那是因为单元格不能移动,为了解除上述错误,我 们可以往

sub my_offset 之下加一段代码 on error resume next 注意以下代码都不再添加 sub “代码名

称” 和 end sub 请自己添加 ! 给当前单元格赋值:

ActiveCell.Value = \" 你好!!! \" 给特定单元格加入一段代码 :

例如:在Al单元格中插入 \"HELLO \"

Range(\"a1\").value=\"hello\"

又如:你现在的工作簿在 sheetl上,你要往sheet2的Al单元格中插入 \"HELLO \"

第 14 页

1.sheets(\"sheet2\").select range(\"a1\").value=\"hello\"

或 2.Sheets(\"sheet1\").Range(\"a1\").Value = \"hello\" 说明:

1. sheet2被打幵,然后在将“ HELLO放入到 A1单元格中。 2. sheet2不被打幵,将“ HELLO放入到 A1单元格中。 隐藏工作表 '隐藏SHEET这张工作表

sheets(\"sheet1\").Visible=False

显示SHEET这张工作表

sheets(\"sheet1\").Visible=True

有时候我们想把所有的 EXCE冲的SHEET都打印预览,请使用该段代码, 它将在你现有的工作簿中循环,直到最后一个工作簿结束循环预览。

Dim my As Worksheet For Each my In Worksheets my.PrintPreview

Next my 得到当前单元格的地址 msgbox ActiveCell.Address 得到当前日期及时间 msgbox date & chr(13) & time 保护工作簿 ActiveSheet.Protect

取消保护工作簿

ActiveSheet.Unprotect

给当前工作簿改名为 \"liu\"

ActiveSheet.Name = \"liu\"

打开一个应用程序

第 15 页

AppActivate (Shell(\"C:\\WINDOWS\\CALC.EXE\")) 增加一个工作簿 Worksheets.Add

删除当前工作簿 activesheet.delete 打开一个文件

Workbooks.Open FileName:=\"C:\\My Documents\\Book2.xls\" 关闭当前工作簿

ActiveWindow.Close 当前单元格定为:左对齐 Selection.HorizontalAlignment = xlLeft 当

前单元格定为:中心对齐 Selection.HorizontalAlignment = xlCenter 当前单元格定为:右对齐

Selection.HorizontalAlignment = xlRight 当前单元格为百分号风格 Selection.Style = \"Percent\" 当前单元格字体为粗体 Selection.Font.Bold = True 当前单元格字体为斜体

Selection.Font.Italic = True 当前单元格字体为宋体 20 号字 With Selection.Font .Name = \"

宋体 \" .Size = 20

End With With 语句 With 对象

. 描述

End With 让你的机器发出响声 BEEP

清除单元格中所有文字、批注、格式、所有的东西! ActiveCell.Clear 测试选择状态的单元格的行数

MsgBox Selection.Rows.Count 测试选择状态的单元格的列数

MsgBox Selection.Columns.Count 测试选择状态的单元格的地址 Selection.Address 让所有

第 16 页

的错误不再发生

ON ERROR RESUME NEXT 产生错误时让错误转到另一个地方 on error goto l 'code l: 'code

删除一个文件 kill \"c:\\1.txt\" 定制自己的状态栏

Application.StatusBar = \"

恢复自己的状态栏

现在时刻 : \" & Time

Application.StatusBar = false 在运行期执行一个宏 Application.Run macro:=\"text\"

滚动窗口到 a1 的位置

ActiveWindow.ScrollRow = 1 ActiveWindow.ScrollColumn = 1

定制系统日期

Dim MyDate, MyDay MyDate = #12/12/69# MyDay = Day(MyDate)

今天的年限

Dim MyDate, MyYear MyDate = Date

MyYear = Year(MyDate)

第 17 页

MsgBox MyYear

产生一个 inputbox< 输入框 >

InputBox (\"Enter number of months to add\")

得到一个文件名:

Dim kk As String kk = Application.GetOpenFilename(\"EXCEL (*.XLS), *.XLS\

提示:请打幵一个 EXCEL文件:\")

msgbox kk

打开 zoom 显示比例对话框

Application.Dialogs(xlDialogZoom).Show

激活字体对话框

Application.Dialogs(xlDialogActiveCellFont).Show

打开另存对话框

Dim kk As String

kk = Application.GetSaveAsFilename(\"excel (*.xls), *.xls\")

Workbooks.Open kk 此段代码寻找字符串中特定字符的位置, 需要建立一个窗体, 并在窗体中,

放入 TEXTB0X1,TEXTB0X2 TEXTB0X3(:个文本框)及 COMMANDBUTTON1( 钮)

Private Sub CommandButton1_Click() a = TextBox1.Text b = TextBox2.Text aa = Len(a) i = 1

Dim YY As String

第 18 页

If b = \"\" Then Exit Sub Do

If InStr(i, a, b, vbTextCompare) = 0 Then Exit Do kk = InStr(i, a, b, vbTextCompare) YY = YY & CStr(kk) & \"/\" i = kk + 1

Loop While aa >= i TextBox3.Text = YY End Sub

ActiveX 控件在 Excel97 中的运用

Excel97 在工作表或图表上可使用 ActiveX 控件,根据我使用 的体会,在工作上处

理控件时,必须注意和了解如下事 项:

( 一) 用

Excel5.0/95 工作簿文件格式保存 Excel97 工作簿时,将选择 ActiveX 控 件信息。当用户通过双

击鼠标来编辑内嵌在其它应用程序文档中的 Excel97 工作簿时,该工作簿上的控件将不会正常工作。如果用户是通过 用右键单击工作簿,然后选中快捷菜单上的“打开”命令来编辑工作簿的 话,工作簿上的控件就能正常工作了。

( 二)当 ActiveX 控件处于激活状态时,将禁用某些 MicrosoftExcelVisualBasic 方

法和属性。例如,当某一控件激活时,就 不能使用 Sort 方法,故下述按钮单击事件处理过程中的代码将失败 ( 因为 用户单击按钮后,该按钮就处于激活状态 ) 。

PrivateSubCommandButton1 Click Range(〃 a1:a10

) SortKey1:=Range( “ aT)

EndSub 解决办法是通过选激活工作表上其它元素的方法来绕过这种 问题。例如,

第 19 页

可用下列代码对单元格区域排序:

PrivateSubCommandButton1 Click Range(〃 aT ) Activate Range(〃 a1:a10

) SortKey1:=Range( \" aT)

CommandButton1 Activate End Sub

( 三) 在 MicrosoftExcel 中,用 OLEObjects 集合中的 OLEObject 对象代表

ActiveX 控件。如果要用编程的方式向工作表添加 ActiveX 控件, 可用 OLEObjects 集合的 Add

方法。例如向第一张工作表添加命令按钮。

Worksheets(l) OLEObjects Add Forms CommandButton 1〃,

Left:=10,Top:=10,Height:=20,Width:=100

因为 ActiveX 控件也可用 OLEObjects 集合中的 OLEObject 对 象代表,所以也

可用该集合中的对象来设置控件的属性。例如要设置控件 “CommandBotton”1 的“左边位置”属性。

Worksheets。)OLEObjects( “ CommandButton1 ) Left=10 那些不属于

OLEObject 对象属性的控件属性, 可通过由 Object 属性返回的实际控件对象来设置。例如要设

置控件“

CommandButton”1 的 标题。

Worksheets(l) OLEObjects( \" CommandButton1 ) Object Caption二\"runm6‘

因为所有的OLE对象也是Shapes集合的成员,所以也可用该

集合设置若干控件的属性。例如要对齐第一张工作表上所有控件的左边 框。

第 20 页

ForEachsInWorksheets(1) Shapes

Ifs Type=msoOLEControlObjectThens Left=10 Next

请注意,当在控件所在工作表的类模块之外使用控件的名称 时,必须用工作表的名

称限定该控件的名称。在工作表上 ActiveX 控件的 事件处理过程中,Me关键字所指向的是工作表,而非控件

在Excel中利用VBA创建多级选单

Excel 是我们常用的报表处理软件之一,对于大多数人来说只是使用它进 行打印报表,没有注意其

他功能,其实利用 Excel 内嵌的 VBA 语言完全 可以快速开发出自己企业的应用系统来,而且应用系统界面与其它专业编

程语言相当相似。下面笔者简单通过一个实例说明如何利用 选单。

首先,我们对 Excel 中两个重要的内置函数 auto_open() 和 auto_close() 作一简单说明。

VBA创建多级

auto_open() :在打开工作簿时系统将自动执行该函数,因此我们可以在

该函数中调用自己应用程序的选单函数以及其它需要初始化设置的函数 及宏语句;

第 21 页

auto_close() :在关闭工作簿时系统将自动执行该函数。所以我们需要在 该函数中放置删除用户自

定义选单语句,否则只有退出 Excel 才能恢复

EXCE啲系统选单。

在以下语句中,我们定义了选单设置函数

OpenMyMenu(),用于设置多级

II

II

II

选单,其他有关说明见程序内注释,详细代码如下:

Sub Ope nM yMe nu()'自定义多级选单函数 On Error Resume Next '忽略错误

Men uBars(\"MyMe nu\").Delete '删除自定义选单 MenuBars.Add (\"MyMenu\")'自定义选单项 Sheets(\"sheet1\").Select

MenuBars(\"MyMenu\").Menus.Add Caption:=\" 金融 \"

'增加第一个选单项“金融”

'以下三句为在“金融”选单下增加“银行法、货币和条例”三项选 单项

MenuBars(\"MyMenu\").Menus(

II

金融

).MenuItems.Add Caption:=

MenuBars(\"MyMenu\").Menus( II

金融

).MenuItems.Add Caption:=

\银行法 \"

MenuBars(\"MyMenu\").Menus(

II

金融

).MenuItems.Add Caption:=

策\

货币 \"

OnAction:=\" 条例 \"

第 22 页

II

银行法

II

货币政

II

条例 \

'以下为创建如图所示的多级选单

MenuBars(\"MyMenu\").Menus.Add Caption:=\" 经济\" ' 建立选单项“经济”

第 23 页

MenuBars(\"MyMenu\").Menus( ).MenuItems.Add Caption:=

II

经济

II II

农业 \

'以下三句为在“经济”选单下增加“农业、工业和第三产业”三项选单

MenuBars(\"MyMenu\").Menus( OnAction:=\" 农业 \"

II

经济

II

).MenuItems.Add Caption:=

II

工业\"

).Menultems.AddMenu Caption:=\" MenuBars(\"MyMenu\").Menus( 第

OnAction:=\" 工业\"

II

经济

II

三产业 \"

'以下三句为在“第三产业”选单下增加“概况、范畴”二项选单项和

MenuBars(\"MyMenu\").Menus(

II

经济\").Me nultems(\" 概况 \

第三产业

第三产业

概况\" \").Menultems.Add Caption:=\" MenuBars(\"MyMenu\").Menus(

II

经济\").Me nultems(\" 范畴 \

范畴 \" \").Menultems.Add Caption:=\" MenuBars(\"MyMenu\").Menus(

饮食服务业”子选单

II

经济\").Me nultems(\" 第三产业

'以下二句为在“饮食服务业”选单下增加“酒店

1、酒店 2”二项选单

\").Menultems.AddMenu Caption:=\" 饮食服务业 \"

MenuBars(\"MyMenu\").Menus(\"经济\").Menultems(\"

第三产业

第 24 页

\").Menultems(\" 饮食服务业 \").Menultems.Add Caption:=\" 酒店 1\OnAction:=\" 酒店 1\"

MenuBars(\"MyMenu\").Menus(\"经济\").Menultems(\"第三产业 \").MenuItems(\" 饮食服务业 \").MenuItems.Add Caption:=\" OnAction:=\" 酒店 2\"

Men uBars(\"MyMe nu\").Activate '激活自定义选单 End Sub

Sub auto_ope n()'系统自动打幵运行宏 OpenMyMenU调用用户选单函数 End Sub

Sub auto_close()'系统自动关闭运行宏 On Error Resume Next '忽略错误

MenuBars(\"MyMe nu\").Delete '删除自定义选单 End Sub

读者可以在自己的工作簿选单“工具”中的“宏”下,创建以上三个函数 并将以上函数语句拷贝到其中即可运行。

酒店 2\

66、.用VBA编程)保护Excel文档

VBA(Visual Basic for Application

)是 Excel 应用程序中功能非

常强大的编程语言,为了规范不同的用户对 Excel 应用程序的访问能力, 需要对 Excel 文档及有关的数据进行有效的保护, 这里根据自己及同行 们的体会,从以下二个方面介绍用 法实现对Excel文档的保护。 对工作簿的保护

VBA编程

第 25 页

1.利用VBA中Workbook对象的SaveAs方法实现对工作簿的保护,

就对SaveAs有 关的参量作一介绍:

下面

Filename :该字符串表示要保存的文件名。 可包含完整路径。 如果不指 定路径, Microsoft Excel

将文件保存到当前文件夹

FileFormat : 可选,文件的保存格式。

Password :为一个区分大小写的字符串(不超过 15 个字符) ,用于指 定文件的保护密码。 WriteResPassword : 该字符串表示文件的写保护密码。 如果文件保存时 带有密码,但打开文

件时不输入密码,则该文件以只读模式打开。

Read On lyRecomme nded:如果为True则在打幵文件时显示一条信息,提 示该文件以只读模

式打开。

下例就是在 Excel 应用程序中添加一工作簿,将工作簿按常规文件格式存 为“ C:

经济评价.xls ”文件,并给该文件指定保护密码“ 12”以

及写保护密码“ 23”。

Sub 保护工作簿()

NewWorkbook = Workbooks.add

经济评价 .xls\

FileFormat: =

XlNormal,Password:=\"12\“ 23〃 End sub

2.利用VBA中Workbook对象的Protect方法对工作簿的结构和窗口进行

保护,Workbook对象的Protect方法带有以下三个参量:

Password: 为加在工作表或工作簿上区分大小写的密码字符串。 如果省 略本参数,不用密码就可

第 26 页

以取消对该工作簿的保护。否则,取消对该工作 表或工作簿的保护时必须提供该密码。如果忘记了密码,就无法取消对该

工作表或工作簿的保护。最好在安全的 地方保存一份密码及其对应文档 名的列表。

Structure : 若为 True 则保护工作簿结构 (工作簿中工作表的相对位置) 。 默认值为 False 。 Windows 若为 True 则保护工作簿窗口。

下例就是对一名为“经济评价 .xls ”的工作簿实现“结构”和“窗口” 保护:

Sub 保护工作簿()

Workbooks (〃经济评价〃) =True,

Windows:=True End sub

Workbook对象的Un protect方法用于取消对工作簿的保护。

法只有一个参量,就是保护工作表时所用的口令。

P rotect Password:二\"1234\

Un protect方

3. 对工作簿进行隐藏保护,可使他人无法看到其对应的窗口。操作方法如 下:

在VBA中使用 Workbook对象下面的 Windows对象的Visible 属性对工作 簿进行隐藏和取消隐藏, 种。

下面程序代码完成对工作簿“ book.xls ”的隐藏:

Visible 属性的值可取“ True”和“ False ”两

Sub 隐藏工作簿()

Workbooks(\"book\").Activate ActiveWindow.Visible = False End sub

第 27 页

或:

Sub 隐藏工作簿()

Workbooks(\"book\").Windows (1) .Visible=False End sub

对工作表的保护

1对工作表实现口令保护利用 VBA调用 Worksheet对象的Protect方法

对工作表进行保护, Protect 带有以下参量:

Password 用于保护工作表的口令。

Drawingobjects 若为 True ,则对工作表中的 Drawingobjects 对象进行保 护,缺省值为 True。

Contents 若为 True ,则对单元格内容进行保护,缺省值为

True 。

下面程序代码完成对工作表“基础数据表”的保护:

Sub 保护工作表()

Worksheets (〃基础数据表〃) Protect Password:二\"1234\"

End sub

2.对工作表实现隐藏保护,使他人无法看到工作表:

利用VBA设置 Worksheet对象的Visible 属性来隐藏工作表; Visible 属

性的值为以下三个值中的一个:

True 工作表为显示状态。 False 工作表为隐藏状态

XlVerHidden 工作表为隐藏状态,且用户不能通过“取消隐藏”对话框将 其改为显示状态。当Visible 的值为XIVerHidden时,只能利用VBA将其 重新设置为 True 。

第 28 页

Sub 隐藏工作表()

Worksheets(\" 基础数据表 \").Visible=False End sub

67、求: 将所选区域中的数值全部转化为

\"万元\"的最简代码 .

求: 将所选区域中的数值全部转化为 \"万元\"的最简代码 . 或能完成此功能的最便捷的命令操作 . 写了一个 , 抛砖引玉 :

Sub convt() Dim cel As Range Dim dec As Variant

Application.EnableEvents = False

yesorno = MsgBox(\" 确实将区域所有数值转换为“万 元”? \

vbYesNo + vbQuestion + vbDefaultButton1)

If yesorno = vbYes Then

1:

dec = Application.InputBox(\" 请输入小数位数 :\

Default:=0, Type:=1)

If dec = \"\" Then GoTo 1 End If

第 29 页

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:

设置进度条控件的最大值

设置进度条控件的最小值

Value :设置进度条控件对象的当前值

Min :

进度条的式样,即一格一格的进度条或是没有间隔的 Scrolling:

进度条 例子: Private Sub UserForm_Activate()

For i = 1 to 5000

ProgressBar1.Max = 5000 ‘设置进度条控件的最大值

第 30 页

ProgressBar1.Value = I ‘进度条控件对象的当前值 next

End Sub

在程序中加入进度条的办法是将 ProgressBar1.Max= 最大值, ProgressBar1.Value = 当前值放入循环中去。

69、Excel 是一个优秀的电子表格软件,如果你编的程序需要以报表的形

式显示最终结果,它会是个不错的选择。你可以通过

VB控制Excel显示

数据表格。如果你不愿意深入了解 Excel 这些琐碎的细节,也不是没有权 宜之计:你可以打幵Excel中的工具-宏-录制新宏, 结束后把所录的宏代码贴进你的

然后进行手工操作,

VB程序就行。这样得到的程序一般都能

正常运行,但其中的宏代码往往不够简洁,效率和可读性都不高。

Excel 编程碰到的第一个问题是表头。 有时表头的形式比较复杂, 需 要横向或纵向合并单

元格。请放心,只要没有斜杠, Excel 都能应付得了。

例如合并A2〜A5这4个单元格,你录制的宏代码会是这样:

Range(\"A2:A5\").Select With Selection

.HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .ShrinkToFit = False .MergeCells = False End With

第 31 页

Selection.Merge

而自己编程只要一句 Range.( “A2:A5”).mergecells=True 就可 以解决问题。 表头形式定了,再就是表头的内容。如果单元格中的文本长度超过 了列宽,往往只能显示

部分内容,行尾那一格的内容则会“越境”进入右 边那个空白单元格,很不美观。这个问题可以通过在程序中设置列宽加以 解决。

Columns(14).columnwidth=12 ‘设置第 14 列列宽为 12(缺省列宽 为 8.38 )

如果你不愿意劳神去逐列估计实际所需的列宽,干脆来一行

Columns(“ a:i ”).autofit

让 Excel 随机应变吧。

‘a 到 i 列自动调整列宽

但也许你不喜欢这种方法,认为表头撑大了列宽,弄得浏览一张小 表格还得向右滚动,太

不方便了。要是能保持默认列宽,让文本自动换行 就好了。没问题, 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 这样可以一次填入一个表的所有数据,够快了吧!不过提醒一

句,

第 32 页

Ran ge对象大小最好与数组匹配,小了无法显示所有数据,大了则会在空 白单元格只填入“ N/A”

表示没有取得数据。

如果需要在结果中显示多个同样规格的数据表,想在 加入循环变量,这也好办。

Range对象中

Dim cell11,cell2 Dim Data(3,4)

For I =1 to 40

..................‘数据处理

Set cell1=Worksheets(\"Sheet1\").Cells(5*I-4,1) Set cell2=Worksheets(\"Sheet1\").Cells(5*I-2,4) Worksheets(\"Sheet1\").Range(cell1,cell2).value=Data Next I

表格填完了,现在该打表格线了,以下几条语句可以满足你的要求: With

Worksheets(\"Sheet1\").Range(cell1,cell2).borders .LineStyle=xlContinuous .weight=xlThin End With

希望以上资料对你有所帮助,附励志名言 3 条:

1、上帝说:你要什么便取什么,但是要付出相当的代价。

2、目标的坚定是性格中最必要的力量源泉之一,也是成功的利器之一。 没有它,天才会在矛盾无

第 33 页

定的迷径中徒劳无功。

3、当你无法从一楼蹦到三楼时,不要忘记走楼梯。要记住伟大的成功往 往不是一蹴而就的,必须

学会分解你的目标,逐步实施。

第 34 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- huatuo0.cn 版权所有 湘ICP备2023017654号-2

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务