-
本示例为设置密码窗口
(1) If ox(
请输入密码:
密码正确时执行
Else: MsgBox
密码错误,即将退出!
此行与第
2
行共同设置密码
End If
本示例为设置密码窗口
(1) X
= MsgBox(
是否真的要结帐?
本示例为设置工
作表密码
t
Password:=641112 '
保护工作表并设置密码
ect
Password:=641112
'
撤消工作表保护并取消密码
'
本示例关闭除正在运行本示例的工作簿以外的其他所有工作簿,
并保存其更改内容
。
For
Each
w
In
Workbooks If Then SaveChanges:=True
End If Next w
'
每次打
开工作簿时,本示例都最大化
Microsoft Excel
窗口。
State =
xlMaximized '
本示例显示活动工作表的名称。
MsgBox
'
本示例保存当前活动工作簿的副本。
pyAs
下述过程
激活工作簿中的第四张工作表。
Sheets(4).Activate '
下述过程激活工作簿中的第
1
张工作表。
Worksheets(1).Activate '
本示例通过将
Saved
属性设为
True
来关闭包含本段代码的工作簿,并放弃对该工作簿的任何更改。
= True '
本示例对自动重新计算功能进行设置
,
使
Microsoft
Excel
不对第一张工作表自
动进行重新计算。
Worksheets(1).EnableCalculation = False
'
下述过程打开
C
盘上名为
MyFolder
的文件夹中的
工作簿。
(
本示例显示活动工作簿中工作表
sheet1
上单元格
A1
中的值。
MsgBox Worksheets(
本示例显示活动工
作簿中每个工作表的名称
For Each ws In Worksheets MsgBox Next ws
本示例向活动工作簿
添加新工作表
,
并设置该工作表的名称
? Set NewSheet =
=
Budget
本示例将新建的工作表移到工作簿的末尾
p>
'Private Sub Workbook_NewSheet(ByVal Sh
As
Object) After:=Sheets() End Sub
本示例将新建工作表移到工作簿的末尾
'Private
Sub
App_WorkbookNewSheet(ByVal
Wb
As
Workbook,
_
ByVal
Sh
As
Object)
After:=() End Sub
本示例新建一张工作
表,然后在第一列中列出活动工作
簿中的所有工作表的名称。
Set
NewSheet
=
(Type:=xlWorksheet)
For
i
=
1
To
(i,
1).Value
=
Sheets(i).Name
Next
i
本
示<
/p>
例
将
第
十
行
移
到
窗
口
的
最
上
面
?
Worksheets(
当计算工作簿中的任何工作表时,本
示例对第一张工作表的
A1:A100
区域进行排序
。
'Private
Sub
Workbook_SheetCalculate(ByVal
Sh
As
Object)
With Worksheets(1)
.Range(
本示例
显示工作表
Sheet1
的打印预览。
Worksheets(
本示例保存当前活动工作簿
?
本示例保存所有打开的工作簿,然后关闭
Microsoft
Excel
。
For Each w In
oks Next w
下例在活动工作簿的第一张工作
表前面添加
两
张
新
的
工
作
表
?
Count:=2,
Before:=Sheets(1)
本
示
例
设
置
15
秒
后
运
行
my_Procedure
过
程
p>
,
从
现
在
开
始
计
时
。
Now
+
TimeValue(
本
示
例
设
< br>置
my_Procedure
在
下
午
5
点
开
始<
/p>
运
行
。
TimeValue(
本
示
例
撤
< br>消
前
一
个
示
例
对
OnTime
的
设
< br>置
。
EarliestTime:=TimeValue(
_
Procedure:=
Schedule:=False
每当工作表
重新计算时,
本示例就
p>
调整
A
列到
F
列的宽
度。
'Private Sub
Worksheet_Calculate()
Columns(
本示例使活动工作簿中的计算仅使用显示的
1
数字精度。
ionAsDisplayed = True
本示例将工作表
Sheet1
上的
A1:G37
区
域剪下,并放入剪贴板。
Worksheets(
方法
计算所
有打开
的工作簿、工作簿中的一张特定的工作表或者工作表中指定区域的单元
格,如下表所示:
'
要计算
'
依
照本示例
所有打开的工作簿
' ate
(或只是
Calculate
)
指定工作表
'
计算指定
工作表
Sheet1
Worksheets (
指定区域
'Worksheets(1).Rows(2).Calculate
本
示例对自动重新计算功能进行设置,使
Microsoft
Excel
不对第一张工作表自动
进行重新计算。
Worksheets(1).EnableCalculation = False
本示例计算
Sheet1
已用区域中
A
列、
B
列和
C
列的公
式。
Worksheet
s(
本示例更新当前活动工作簿中的所
有链接
< br>? Link Name:=urces
本示例设置第一张工作表的
滚动区域
?
Worksheets(1).ScrollArea =
本示例新建一个工作簿,提
示用户输入文件名,然
后保存该工作簿。
Set
NewBook
=
Do
fName
=
eAsFilename
Loop
Until
fName
False
Filename:=fName
本示例打开
工作簿,
然后运行
Auto_Open
宏。
本示例对活动工作
簿运行
Auto_Close
宏,然后关闭该工作簿。
With
ActiveWorkbook
.RunAutoMacros
xlAutoClose
.Close
End
With
在本示例中,
Microsoft
Excel
向用户显示活动工作簿的路径和文件名称。
'Sub
UseCanonical()
Display the
full path to user. MsgBox meURLEncoded End Sub
p>
本示例显示
当前工作簿的路径及文件名(假定尚未保存此工作簿)<
/p>
。
MsgBox me
本示例关闭
,并放弃所有对此工作簿的更改。
W
orkbooks(
本
示例关闭所有打开的工作簿。如果某个打
开的工作簿有改变,
Microsoft Excel
将显
示询问是否保存更
改的对话框和相应提示。
本示例在打印之前对当前活动工作簿的所有工作表重新计算
?
'Private
Sub
Workbook_BeforePrint(Cancel
As
Boolean)
For
Each
wk
In
Worksheets
ate
Next
End
Sub
本示例对查询表一中的第一列数据进行汇总,
并在数据区域下方显示第
一列数据的总
和。
Set
c1
=
Sheets(
=
(xlDown).Offset(2,
0).Formula =
本示例取消活动工作簿中的所有更改
?
AllChanges
本示例在商业问题中使用规划求解函
数,以使总利润达到最大值。
SolverSave
函数
将当前问题保存到活动工作表上的某一区域。
Worksheets(
SolverReset
SolverOptions
Precision:=0.001
SolverOK
SetCell:=Range(
_
MaxMinVal:=1, _
ByChange:=Range(
FormulaText:=100
SolverAdd CellRef:=Range(
CellRef:=Range
(
_
Relation:=4
SolverSolve
UserFinish:=False
SolverSave
SaveArea:=Range(
本示例隐藏
Chart1
、
Chart3
和
Chart5
。
Charts(Array(
当激活工作表时,本示例对
A1:A10
区域进行排序。
'Private Sub
Worksheet_Activate() Range(
本
示
例
更
改
p>
Microsoft
Excel
链
接
。
Link
_
xlExcelLinks
本
示
例
启
用
受
保
护
的
工
作
表
上
的
自
动
筛
选
箭
头
?
AutoFilter
=
True
t
contents:=True,
userInterfaceOnly:=True
本
示
例
将
活
动
工
作
簿
设
为
只
读
?
FileAccess
Mode:=xlReadOnly
本示例使共享工作簿每三分钟自动更新一次
?
dateFrequency
=
3
下
述
Sub
过
程
清
除
活
动
工<
/p>
作
簿
中
Sheet1
上
的
< br>所
有
单
元
格
的
内
容
。
'Sub
ClearSheet()
Worksheets(
End
Sub
本
示
例
对
所
有<
/p>
工
作
簿
都
关
闭
滚
动
条
?
yScrollBars = False
如果具有密码保护的工作簿的文件属性没有加密,则本示例
设<
/p>
置
指
定
工
作
簿
的
密
码
加
密
选
项
。
'Sub
SetPasswordOptions()
With
ActiveWorkbook
If
.PasswordEncryptionProvider
RSA
SChannel
Cryptographic
Provider
Then
.SetPasswordEncryptionOptions
_
PasswordEncryptionProvider
:=
RSA
SChannel
2
Cryptographic
Provider
_
Passwor
dEncryptionAlgorithm:=
_
PasswordEncryptionKeyLength:=56, _
PasswordEncryptionFileProperties:=True End If End
With End
Sub
在本示例中,如果活动工作簿不能进行写保护,那么
Microsoft Excel
设置字符串
密码以作为活
动工作簿的写密码。
'Sub UseWritePassword() Dim strPassword As String
strPassword =
Set
password
to
a
string
if
allowed.
If
eserved
=
False
Then
assword = strPassword
End If End Sub
在本示例中,
Microsoft Excel
打开
名为
的工作簿,设置它的密码
,然后关闭该工作簿。本示例假定名为
的
文
件
位
于
C:/
驱
动
器
上
。
'Sub
UsePassword()
Dim
wkbOne
As
Workbook
Set
wkbOne
=
(
注意
Password
属性可读并返回
“********”。
End
Sub
本示例将
的当前窗口更改为显示公式。
Wor
kbooks(
本示例接受活动工作簿中的所有更改
?
AllChanges
本示例显示活动工作簿的路
径和名称
Sub UseCanonical() MsgBox
'
消息框
[b7] = me
'
当前工作簿
[b8] =
meURLEncoded
'
活动工作簿
End Sub
本示例显示
Microsoft Excel
启动文件夹
的完整路径。
MsgBox
pPath
本示例显示活动工作簿中每个工作表的名称。
For
Each
ws In Worksheets MsgBox
Next ws
本示例关闭除正在运行本示例的工作簿以外的其他所有工
作簿,并保存其更改内容。
For Each w In
Workbooks If Then
savechanges:=True
End If Next w Activate
事件
<
/p>
激活一个工作簿、工作表、图表或嵌入图表时产生
此事件。
当激活工作表时,本示例对
A1:A10
区域进行排序。
Private Sub
Worksheet_Activate()
Range(
K
ey1:=Range(
Order:=xlAscending
End
Sub
Calculate
事
件
对
于
Worksheet
对象,在对工作表进行重新计算之后产生此事件
每当工作表重新计算时,本示例就调整
A
列
到
F <
/p>
列
的
宽
度
。
Private
Sub
Worksheet_Calculate()
Columns(
End
Sub
BeforeDoubleClick
事件
应用于
Worksheet
对象的
Activate
方法。
当双击某工作表时产生此事件
,
此事件先于默认的双击操作。
Private Sub
expression_BeforeDoubleClick(ByVal Target As
Range,
Cancel As
Boolean)
expression
引用在类模块中带有事件声明的
Worksheet
类型对象的变量。
Target
必需。双击发生时最靠近鼠标指针的单元格。
Cancel
可选。当事件发生时为
False
。
如果事件过程将该
参数设为
True
,则该
过程执行完之后将不进行默认的双击操作。
BeforeRightClick
事件
应用于
Worksheet
对象的
Activate
方法。
当用鼠标右键单击某工作表时
产生此事件,此事件先于默认的右键
单击操作。
Private Sub expression_BeforeRightClick(ByVal
Target As Range, Cancel As Boolean)
expression
引用在类模块中带有事件声明的
Worksheet
类型对象的变量。
Target
必
需。右键单击发生
时最靠近鼠标指针的单元格。
Cancel
可选。
当事件发生时为
False<
/p>
。
如果该事件过程将本参数设为
True
,
则
该过程执行结束之后不进行默认的右键单击操作。
Change
事件
当用户更改工作
表中的单元格,或
外部链接引起单元格的更改时产生此事件。
Private Sub Worksheet_Change(ByVal Target As
Range)
Target
更改的区域。可以是多个单元格。
说明
重新计算引起的单元格更改不触发本事件。可使用
Calculate
事件俘获工作表重新
计算操作。
本示例将更改的单元格的颜色设为蓝色。
Private
Sub
Worksheet_Change(ByVal
Target
as
Range)
ndex
=
5
End
Sub Deactivate
事件
图
表、
工作表或工作簿从活动状态转为非活动状态时产生此事件。
Private
Sub
object_Deactivate()
object
Chart
、
Workbook
或者
Worksheet
。有关对
Chart
对象使用事件的详细
信息,请参阅
Chart
对象事件
的
用
法
。
p>
本
示
例
当
工
作
簿
转
为
非
活
< br>动
状
态
时
,
对
所
有
打
开
的
窗
口
p>
进
行
排
列
。
Private
Sub
Workbook_Deactivate() e
xlArrange End Sub FollowHyperlink
事件
当
单<
/p>
击
工
作
表
上
的
任
意
超
链
接
时
,
发
生
此
事
件
。
对
于
应
用
程
序<
/p>
级
或
工
作
簿
级
的
事
件
,
请
参
阅
SheetFollowHyperlink
事件。
Private Sub
Worksheet_FollowHyperlink(ByVal Target As
Hyperlink)
Target Hyperlink
类型,必需。一个代表超链接目标位置的
Hyperlink
对象。
本示例对在当前活动工
作簿中访问过的所有链接保留一个列表或历史记录。
Private
Sub Worksheet_FollowHyperlink(ByVal
3
Target As Hyperlink) With
UserForm1 .m s .Show End With End Sub
PivotTableUpdate
事
件
发
p>
生
在
工
作
簿
中
的
数
据
透
视
表
< br>更
新
之
后
。
Private
Sub
expression_PivotTableUpdate(ByVal
Target As PivotTable) expression
引用在类模块中带有事件声
明的
Worksheet
类型对象的变量。
Target
必需。选定的数据透视表。
本示例显
示一则消息,说明数据
透视表已经更新。
本示例假定您已在类模
块中声明了
带有事件的
Worksheet
类型的对象。
Private
Sub
Worksheet_PivotTableUpdate(ByVal Target
As PivotTable) MsgBox
been
updated.
事件
当工作表上的选定区域发生改变时,将产生本事件。
Private Sub
Worksheet_SelectionChange(ByVal Target As ) Target
新选定的区域。
本
< br>示例滚动工作簿窗口,
直至选定区域位于窗口的左上角。
Private
Sub
Worksheet_SelectionChange(ByVal
Target As Range) With ActiveWindow
.ScrollRow = .ScrollColumn = End
With
End
Sub
< br>本
示
例
显
示
活
动
工
作
簿
中
工
作
p>
表
sheet1
上
单
元
格
A1
中
的
值
。
MsgBox
< br>Worksheets(
本示例显示活动工作簿中每个工作表的名称。
For Each ws
In Worksheets MsgBox
Next ws
本示例向活动工作簿添加新工作表,并设置该工作表的名称。
Set newSheet = =
本示例关闭工作簿
,
但不提示用户保存所作更改。
中的所有
更改都不会保存。
yAlerts =
False Workbooks(
本示例设置保存文件时显<
/p>
示提示,要求用户输入汇总信息。
ForSummaryInfo = True
本示例显示
Microsoft
Excel
的完整路径。
Private Sub aa()
MsgBox
示例显
示每一个可用加载宏的路径及文件名。<
/p>
For Each a In AddIns MsgBox me Next a
ChDir
语句
改变当前的目录或文件夹。
ChDir path
在
Power Macintosh
中,默认驱动器总是改为在
path
语句中
指定的驱动器。完整
路径指定由卷标名开始,相对路径由冒号
(:)
开始
. ChDir
可以辨认路径中指定
的
别名
:
ChDir
'
在
Macintosh
中
本示例显示当前路径分隔符。
MsgBox
path
separator
character is
方法
将
一个指定的文件或文件夹从
一个地方移动到另一个地方。
语法
destination Move
方法语法有如下几部分:
部分
描
述
object
必需的。始终是一个
File
或
Folder
对象的名字。
destination
必需的。文件或文件夹要
移
动
到<
/p>
的
目
标
。
不
允
许
有
通
配
符
。
CreateFolder
方
法
创
p>
建
一
个
文
件
夹
。
语
法
Folder(foldername) reateFolder
方法有如下几部分:
部分
描述
object
必需的。始终
是一个
FileSystemObject
的名字。
foldername
必需的。字符串表达式,它标识创建的文件夹。
本示
例使用
MkDir
语句来创建目录或文件夹。如果没有指定驱动器,新目录或文件
夹将会建在当前驱动器
中。
MkDir
建立新的目录或文件夹。
Name
语句示例
本示例使用
Name
语句来更改文
件的
名称。
示例中假设所有使用到的目录或文件夹都
已存在。
在
Macintosh
中,
默认驱动器名称是
“HD”
并且路径部分由冒号取代
反斜线隔开。
Dim OldName, NewName
OldName =
定义文件名。
Name OldName As NewName '
更改文件名。
OldName =
NewName =
更改文件名,并移动文件。
本示例显
示当前默认文件路径。
MsgBox
current
default
file
path
is
&
_
tFilePath
本示例设置替换启动文件夹。
rtupPath =
方法
如果指定的文件夹存在返回
True
,不存在返回
False
。
语法
Exists(folderspec)
本示
例在单元格中启用编辑。
rectlyInCell = True
程序说明:
<
/p>
几种用
VBA
在单元格
< br>输入数据的方法:
Public
Sub
Writes()
1--
2
方法,最简单在
]
中输入单元格名称。
1
[A1]
=
100
'
在
A1
单元格输入
100
。
2
[A2:A4] = 10 '
在
A2:A4
单元格输入
10
。
3--
4
方法,采用
Range(
,
中输入单元格名称。
3
Range(
在
B1
单元格输入<
/p>
200
。
4
Range(
在
C1:C3
单元格
输入
300
。
5-- 6
方法,采用
Cells(Row,Column)
,
Row
是单元格行数,
Column
是单元
格栏数。
5
Cells(1, 4) = 400 '
在
D1
单元格输入
400
。
6 Range(Cells(1, 5), Cells(5, 5)) = 50
'
在
E1:E 5
单元格输入
50
。
End Sub
你点选任何单元格,按
Selection
按钮,則则所点选的单元格均
4
会被输入文字
。
Public Sub Selection1() =
在任何你点选的单元
格输入文字
。
End Sub VBALesson2
程序说明:
几种如何把别的工作表
Sheet4
数据,读到这
个工作表的方法:在被读取的单元格
前加上工作表名称
Sheet4
。
Public Sub Writes()
1-- 2
方法,
最简单在被读取的
]
前加上被读取的工作表名称
Sheet4
。
1
[A1]
=
Sheet4.[A1]
'
把
Sheet4
A1
单
元格的数据,
读到
A1
单元格。
2
[A2:A4]
=
Sheet4.[B1]
''
把
Shee4
工作表单元格
B1
数据,
读到
A2:A4
单元格。
3--
4
方法,在被读取的工作表
Range(
的
Range
前加上被读取的工作表名称
Sheet4
。
3
Range(
把
Shee4
工作表单元格
B1
数据,读
到
B1
单元格。
4
Range(
=
(
'
把
Shee4
工作表单元格
C1
数据
,读到
C1:C3
单元格。
5--
6
方法,
在被读取的工作表
Cells(Row,Column)
,
Cells
前加上被读取工作表
名称
Sheet4
。
5
Cells(1,
4)
=
(1,
4)
'
把
Shee4
工作表单元格
D1
数据,读
到
D1
单元格。
6
Range(Cells(1,
5),
Cells(5,
5))
=
(1,
5)
'
把
Shee4
工
作表单元格
E1
数据,读到
E1:E
5
单元格。
End
Sub
你点选任何单元格,
按
Selection
按钮,
则所点选的单元格均会被输入
Shee4
工
作表单元格
F1
数据。
Public Sub
Selection1() = Sheet4.[F1]
'
把
Shee4
工作表单元格
F1
数据,读到任
何你点选的单元格。
End Sub
VBALesson3
程序说明:
如何利用
Worksheet_SelectionChange
输入数
据的方法。
Private
Sub Worksheet_SelectionChange(ByVal Target As
Range) Target = 100 End Sub
Target
指的是你鼠标所选的单元格,
Worksheet_Selectio
nChange()
事件的参数
。
可以是一个也可以
是好几个单元格。
Range
是
Excel
特有的变量形态,叫范围。
Target As Rang
是把
Target
这个参数
设定为
Range
变量形态。
Target
=
100
是把你点选的单元格输入数字
100
。
VBALesson4
程序说明:
如
何
利
用
Worksheet_SelectionChange
在<
/p>
限
定
的
单
元
格
输
入
数
据
的
方
法
。
Private
Sub
Worksheet_SelectionChange(ByVal Target
As Range) If >= 2 And = 2 Then
Target
=
100
End
If
End
Sub If
...
Then
...
End
If
这是我们学的这一个逻辑判断语句。
>=
2
,指的是鼠标选定的单元格的
行大于或等于
2
。
= 2
,指的是鼠标选定的单元格的栏等
于
2
。
If
>=
2
And
=
2
Then
指的是只有在
>= 2
及
= 2
二个条件成立时。
就是
( >= 2)
为
True
及
( = 2)
为
True
时,才执行下面
的
程序
Target=100
,
也就是
B
栏第二行及以下行用鼠标
被点选时,才会被输入
100
,
其它单
元格则不
被
输
入
数
据
p>
。
VBALesson5
程
序
说
明
:
比
较
Worksheet_SelectionChange()
与
用
按
钮
CommandButton1_Click()
来执行
程序二者的方法与写法有何不同。
Worksheet_Se
lectionChange()
事
件
Private
Sub
Worksheet_SelectionChange(ByVal
Target
As
Range)
If
>=
2
And
= 2 Then
Target = 100 End If End Sub
按鈕
CommandButton1_Click()
Private Sub
CommandButton1_Click() If
>= 2 And >= 3 Then ActiveCell = 100
End
If
End
Sub
二者执行方法最大的地方,在于
Worksheet_SelectionChange()
是自动的,你不用
了
解他是怎么完成工作的。
按钮
CommandButton1_Click()
是人工的,
比
SelectionChange()
多一道手续,
就
是
要
去
按
那
接
钮
,
程
序
才
会
执
行
。
SelectionChange()
有
一
个
参
数
Target
可
用
< br>;
CommandButton1_Click
()
没有。
所以我们要用
ActiveCell
内定函数来取代
Target
,
Ac
tiveCell
与
Target
最大的
不同点他只能指定一个单元格。
就是
你选取多个单元格也只有最上面的单元格会加上数
据;用
Selection
取代
ActiveCell
,
用法就跟
Target
一样了。
VBALesson 6
程序说明:
完整的
If...Then ┅
End 逻辑判断式。
Private Sub
Worksheet_SelectionChange(ByVal Target As Range)
If
>=
2
And
=
2
Then
Target
=
200
ElseIf
>=
2
And
= 3 Then
Target = 300 ElseIf
>= 2
And =
2 Then
Target
= 400
Else Target
= 500 End If End Sub
这是个完整的
If
逻辑判断式,意思是说,假如
If
後的判断式条件成立的话,
就
执行第二条程序,否则假如
ElseIf
後的判断式条件成立的话,就执行第四条程序
,否则假如另一
个
ElseIf
後的判断式条件成立的话,就执行第六条程序。
Else <
/p>
的意思是说,假如以上条件都不成立的
话,就执行第八条程序。<
/p>
他的执行方式是假如
IF
的条件成立的话,就不执行其它
ElseIf
及
Else
的逻
辑判断式,假如
If
後的条件不成立的话才会执行
ElseIf
或
Else
逻辑判断式。第二
个
ElseIf
後的
5
条件因为与
IF
後的条件一样,所以这个判断式後面的
Target=400
将是永远无法执行到的程序。
VBALesson
7
程序说明∶我们为什麽要用变数。
Private
Sub
Worksheet_SelectionChange(ByVal
Target
As Range) Dim i , j
As Integer Dim k As Range i = j = Set k = Target
If i >= 2 And j = 2 Then k = 200 ElseIf
i >= 2 And j = 3 Then k = 300 ElseIf i >= 2 And j
= 4
Then k = 400 Else k = 500 End If
End Sub
跟
VBALesson 6
比较,程序是不是明朗多了,在前课重复
的用
,
及
Ta
rget
来写程序是不是有一点烦。用变量的第一个好处大家马上
感
觉得出来,就是可以简化程序。
使用变量前,你得先宣告变量。宣告变量的方法是在
后面
写上变量
后面接上变量的形态
。
Dim i , j As Integer
就是宣告
i
与
j
为整
数变量,这是同时宣告二个变量
i
与
j
所以要在二个变量间加个
,
号。
Dim
k
As
Range
是宣告
k
为范围资料形态,
Range
这是
Excel
特有的资料形态
。
i =
是把当前单元格的行数,指定
给变量
i
。
j =
是把当前单元格的栏数,指定给变量
j
。
Set k = Target
是把当前的
单元格,
指定给变量
k
。
用像
i
与
j
这样简单的变量,
在程序的前面你可能还记得
i
或
j
代表着
什
厶。程序写长了,你可能忘记
i
或
j
代表着什厶。所以最好的方法是用比较有
意义的代号,来为变量
命名如
iRow
或
iCol
来取代
i
及
j
。
VBALesson 8
程序说明∶体会一下
Workshe
et_Change()
事件。
Private
Sub
Worksheet_Change(ByVal
Target
As
Range)
Dim
iRow,
iCol
As
Integer
iRow
=
iCol = If
iRow >= 2 And iCol = 2 And Target
False
Cells(iRow,
iCol
+
1)
=
Cells(iRow,
iCol)
*
2
Events
=
True
ElseIf
iRow
>=
2 And
iCol = 2 And Target =
End
If
End Sub
前几个教程都是用
Worksheet_SelectionChange
事件来举例子,大家应该能体会他
是
怎厶一回事了吧。
这个教程就是要让你来体会什厶是
Worksheet_Chang()
事件。
因为这二个事件在
VBA
都
是非常有用的,
所以一定要了解。
简单的说,
前者是你鼠标移动到那个单元格,<
/p>
就触发那个事件的执行。
後者是要等到
你点选的单元格,
数
有了改变才会触发
事件的执行。
二者执行的时机一前一後。
Target
p>
是代表限定当前的单元格要是有数
的,才会
执行以下三行的程序。
Cells(iRow, iCol + 1) =
Cells(iRow, iCol) *
2
,是你在
B
栏输入数
时,
C
栏将可得到
B
栏二倍的数
。
Target = <
/p>
是
限定当前的单元格要是没有数
的,才会
执行以下一行的程序。
Cells(iRow,
iCol
+
1)
=
,是把
C
栏
的数
清成空格。
Events
=
False
与
Events
=
True
,这是
< br>个
成双的程序,当你用了前者记得在执行其他程序後要写上後面的程序。它的目的
在
抑制事件连锁执行。
简单的说就是,在
B
字段所触发的事件,不愿在其它单元格再
触发另一个
Worksheet_Change()
事件。
VBALesson
9
程
序
说
明
p>
∶
体
会
一
下
Worksheet_Change()
事<
/p>
件
连
锁
反
应
。
Private
Sub
Worksheet_Change(ByVal
Target
As
Range)
Dim
iRow
As
Integer
iRow
=
Events
=
False
Cells(iRow,
3)
=
Cells(iRow,
3)
+
Cells(iRow,
2)
Events = True End Sub
Private Sub Worksheet_Change(ByVal Target As
Range)
Dim
iRow
As
Integer
iRow
=
'Events
=
False
Cells(iRow,
3)
=
Cells(iRow, 3) + Cells(iRow, 2) 'Events
= True End Sub
这个程序的目的是要
在
B2
输入新的数
时,
C2
会将
B2
输入的新数
加上
C2
原
有的数
呈现在
C2
上。
照上面有加上
Events =
False
程序执行当然没问题。
现在你在
Events =
False
与
Events
= True
前加上
「
'
」
看看。
程序前加上
「
'
」
的目的是要使
「
'
」
之后的文字变成说明文字,
程序执行时是会跳<
/p>
过说明文字,
不执行说明文字的内容。
程序前加上
「
'
」
符号后,文字会变成绿色。
执行第二个程序时,你将发现
C2
不会按你所要求的,呈现结果。
这就是所
谓的事件连锁反应。
请问这个宏该如何写
!
我想运行一个
宏
,
就能在当前工作表
B3
上填上一条公式
;
这
条公
式的结果是所有工作
表上的
B4
p>
单元格的和
.
请问这个宏该如何写
.
谢谢
! Sub gg() Dim sh
As
Worksheet, shname$$ For Each sh In
Worksheets shname = (
(
中怎样创建
一
个名为“table”的新工作表
通过
VBA
编程,很容易添加新的工作表,但是新表的名字不知
怎样控制,对
6
于新创建
的工作表,
由于其名字并非特定,
所以就不好使用所创建的新表了。
不知各位有何高
见。
。
。
。
=
p>
请教:如何用
VBA
检索表
1
中
A
列与表
2
,
3
,
4
,
5.....
中
A
列相同的行并把后者整行拷
< br>贝到表
1
检索到的行中
,
谢谢!!!!
To
yxptwq∶用这程序试看看。
Sub
Copy1()
Dim Row_dn1,
Row_dnN, i, j, n As Integer Row_dn1 =
(
n = 1 For Each wSheet In eets With
wSheet If .Name
= .Range(
(i,
1) Then .Rows(j &
Row_dn1 + n) n = n +
1 End If Next j Next i End If End With Next wSheet
End Sub
如果要用
VBA
程
式输入密码使用下列程式码
Sub EnterNewPW() '
程式说明
:
利用
SendKe
y
输入
VBAProject
密码
p>
'
注意
事项
:<
/p>
执行本程式需要在
Excel
视窗
,
不能在
VBE
视窗
ys
True
'Alt
+
F11
切
换
到
VBA
视
窗
ys
True
'ALT
+
T
工
具
(
繁
体
中
p>
文
是
(T))
ys
工具
(T)-VBprojec
t
属性
(E) ys
'TAB
p>
键
(
切换到
PAg
e2
保护页面
) ys
选取
Checkbox
方块
(
锁定专案以
供检
视
) '({+}
选取
, {-}
取消选取
) ys
键
(
跳到第一次输
入密码
Textbox myPW =
假设密码
chijanzen ys myPW, True
'
输入
密
码
ys
True
'TAB
键
(
跳
到
第
二
次
输
入
密
码
p>
Textbox
ys myPW, True
'
输入密码
ys
按确定钮
(
预
设值
) ys <
/p>
返回
Excel
视窗
End Sub
冒泡排序法:
冒泡排序法之
所以成为“冒泡排序”是因为值较小的或是较轻的元素浮到作为继续排
序的一组数的顶部。
Sub
Macro1() Dim i As Integer Dim j As
Integer Dim t as integer Static number(1 To 10) As
Integer
For i = 1 To 10 number(i) =
inputbox“输入要排序的数:” Next i For i = 10To 2 Step
-1 For j
= 1 To i
–
1
‘下面进行位置交换
If number(j) > number(j + 1)
Then t = number(j + 1) number(j
+ 1) =
number(j) number(j) = t End If Next j Next i For
i = 1 To 20 Print number(i) Next i
End
sub
首先定义一个数组:通过循环录入
10
个整数,然后用一个二重循环测试前一个数是否
大于后
一个数。
如果大于则交换两个数的下标,
即交换两个数在数组中的位置,
交换
通过一个变量来进行。
我
先用传统的方法解决这个问题,经过比较,选用了较为简单的和高效的排序方法
< br>
——“快速排序”,具
体算法可参考数据结构等有关书
籍。对所有数据排序后再合
并相同数据,合并程序较为简便,
我开始时
采用了这种方法,但后来发现对于这些
的数据,先合并后排序速度更快,因为有大量相同的数据。合并
是采用“标记
”算
法,具体如下:
(设数据已存放
在
sData()
数组中
,结果存到
Queryp()
数组,
Amount
是数据个数)
'
把相同元素置
0 For i = 1 To
Amount If sData(i) 0 Then For j = i
+
1 To Amount
If
sData(i)
=
sData(j)
Then
sData(j)
=
0
Next
j
End
If
Next
i
'
删除相同元素
Queryp(1)
=
sData(1)
k = 1
For i = 2 To Amount If Not (sData(i) = 0) Then k =
k
+
1 Queryp(k) = sData(i)
End If Next
i kMax = k ReDim Preserve
Queryp(kMax)
虽然这样使得运算速度有所高,但是仍然要进行大量的循环
运算,占据了程序大部
分的运算时间。于是我一直在寻觅一种更为高效的算法。
p>
功夫不负有心人,在仔
细分析数据的特征,比较了多种方案之后,我
终于找到了一
种相当成功的算法,原来要
3
到
4
秒的运算
< br>缩短到仅需
0.1
到
0.2
p>
秒。
我遇到的数据具有以下特征:①相同
数据很多,②最大、最小数之间相差不
到
3
,
③都是带两位小数的正数。
针对数据的特征,我采用了以下算法:
针对数据的特征,我采用了以
下算法:
步骤:
1
.
用一个循环找出整数和小数部分的最大、最小值。小数部分的最大、最小值乘
以
100
转为整数。<
/p>
2
.
定义一
个二维数组,下标范围分别是整数和小数部分的最小值到最大值。
3
.
再用
一
个循环把所有源数据填入刚才定义的二维数组,填写规则是,源数据的
整数和小数部分分别对应二维
数组的两个下标。例如,“13.51
4
.
最后顺向或逆向
读取二维数组中的非零数
据即可得到从小到大或从大到小排列
的数据,而且不会含有重复数据。
用
VB
编写的程序如下:
'
**
**密集型数据处理****
Dim i As Long, j As Long, k As Long, kMax As Long
Dim Queryp() As
Single ReDim
Queryp(Amount) Dim IntegerPart As Integer,
DecimalPart As Integer Dim IPmax As
7