Professional Documents
Culture Documents
本示例为设置密码窗口 (1)
If Application.InputBox("请输入密码:") = 1234 Then
[A1] = 1 '密码正确时执行
Else: MsgBox "密码错误,即将退出!" '此行与第 2 行共同设置密
码
End If
本示例为设置密码窗口 (1)
X = MsgBox("是否真的要结帐?", vbYesNo)
If X = vbYes Then
Close
本示例为设置工作表密码
ActiveSheet.Protect Password:=641112 ' 保护工作表并设置密码
ActiveSheet.Unprotect Password:=641112 '撤消工作表保护并取消
密码
'本示例关闭除正在运行本示例的工作簿以外的其他所有工作簿,
并保存其更改内容
。
For Each w In Workbooks
If w.Name ThisWorkbook.Name Then
w.Close SaveChanges:=True
End If
Next w
'本示例显示活动工作表的名称。
MsgBox "The name of the active sheet is " & ActiveSheet.Name
'本示例保存当前活动工作簿的副本。
ActiveWorkbook.SaveCopyAs "C:\TEMP\XXXX.XLS"
'下述过程激活工作簿中的第四张工作表。
Sheets(4).Activate
Word 联盟 – http://www.wordlm.com
'下述过程激活工作簿中的第 1 张工作表。
Worksheets(1).Activate
工作簿的任何更改。
ThisWorkbook.Saved = True
ThisWorkbook.Close
动进行重新计算。
Worksheets(1).EnableCalculation = False
本示例显示活动工作簿中每个工作表的名称
For Each ws In Worksheets
MsgBox ws.Name
Next ws
本示例向活动工作簿添加新工作表 , 并设置该工作表的名称?
Set NewSheet = Worksheets.Add
NewSheet.Name = "current Budget"
本示例将新建的工作表移到工作簿的末尾
'Private Sub Workbook_NewSheet(ByVal Sh As Object)
Sh.Move After:=Sheets(Sheets.Count)
End Sub
本示例将新建工作表移到工作簿的末尾
'Private Sub App_WorkbookNewSheet(ByVal Wb As Workbook, _
ByVal Sh As Object)
Sh.Move After:=Wb.Sheets(Wb.Sheets.Count)
End Sub
Word 联盟 – http://www.wordlm.com
本示例新建一张工作表,然后在第一列中列出活动工作簿中的所
有工作表的名称。
Set NewSheet = Sheets.Add(Type:=xlWorksheet)
For i = 1 To Sheets.Count
NewSheet.Cells(i, 1).Value = Sheets(i).Name
Next i
本示例将第十行移到窗口的最上面?
Worksheets("Sheet1").Activate
ActiveWindow.ScrollRow = 10
当计算工作簿中的任何工作表时,本示例对第一张工作表的
A1:A100 区域进行排序
。
'Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
With Worksheets(1)
.Range("a1:a100").Sort Key1:=.Range("a1")
End With
End Sub
本示例显示工作表 Sheet1 的打印预览。
Worksheets("Sheet1").PrintPreview
本示例保存当前活动工作簿?
ActiveWorkbook.Save
下例在活动工作簿的第一张工作表前面添加两张新的工作表?
Worksheets.Add Count:=2, Before:=Sheets(1)
Word 联盟 – http://www.wordlm.com
本示例撤消前一个示例对 OnTime 的设置。
Application.OnTime EarliestTime:=TimeValue("17:00:00"), _
Procedure:="my_Procedure", Schedule:=False
每当工作表重新计算时,本示例就调整 A 列到 F 列的宽度。
'Private Sub Worksheet_Calculate()
Columns("A:F").AutoFit
End Sub
本示例使活动工作簿中的计算仅使用显示的数字精度。
ActiveWorkbook.PrecisionAsDisplayed = True
Worksheets("Sheet1").Range("A1:G37").Cut
Calculate 方法
计算所有打开的工作簿、工作簿中的一张特定的工作表或者工作
表中指定区域的单元
格,如下表所示:
'要计算 '依照本示例
所有打开的工作簿 ' Application.Calculate (或只是 Calculate
)
指定工作表 '计算指定工作表 Sheet1 Worksheets
("Sheet1").Calculate
指定区域 'Worksheets(1).Rows(2).Calculate
进行重新计算。
Worksheets(1).EnableCalculation = False
本示例更新当前活动工作簿中的所有链接?
ActiveWorkbook.UpdateLink Name:=ActiveWorkbook.LinkSources
本示例设置第一张工作表的滚动区域?
Word 联盟 – http://www.wordlm.com
Worksheets(1).ScrollArea = "a1:f10"
本示例新建一个工作簿,提示用户输入文件名,然后保存该工作
簿。
Set NewBook = Workbooks.Add
Do
fName = Application.GetSaveAsFilename
Loop Until fName False
NewBook.SaveAs Filename:=fName
本示例显示当前工作簿的路径及文件名(假定尚未保存此工作
簿)。
MsgBox ActiveWorkbook.FullName
本示例关闭 Book1.xls,并放弃所有对此工作簿的更改。
Workbooks("BOOK1.XLS").Close SaveChanges:=False
本示例关闭所有打开的工作簿。如果某个打开的工作簿有改变,
Microsoft Excel
将显示询问是否保存更改的对话框和相应提示。
Workbooks.Close
本示例在打印之前对当前活动工作簿的所有工作表重新计算?
'Private Sub Workbook_BeforePrint(Cancel As Boolean)
For Each wk In Worksheets
wk.Calculate
Word 联盟 – http://www.wordlm.com
Next
End Sub
本示例对查询表一中的第一列数据进行汇总,并在数据区域下方
显示第一列数据的总
和。
Set c1 = Sheets("sheet1").QueryTables(1).ResultRange.Columns(1)
c1.Name = "Column1"
c1.End(xlDown).Offset(2, 0).Formula = "=sum(Column1)"
本示例取消活动工作簿中的所有更改?
ActiveWorkbook.RejectAllChanges
本示例在商业问题中使用规划求解函数,以使总利润达到最大值。
SolverSave 函数
将当前问题保存到活动工作表上的某一区域。
Worksheets("Sheet1").Activate
SolverReset
SolverOptions Precision:=0.001
SolverOK SetCell:=Range("TotalProfit"), _
MaxMinVal:=1, _
ByChange:=Range("C4:E6")
SolverAdd CellRef:=Range("F4:F6"), _
Relation:=1, _
FormulaText:=100
SolverAdd CellRef:=Range("C4:E6"), _
Relation:=3, _
FormulaText:=0
SolverAdd CellRef:=Range("C4:E6"), _
Relation:=4
SolverSolve UserFinish:=False
SolverSave SaveArea:=Range("A33")
Word 联盟 – http://www.wordlm.com
ActiveWorkbook.ChangeLink "c:\excel\book1.xls", _
"c:\excel\book2.xls", xlExcelLinks
本示例启用受保护的工作表上的自动筛选箭头?
ActiveSheet.EnableAutoFilter = True
ActiveSheet.Protect contents:=True, userInterfaceOnly:=True
本示例将活动工作簿设为只读?
ActiveWorkbook.ChangeFileAccess Mode:=xlReadOnly
本示例使共享工作簿每三分钟自动更新一次?
ActiveWorkbook.AutoUpdateFrequency = 3
'Sub ClearSheet()
Worksheets("Sheet1").Cells.ClearContents
End Sub
本示例对所有工作簿都关闭滚动条?
Application.DisplayScrollBars = False
如果具有密码保护的工作簿的文件属性没有加密,则本示例设置
指定工作簿的密码加
密选项。
'Sub SetPasswordOptions()
With ActiveWorkbook
If .PasswordEncryptionProvider "Microsoft RSA SChannel
Cryptographic Provider", _
PasswordEncryptionAlgorithm:="RC4", _
PasswordEncryptionKeyLength:=56, _
PasswordEncryptionFileProperties:=True
End If
End With
End Sub
在本示例中,如果活动工作簿不能进行写保护,那么 Microsoft
Excel 设置字符串
Word 联盟 – http://www.wordlm.com
密码以作为活动工作簿的写密码。
'Sub UseWritePassword()
Dim strPassword As String
strPassword = "secret"
' Set password to a string if allowed.
If ActiveWorkbook.WriteReserved = False Then
ActiveWorkbook.WritePassword = strPassword
End If
End Sub
wkbOne.Password = "secret"
wkbOne.Close
'注意 Password 属性可读并返回 “********”。
End Sub
'本示例接受活动工作簿中的所有更改?
ActiveWorkbook.AcceptAllChanges
本示例显示活动工作簿的路径和名称
Sub UseCanonical()
MsgBox '消息框
[b7] = ActiveWorkbook.FullName '当前工作簿
[b8] = ActiveWorkbook.FullNameURLEncoded '活动工作簿
End Sub
Word 联盟 – http://www.wordlm.com
本示例显示活动工作簿中每个工作表的名称。
For Each ws In Worksheets
MsgBox ws.Name
Next ws
本示例关闭除正在运行本示例的工作簿以外的其他所有工作簿,
并保存其更改内容。
For Each w In Workbooks
If w.Name ThisWorkbook.Name Then
w.Close savechanges:=True
End If
Next w
Activate 事件
激活一个工作簿、工作表、图表或嵌入图表时产生此事件。
当激活工作表时,本示例对 A1:A10 区域进行排序。
Private Sub Worksheet_Activate()
Range("a1:a10").Sort Key1:=Range("a1"), Order:=xlAscending
End Sub
Calculate 事件
对于 Worksheet 对象,在对工作表进行重新计算之后产生此事件
每当工作表重新计算时,本示例就调整 A 列到 F 列的宽度。
Private Sub Worksheet_Calculate()
Columns("A:F").AutoFit
End Sub
BeforeDoubleClick 事件
应用于 Worksheet 对象的 Activate 方法。
当双击某工作表时产生此事件,此事件先于默认的双击操作。
Private Sub expression_BeforeDoubleClick(ByVal Target As Range,
Cancel
As Boolean)
expression 引用在类模块中带有事件声明的 Worksheet 类型对象
的变量。
Target 必需。双击发生时最靠近鼠标指针的单元格。
Cancel 可选。当事件发生时为 False。如果事件过程将该参数设为
True,则该
过程执行完之后将不进行默认的双击操作。
Word 联盟 – http://www.wordlm.com
BeforeRightClick 事件
应用于 Worksheet 对象的 Activate 方法。
当用鼠标右键单击某工作表时产生此事件,此事件先于默认的右
键单击操作。
Private Sub expression_BeforeRightClick(ByVal Target As Range,
Cancel
As Boolean)
expression 引用在类模块中带有事件声明的 Worksheet 类型对象
的变量。
Target 必需。右键单击发生时最靠近鼠标指针的单元格。
Cancel 可选。当事件发生时为 False。如果该事件过程将本参数设
为 True,则
该过程执行结束之后不进行默认的右键单击操作。
Change 事件
当用户更改工作表中的单元格,或外部链接引起单元格的更改时
产生此事件。
Private Sub Worksheet_Change(ByVal Target As Range)
Target 更改的区域。可以是多个单元格。
说明
重新计算引起的单元格更改不触发本事件。可使用 Calculate 事件
俘获工作表重新
计算操作。
本示例将更改的单元格的颜色设为蓝色。
Private Sub Worksheet_Change(ByVal Target as Range)
Target.Font.ColorIndex = 5
End Sub
Deactivate 事件
图表、工作表或工作簿从活动状态转为非活动状态时产生此事件。
Word 联盟 – http://www.wordlm.com
End Sub
FollowHyperlink 事件
当单击工作表上的任意超链接时,发生此事件。对于应用程序级
或工作簿级的事件,
PivotTableUpdate 事件
发生在工作簿中的数据透视表更新之后。
Private Sub expression_PivotTableUpdate(ByVal Target As
PivotTable)
expression 引用在类模块中带有事件声明的 Worksheet 类型对象
的变量。
Target 必需。选定的数据透视表。
本示例显示一则消息,说明数据透视表已经更新。本示例假定您
已在类模块中声明了
SelectionChange 事件
当工作表上的选定区域发生改变时,将产生本事件。
Private Sub Worksheet_SelectionChange(ByVal Target As
Excel.Range)
Target 新选定的区域。
本示例滚动工作簿窗口,直至选定区域位于窗口的左上角。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Word 联盟 – http://www.wordlm.com
With ActiveWindow
.ScrollRow = Target.Row
.ScrollColumn = Target.Column
End With
End Sub
本示例显示活动工作簿中每个工作表的名称。
For Each ws In Worksheets
MsgBox ws.Name
Next ws
本示例向活动工作簿添加新工作表,并设置该工作表的名称。
Set newSheet = Worksheets.Add
newSheet.Name = "current Budget"
本示例关闭工作簿 Book1.xls,但不提示用户保存所作更改 。
Book1.xls 中的所有
更改都不会保存。
Application.DisplayAlerts = False
Workbooks("BOOK1.XLS").Close
Application.DisplayAlerts = True
本示例设置保存文件时显示提示,要求用户输入汇总信息。
Application.PromptForSummaryInfo = True
示例显示每一个可用加载宏的路径及文件名。
For Each a In AddIns
MsgBox a.FullName
Next a
ChDir 语句
改变当前的目录或文件夹。
ChDir path
在 Power Macintosh 中,默认驱动器总是改为在 path 语句中指定
的驱动器。完整
Word 联盟 – http://www.wordlm.com
路径指定由卷标名开始,相对路径由冒号 (:) 开始. ChDir 可以辨
认路径中指定的
别名:
ChDir "MacDrive:Tmp" ' 在 Macintosh 中
本示例显示当前路径分隔符。
MsgBox "The path separator character is " & _
Application.PathSeparator
Move 方法
将一个指定的文件或文件夹从一个地方移动到另一个地方。
语法
object.Move destination
Move 方法语法有如下几部分:
部分 描述
object 必需的。始终是一个 File 或 Folder 对象的名字。
destination 必需的。文件或文件夹要移动到的目标。不允许有通配
符。
CreateFolder 方法
创建一个文件夹。
语法
object.CreateFolder(foldername)
reateFolder 方法有如下几部分:
部分 描述
object 必需的。始终是一个 FileSystemObject 的名字。
foldername 必需的。字符串表达式,它标识创建的文件夹。
夹将会建在当前驱动器中。
MkDir "MYDIR" ' 建立新的目录或文件夹。
Name 语句示例
本示例使用 Name 语句来更改文件的名称。示例中假设所有使用
到的目录或文件夹都
反斜线隔开。
Word 联盟 – http://www.wordlm.com
Dim OldName, NewName
OldName = "OLDFILE": NewName = "NEWFILE" ' 定义文件名。
Name OldName As NewName ' 更改文件名。
OldName = "C:\MYDIR\OLDFILE": NewName =
"C:\YOURDIR\NEWFILE"
Name OldName As NewName ' 更改文件名,并移动文件。
本示例显示当前默认文件路径。
MsgBox "The current default file path is " & _
Application.DefaultFilePath
本示例设置替换启动文件夹。
Application.AltStartupPath = "C:\EXCEL\MACROS"
FolderExists 方法
如果指定的文件夹存在返回 True,不存在返回 False。
语法
object.FolderExists(folderspec)
本示例在单元格中启用编辑。
Application.EditDirectlyInCell = True
程序说明:
几种用 VBA 在单元格输入数据的方法:
Public Sub Writes()
1-- 2 方法,最简单在 "[ ]" 中输入单元格名称。
1 [A1] = 100 '在 A1 单元格输入 100。
2 [A2:A4] = 10 '在 A2:A4 单元格输入 10。
3-- 4 方法,采用 Range(" "), " " 中输入单元格名称。
3 Range("B1") = 200 '在 B1 单元格输入 200。
4 Range("C1:C3") = 300 '在 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
"Test"。
Public Sub Selection1()
Selection.Value = "Test" '在任何你点选的单元格输入文字 "Test"。
Word 联盟 – http://www.wordlm.com
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("B1") = Sheet4.Range("B1") ''把 Shee4 工作表单元格 B1
数据,读
到 B1 单元格。
4 Range("C1:C3") = Sheet4.Range("C1") '把 Shee4 工作表单元格
C1 数据
名称 Sheet4。
5 Cells(1, 4) = Sheet4.Cells(1, 4) '把 Shee4 工作表单元格 D1 数据,
读
到 D1 单元格。
6 Range(Cells(1, 5), Cells(5, 5)) = Sheet4.Cells(1, 5) '把 Shee4 工
Word 联盟 – http://www.wordlm.com
作表单元格 F1 数据。
Public Sub Selection1()
Selection.Value = Sheet4.[F1] '把 Shee4 工作表单元格 F1 数据,
读到任
何你点选的单元格。
End Sub
VBALesson3 程序说明:
如何利用 Worksheet_SelectionChange 输入数据的方法。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Target = 100
End Sub
Target 指的是你鼠标所选的单元格,Worksheet_SelectionChange()
事件的参数
。
可以是一个也可以是好几个单元格。
Range 是 Excel 特有的变量形态,叫范围。
Target As Rang 是把 Target 这个参数设定为 Range 变量形态。
Target = 100 是把你点选的单元格输入数字 100。
VBALesson4 程序说明:
如何利用 Worksheet_SelectionChange 在限定的单元格输入数据的
方法。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row >= 2 And Target.Column = 2 Then
Target = 100
End If
End Sub
2 及 Target.Column = 2 二个条件成立时。
就是 (Target.Row >= 2) 为 True 及(Target.Column = 2)为 True 时,
才执行下面的
程序 Target=100,
Word 联盟 – http://www.wordlm.com
也就是 B 栏第二行及以下行用鼠标被点选时,才会被输入 100,
其它单元格则不被输
入数据。
VBALesson5 程序说明:
比较 Worksheet_SelectionChange() 与用按钮
CommandButton1_Click() 来执行
程序二者的方法与写法有何不同。
Worksheet_SelectionChange()事件
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row >= 2 And Target.Column = 2 Then
Target = 100
End If
End Sub
按鈕 CommandButton1_Click()
Private Sub CommandButton1_Click()
If ActiveCell.Row >= 2 And ActiveCell.Column >= 3 Then
ActiveCell = 100
End If
End Sub
二者执行方法最大的地方,在于 Worksheet_SelectionChange() 是
自动的,你不用
了解他是怎么完成工作的。
按钮 CommandButton1_Click() 是人工的,比 SelectionChange()
多一道手续,
就是要去按那接钮,程序才会执行。
SelectionChange() 有一个参数 Target 可用;
CommandButton1_Click ()没有。
所以我们要用 ActiveCell 内定函数来取代 Target,ActiveCell 与
Target 最大的
不同点他只能指定一个单元格。
就是你选取多个单元格也只有最上面的单元格会加上数据;用
Selection 取代
VBALesson 6 程序说明:
Word 联盟 – http://www.wordlm.com
完整的 If...Then ┅ End 逻辑判断式。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Row >= 2 And Target.Column = 2 Then
Target = 200
ElseIf Target.Row >= 2 And Target.Column = 3 Then
Target = 300
ElseIf Target.Row >= 2 And Target.Column = 2 Then
Target = 400
Else
Target = 500
End If
End Sub
将是永远无法执行到的程序。
VBALesson 7 程序说明∶我们为什麽要用变数。
Word 联盟 – http://www.wordlm.com
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 比较,程序是不是明朗多了,在前课重复的用
Target.Row,
觉得出来,就是可以简化程序。
使用变量前,你得先宣告变量。宣告变量的方法是在 "Dim " 后面
写上变量 " i
。
i = Target.Row 是把当前单元格的行数,指定给变量 i。
j = Target.Column 是把当前单元格的栏数,指定给变量 j。
Set k = Target 是把当前的单元格,指定给变量 k。
用像 i 与 j 这样简单的变量,在程序的前面你可能还记得 i 或 j
代表着
什厶。程序写长了,你可能忘记 i 或 j 代表着什厶。所以最好的方
法是用比较有
Word 联盟 – http://www.wordlm.com
iCol = Target.Column
If iRow >= 2 And iCol = 2 And Target "" Then
Application.EnableEvents = False
Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2
Application.EnableEvents = True
ElseIf iRow >= 2 And iCol = 2 And Target = "" Then
Cells(iRow, iCol + 1) = ""
Else
Cells(iRow, iCol + 1) = ""
End If
End Sub
是怎厶一回事了吧。
这个教程就是要让你来体会什厶是 Worksheet_Chang()事件。因为
这二个事件在 VBA
都是非常有用的,所以一定要了解。
简单的说,前者是你鼠标移动到那个单元格,就触发那个事件的
执行。後者是要等到
你点选的单元格,数有了改变才会触发事件的执行。二者执行的
时机一前一後。
Target "" 是代表限定当前的单元格要是有数的,才会执行以下三
行的程序。
Cells(iRow, iCol + 1) = Cells(iRow, iCol) * 2,是你在 B 栏输入数
时,C
栏将可得到 B 栏二倍的数。
个成双的程序,当你用了前者记得在执行其他程序後要写上後面
的程序。它的目的在
Word 联盟 – http://www.wordlm.com
抑制事件连锁执行。简单的说就是,在 B 字段所触发的事件,不
愿在其它单元格再
触发另一个 Worksheet_Change()事件。
新数加上 C2 原
有的数呈现在 C2 上。
照上面有加上 Application.EnableEvents = False 程序执行当然没
问题。
现在你在 Application.EnableEvents = False 与
Application.EnableEvents =
过说明文字,不执行说明文字的内容。
程序前加上「 '」符号后,文字会变成绿色。
执行第二个程序时,你将发现 C2 不会按你所要求的,呈现结果。
Word 联盟 – http://www.wordlm.com
这就是所谓的事件连锁反应。
请问这个宏该如何写!
我想运行一个宏,就能在当前工作表 B3 上填上一条公式;这条公式
的结果是所有工作
表上的 B4 单元格的和.请问这个宏该如何写.谢谢!
Sub gg()
Dim sh As Worksheet, shname$
For Each sh In Worksheets
shname = sh.Name
ActiveSheet.Range("b3").value = ActiveSheet.Range("b3").value +
Worksheets(shname).Range("b4")
Next
End Sub
VBA 中怎样创建一个名为“table”的新工作表
通过 VBA 编程,很容易添加新的工作表,但是新表的名字不知
怎样控制,对于新创建
的工作表,由于其名字并非特定,所以就不好使用所创建的新表
了。不知各位有何高
见。。。。
Sheets.Add
ActiveSheet.Name = "table"
贝到表 1 检索到的行中,谢谢!!!!
To yxptwq∶用这程序试看看。
Sub Copy1()
Dim Row_dn1, Row_dnN, i, j, n As Integer
Row_dn1 = Sheet1.Range("A65536").End(xlUp).Row
k = 1: n = 1
For Each wSheet In ActiveWorkbook.Worksheets
With wSheet
If .Name "Sheet1" Then
Row_dnN = .Range("A65536").End(xlUp).Row
For i = 2 To Row_dn1
For j = 2 To Row_dnN
If .Cells(j, 1) = Sheet1.Cells(i, 1) Then
Word 联盟 – http://www.wordlm.com
.Rows(j & ":" & j).Copy Destination:=Sheet1.Rows(Row_dn1 +
Sub EnterNewPW()
'程式说明:利用 SendKey 输入 VBAProject 密码
'注意事项:执行本程式需要在 Excel 视窗,不能在 VBE 视窗
Application.SendKeys "%{F11}", True 'Alt + F11 切换到 VBA 视窗
视)
'({+} 选取, {-} 取消选取)
Application.SendKeys "{TAB}", True 'TAB 键(跳到第一次输入密
码
Textbox
myPW = "chijanzen" '假设密码 chijanzen
Application.SendKeys myPW, True '输入密码
Application.SendKeys "{TAB}", True 'TAB 键(跳到第二次输入密
码
Textbox
Application.SendKeys myPW, True '输入密码
Application.SendKeys "{ENTER}", True '按确定钮(预设值)
Application.SendKeys "%{F11}", True '返回 Excel 视窗
End Sub
冒泡排序法:
Word 联盟 – http://www.wordlm.com
冒泡排序法之所以成为“冒泡排序”是因为值较小的或是较轻的
元素浮到作为继续排
序的一组数的顶部。
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
Next j
Next i
For i = 1 To 20
Print number(i)
Next i
End sub
首先定义一个数组:通过循环录入 10 个整数,然后用一个二重
循环测试前一个数是否
大于后一个数。如果大于则交换两个数的下标,即交换两个数在
数组中的位置,交换
通过一个变量来进行。
我先用传统的方法解决这个问题,经过比较,选用了较为简单的
和高效的排序方法
——“快速排序”,具体算法可参考数据结构等有关书籍。对所有
数据排序后再合
并相同数据,合并程序较为简便,我开始时采用了这种方法,但
后来发现对于这些
Word 联盟 – http://www.wordlm.com
的数据,先合并后排序速度更快,因为有大量相同的数据。合并
是采用“标记”算
法,具体如下:(设数据已存放在 sData()数组中 ,结果存到
Queryp()数组,
Amount 是数据个数)
'把相同元素置 0
For i = 1 To Amount
If sData(i) 0 Then
For j = i + 1 To Amount
Word 联盟 – http://www.wordlm.com
规则是,源数据的
整数和小数部分分别对应二维数组的两个下标。例如,“13.51"填
到“A(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 Integer, IPmin As Integer
Dim DPmax As Integer, DPmin As Integer
Dim DiffDataArray()
'读取数据
ReadData
IPmax = 0: IPmin = 1000
DPmax = 0: DPmin = 99
For i = 1 To Amount
' 找整数和小数部分的最大、最小值
IntegerPart = Int(sData(i))
DecimalPart = (sData(i) - IntegerPart) * 100
If IntegerPart > IPmax Then
IPmax = IntegerPart
ElseIf IntegerPart DPmax Then
DPmax = DecimalPart
ElseIf DecimalPart 0 Then
k=k+ 1
Queryp(k) = DiffDataArray(i, j)
End If
Next j
Next i
kMax = k
ReDim Preserve Queryp(kMax)
该方法对于本人遇到的这种“密集型”数据最为有效,但是如果
遇上“稀疏型”数
据,例如最大、最小值相差几千,甚至上万的数据,就没什么优
势了,而且会占用
较大的内存。
经过改进,我得到了处理稀疏型数据的高效算法。高效的前提条
件同样是源数据具
Word 联盟 – http://www.wordlm.com
有大量相同数据。思路是在前一种方法的基础上增加一个单维数
组,用来保存整数
部分数据,保存过程中用插入法对其进行排序。因为有大量重复
数据,要排序的数
据量相对较少。当从二维数组中读取数据时,用单维数组代入二
维数组的第一个下
标,具体代码下:
'****稀疏型数据处理****
Dim i As Long, j As Long, k As Long, kMax As Long
ReadData
IPmax = 0: IPmin = 1000
DPmax = 0: DPmin = 99
IPAamount = 0
For i = 1 To Amount
'获取整数和小数部分的最大最小值
IntegerPart = Int(sData(i))
DecimalPart = (sData(i) - IntegerPart) * 100
If IntegerPart > IPmax Then
IPmax = IntegerPart
ElseIf IntegerPart DPmax Then
DPmax = DecimalPart
ElseIf DecimalPart IPArray(j) Then
IPAamount = IPAamount + 1
For k = IPAamount To j + 1 Step -1
IPArray(k) = IPArray(k - 1)
Next k
IPArray(j) = IntegerPart
Exit For
ElseIf IntegerPart = IPArray(j) Then
Exit For
End If
Next j
If j > IPAamount Then
Word 联盟 – http://www.wordlm.com
IPAamount = IPAamount + 1
IPArray(IPAamount) = IntegerPart
End If
Next i
ReDim DiffDataArray(IPmin To IPmax, DPmin To DPmax)
'填入数据
For i = 1 To Amount
IntegerPart = Int(sData(i))
DecimalPart = (sData(i) - IntegerPart) * 100
DiffDataArray(IntegerPart, DecimalPart) = sData(i)
Next i
'提取数据
k=0
For i = 1 To IPAamount
For j = DPmax To DPmin Step -1
If DiffDataArray(IPArray(i), j) 0 Then
k=k+ 1
Queryp(k) = DiffDataArray(IPArray
(i), j)
End If
Next j
Next i
kMax = k
ReDim Preserve Queryp(kMax)
k
ReDim Preserve Queryp(kMax)
具体采用哪种算法,要看数据的性质而定,以下是本人的一些实
测数据,仅供参考
。如果你有更好的方法,可不要忘记和朋友们分享哦。
自动隐藏表格中无数据的行
表 1 是数据源,经常改变;
表 2 引用表 1 中某列有数据的单元格(利用动态位址已实现。)
由于表 1 的改变,表 2 的大小随之而变。
问题:如何实现表 2 中没有数据的行(有公式)自动隐藏?谢谢
赐教!
Sub abc()
For i = 1 To 300
If Cells(i, 1).value = "" Then Rows(i).Hidden = True
Next i
End Sub
你写的语句可以解决隐藏的问题,可是如果我执行了它之后,再
在表 1 中增加数据,
Word 联盟 – http://www.wordlm.com
表 2 不会自动显示有了数据的行。如何修改?
将此宏设为自动运行(打开文件时)
Sub abc()
For i = 1 To 300
If Cells(i, 1).value "" Then Rows(i).Hidden = false
Next i
End Sub
用 VBA 如何自动合并列的内容?
用 VBA 如何自动合并列的内容?
To hongjian :
Sub MergeTest()
For i = 3 To 30
Cells(i, 3) = Cells(i, 1) & Chr(10) & Cells(i, 2)
Next
End Sub
基于 VB 和 EXCEL 的报表设计及打印
在现代管理信息系统的开发中,经常涉及到数据信息的分析、
加工,
最终还需把统计结果形成各种形式的报表提供给领导决策参考,
或进行外
部交流。在 Visual Basic 中制作报表,通常是用数据环境设计器
(Data
Environment Designer)与数据报表设计器(Data Report Designer),或
者
使用第三方产品来完成。但对于大多数习惯于 Excel 报表的用户而
言,用以
上方法生成的报表在格式和功能等方面往往不能满足他们的要求。
1)创建 Excel 对象
Excel 对象模型包括了 128 个不同的对象,从矩形、文本框等
简单的对
象到透视表,图表等复杂的对象。下面简单介绍一下其中最重要,
Word 联盟 – http://www.wordlm.com
也是用
得最多的五个对象。
(1)Application 对象
Application 对象处于 Excel 对象层次结构的顶层,表示 Excel
自身的
运行环境。
(2)Workbook 对象
Workbook 对象直接地处于 Application 对象的下层,表示一
个 Excel 工
作薄文件。
(3)Worksheet 对象
Worksheet 对象包含于 Workbook 对象,表示一个 Excel 工作
表。
(4)Range 对象
Range 对象包含于 Worksheet 对象,表示 Excel 工作表中的
一个或多个
单元格。
(5)Cells 对象
Cells 对象包含于 Worksheet 对象,表示 Excel 工作表中的一
个单元格。
如果要启动一个 Excel,使用 Workbook 和 Worksheet 对象,
下面的代码
启动了 Excel 并创建了一个新的包含一个工作表的工作薄:
Dim zsbexcel As Excel.Application
Set zsbexcel = New Excel.Application
zsbexcel.Visible = True
如要 Excel 不可见,可使 zsbexcel.Visible = False
zsbexcel.SheetsInNewWorkbook = 1
Set zsbworkbook = zsbexcel.Workbooks.Add
2)设置单元格和区域值
要设置一张工作表中每个单元格的值,可以使用 Worksheet
对象的
Range 属性或 Cells 属性。
With zsbexcel.ActiveSheet
.Cells(1, 2).value = "100"
.Cells(2, 2).value = "200"
.Cells(3, 2).value = "=SUM(B1:B2)"
.Range("A3:A9") = "中国人民解放军"
Word 联盟 – http://www.wordlm.com
End With
要设置单元格或区域的字体、边框,可以利用 Range 对象或
Cells 对象
的 Borders 属性和 Font 属性:
With objexcel.ActiveSheet.Range("A2:K9").Borders '边框设
置
.Line = xlBorderLine
.Weight = xlThin
.ColorIndex = 1
End With
With objexcel.ActiveSheet.Range("A3:K9").Font '字体设置
.Size = 14
.Bold = True
.Italic = True
.ColorIndex = 3
End With
3)预览及打印
通过打印方向、打印纸张大小的设置,不断进行预览,直到
满意为止,
最终进行打印输出。
Word 联盟 – http://www.wordlm.com
zsbexcel.DisplayAlerts = False
zsbexcel.Quit '退出 EXCEL
zsbexcel.DisplayAlerts = True
4)具体实例
zsbexcel.ActiveSheet.Rows.VerticalAlignment =
Word 联盟 – http://www.wordlm.com
xlVAlignCenter '垂直居中
With zsbexcel.ActiveSheet
.Cells(1, 2).value = "100"
.Cells(2, 2).value = "200"
.Cells(3, 2).value = "=SUM(B1:B2)"
.Cells(1, 3).value = "中国人民解放军"
.Range("A3:A9") = "50"
End With
zsbexcel.ActiveSheet.PageSetup.Orientation = xlPortrait '
xlLandscape
zsbexcel.ActiveSheet.PageSetup.PaperSize = xlPaperA4
zsbexcel.ActiveSheet.PrintOut
zsbexcel.DisplayAlerts = False
zsbexcel.Quit
zsbexcel.DisplayAlerts = True
Set zsbexcel = Nothing
说可能对它们不全部了解,这就产生了编程者经常编写与 Excel
对象的属性、方法相
象代表当前区。(当前区指以任意空白行及空白列的组合为边界
的区域)。同样功能
Word 联盟 – http://www.wordlm.com
Averagevalue = Totalvalue / Worksheet(1).Range(″
A1:A1000″).Rows.Count
而下面代码程序比上面例子快得多:
Averagevalue="/blog/Application.WorksheetFunction.Average(Works
heets
(1).Range(″A1:A1000″))
其它函数如 Count,Counta,Countif,Match,Lookup 等等,都能
代替相同功能的
VBA 程序代码,提高程序的运行速度。
方法 2:尽量减少使用对象引用,尤其在循环中
每一个 Excel 对象的属性、方法的调用都需要通过 OLE 接口
的一个或多个调用,
...
则以下语句比上面的快
With Workbooks(1).Sheets(1).Range(″A1:A1000″).Font
.Name = ″Pay″
.Font = ″Bold″
...
End With
2.使用对象变量。
如果你发现一个对象引用被多次使用,则你可以将此对象
用 Set 设置为对象变
量,以减少对对象的访问。如:
Workbooks(1).Sheets(1).Range(″A1″).value = 100
Workbooks(1).Sheets(1).Range(″A2″).value = 200
则以下代码比上面的要快:
Set MySheet = Workbooks(1).Sheets(1)
MySheet.Range(″A1″).value = 100
MySheet.Range(″A2″).value = 200
3.在循环中要尽量减少对象的访问。
For k = 1 To 1000
Word 联盟 – http://www.wordlm.com
Sheets(″Sheet1″).Select
Cells(k,1).value = Cells(1,1).value
Next k
则以下代码比上面的要快:
Set Thevalue = Cells(1,1).value
Sheets(″Sheet1″).Select
For k = 1 To 1000
Cells(k,1).value = Thevalue
Next k
方法 3:减少对象的激活和选择
如果你的通过录制宏来学习 VBA 的,则你的 VBA 程序里一
定充满了对象的激活和选
择,例如
Workbooks(XXX).Activate、Sheets(XXX).Select、Range(XXX).Selec
t 等
,但事实上大多数情况下这些操作不是必需的。例如
Sheets(″Sheet3″).Select
Range(″A1″).value = 100
Range(″A2″).value = 200
可改为:
With Sheets(″Sheet3″)
.Range(″A1″).value = 100
.Range(″A2″).value = 200
End With
方法 4:关闭屏幕更新
如果你的 VBA 程序前面三条做得比较差,则关闭屏幕更新
是提高 VBA 程序运行速度
Application.ScreenUpdate = False
请不要忘记 VBA 程序运行结束时再将该值设回来:
Application.ScreenUpdate = True
以上是提高 VBA 运行效率的比较有效的几种方法
本示例重复最近用户界面命令。本示例必须放在宏的第一行。
Application.Repeat
Word 联盟 – http://www.wordlm.com
有绝对值小于 0.01 的数字都设置为 0(零)。
Sub RoundToZero1()
For Counter = 1 To 20
Set curCell = Worksheets("Sheet1").Cells(Counter, 3)
If Abs(curCell.Value) 0 Then
' Application.ActivePrinter = "\\zdserver2\HP LaserJet 5000 PCL 6
在 Ne00:" '指定打印机
ActiveWindow.SelectedSheets.PrintOut Copies:=myPrintNum,
Sub 打印余额()
Application.ScreenUpdating = False
Sheets("余额表").Select
Call 重算所有表
ActiveSheet.Unprotect Password:=641112 '撤消工作表保护并取消
密码
ActiveWindow.ScrollColumn = 10
Selection.AutoFilter Field:=1, Criteria1:=""
'以下 10 行弹出窗口输入打印信息
Dim myPrintNum As Integer
Dim myPrompt, myTitle As String
myPrompt = "请输入要打印的份数"
myTitle = "打印选取范围"
myPrintNum = Application.InputBox(myPrompt, myTitle, 4, , , , , 1)
If myPrintNum 0 Then
' Application.ActivePrinter = "\\zdserver2\HP LaserJet 5000 PCL 6 在
Word 联盟 – http://www.wordlm.com
MsgBox "请输入要打印的份数"
End If
ActiveSheet.ShowAllData '全部显示
ActiveSheet.Protect Password:=641112 ' 保护工作表并设置密码
Sheets("封面").Select
Application.ScreenUpdating = True
End Sub
Sub 备份()
Dim y '变量声明-需保存工作表的路径和名称
[M1] = ActiveWorkbook.FullName '单元格 M1=当前工作簿的路径
和名称
y = cells(1, 14) 'Y=单元格 N1 的值,即计算后的需保存工作簿的
路径和名称
Worksheets("封面").UsedRange.Columns("M:N").Calculate '计算指
定
区域
ActiveWorkbook.SaveCopyAs y '备份到指定路么 Y
End Sub
Sub 重算活动表()
With Application
.Calculation = xlManual
.MaxChange = 0.001
End With
ActiveWorkbook.PrecisionAsDisplayed = True
ActiveWindow.DisplayZeros = True
ActiveSheet.Calculate
End Sub
Sub 重算指定表()
Attribute 重算指定表.VB_ProcData.VB_Invoke_Func = "z\n14"
Worksheets("银行帐").Calculate
Worksheets("日报表").Calculate
End Sub
单元格数据改变引起计算激活过程
Private Sub Worksheet_Change(ByVal Target As Range)
Dim irow, icol As Integer
irow = Target.Row '变量行 irow
icol = Target.Column '变量列 icol
If irow > 6 And icol = 3 And cells(irow, 3) >= cells(irow - 1, 3)
Word 联盟 – http://www.wordlm.com
Then '>大于 6 行,并且第 3 列,当本行 3 列>2 行 3 列
Application.EnableEvents = False
cells(irow, 2) = cells(irow - 1, 2) '本行 2 列=上一行 2 列
Application.EnableEvents = True
ElseIf irow > 6 And icol = 3 And cells(irow, 3) 大于 6 行,并且第 3 列,
当本行 3 列>2 行 3 列
Application.EnableEvents = False
cells(irow, 2) = cells(irow - 1, 2) + 1 '本行 2 列=上行 2 列+1
Application.EnableEvents = True
ElseIf (icol = 3 Or icol = 4 Or icol = 6 Or icol = 8 Or icol = 9 Or
icol = 10 Or icol = 12 Or icol = 13) And irow > 6 Then 'And Target
""
Application.EnableEvents = False
cells(irow, 5) = "=单位名称"
cells(irow, 7) = "=摘要"
cells(irow, 11) = "=余额"
Range(cells(irow, 14), cells(irow, 16)) = "=预内外收支 NOP"
cells(irow, 17) = "=审核 Q"
cells(irow, 18) = "=对帐 U"
Range(cells(irow, 19), cells(irow, 20)) = "=内转收支 XY"
cells(irow, 21) = "=政采 Z"
Application.EnableEvents = True
End If
End Sub
'计算当前工作表路径及名称的函数,可作为单元格公式,也可写入
宏
=CELL("FILENAME")
'自动刷新单元格 A1 内显示的日期\时间的宏
Sub mytime()
Range("a1") = Now()
Application.OnTime Now + TimeValue("00:00:01"), "mytime"
End Sub
'用单元格 A1 的内容作为文件名保存当前工作簿的宏
Word 联盟 – http://www.wordlm.com
Sub b()
ActiveWorkbook.SaveCopyAs Range("A1") + ".xls"
End Sub
'激活窗体的宏,此宏写入有窗体的工作表内
Private Sub CommandButton1_Click() '点数据录入按钮控件激活窗
体
Load UserForm3 '激活窗体
UserForm3.StartUpPosition = 3 '激活窗体
UserForm3.Show '激活窗体
End Sub
'以下为窗体中点击各按钮运行的宏,写入窗体内
Public pos As Integer '声明变量 pos
'战友确定按钮语句
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False '此句和最后一句旨在不显
示宏的执行过程
'On Error GoTo ErrorHandle '可以不要
'ErrorHandle: '可以不要
'If Err.Number = 13 Then '可以不要
'Exit Sub '可以不要
'End If '可以不要
Call writeToWorkSheet '执行宏 writetoworksheet
UserForm3.Hide '退出窗体,继续按钮少此句,退出按钮执行此句
Unload UserForm3 '退出窗体,继续按钮少此句,退出按钮执行此句
Call 批量打印 '[此处到接顺序 2]
[L2] = "" '[到此处结束]
Sheets("打印信息").Select
Application.ScreenUpdating = True
End Sub
'退出按钮语句
Private Sub CommandButton2_Click()
UserForm3.Hide
Unload UserForm3
End Sub
'将窗体内的文本框中的数据写进工作表的单元格
Private Sub writeToWorkSheet()
ActiveSheet.Range("k2") = TextBox1.Value '将文字框内容写进 k 列
Word 联盟 – http://www.wordlm.com
ActiveSheet.Range("l2") = TextBox2.Value '将文字框内容写进 l 列
TextBox1.Value = "" '清空文字框内容
TextBox2.Value = "" '清空文字框内容
Worksheets("打印信息").Range("a2").Value = 1 '给指定表的单元格
写入
数据
Worksheets("打印信息").Range("B3:E113").Value = "" '清空指定表
的单元
格数据
End Sub
'以下为根据条件打印的宏
Sub 打印() '部门明细查询及批星打印
Application.ScreenUpdating = False '关闭屏幕更新
If Cells(1, 4) = "" And Cells(1, 5) = "" Then '打印条件 Cells(3,
13) = 1 And
' Application.ActivePrinter = "\\zdserver2\HP LaserJet 5000 PCL
容
Sub 批量打印()
For Z = Cells(1, 11) To Cells(1, 12) '变量 X 的值从打印起始号 K1
到结束
号 L1 之间逐渐递增
Cells(1, 13) = Z 'M1 的值等于变量 X
Next Z
End Sub
Word 联盟 – http://www.wordlm.com
'以下是将打印情况写入工作表的宏
Sub 打印信息()
Application.ScreenUpdating = False '关闭屏幕更新
Dim Y '声明变量
Y = ActiveSheet.Name '判定活动工作表名称
Sheets("打印信息").Select
X = 3 '从第 3 行开始
Do While Not (IsEmpty(Cells(X, 2).Value)) '判断第 1 列的最后一行
(
即空行的上一行)
X = X + 1 '在最后一行加一行即为空行
Loop
Cells(X, 2) = Cells(2, 1)
Cells(X, 3) = Sheets(Y).Cells(4, 3)
Cells(2, 1) = Cells(2, 1) + 1
Cells(X, 4) = Sheets(Y).Cells(1, 4)
Cells(X, 5) = Sheets(Y).Cells(1, 5)
[c1] = Y
Sheets(Y).Select '返回上一次打开的工作表
Application.ScreenUpdating = True '打开屏幕更新
End Sub
将文件保存为以某一单元格中的值为文件名的宏怎么写
假设你要以 Sheet1 的 A1 单元格中的值为文件名保存,则应用命
令:
ActiveWorkbook.SaveCopyAs Str(Range("Sheet1!A1")) + ".xls"
在 Excel 中,如何用程式控制某一单元格不可编辑修改?thanks!!!
Private Sub Workbook_Open()
ProtectSpecialRange ("A1")
End Sub
(RangeAddress) _
, Password:="pass"
.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
Word 联盟 – http://www.wordlm.com
End With
End Sub
对工作表编程,有时要判断工作表的记录总数,VBA 里如何实现?
x=1
do while not (isempty(sheets("").cells(x,1).value)
x=x+1
loop
自定义菜单有三个菜单项,要求手工顺序执行。为防止误操作,
执行完第一个菜单项
后使其变灰(禁用),如何写?
Rowen
令其 Enable 属性同步与某个工具按钮是较为方便的。
如何进行表格更新?
是这样的,比如我已经有了一个原始表格 A,这时有人通知我 A
表有错误,须加以修改
列无需修改)。现在问题是如何根据表 B 中的新值,在表 A 中找
到相应位置,并加以修
10002 的相应位置(身高体重),并加以修改。
建議將表 b 複製至表 a 的 sheet2,然後執行下列的宏即可
sub change()
dim dd as range
sheets(2).select
lastcell = range("a65536").end(xlup).row
for each dd in range(cells(2, 1), cells(lastcell, 1))
if dd = "" then exit sub
ff = dd.value
set c = sheets(1).columns(1).find(ff, lookat:=xlwhole)
if not c is nothing then
Word 联盟 – http://www.wordlm.com
c.offset(0, 2) = dd.offset(0, 2)
c.offset(0, 3) = dd.offset(0, 3)
c.offset(0, 5) = dd.offset(0, 4)
end if
next
end sub
自定义菜单
把建立和删除自定义菜单的代码分别写在 Workbook_open 和
Workbook_beforeclosed
的事件中。
VBA 实现向锁定工作表中插入行,并自动复制上面行中指定列的
函数
Option Explicit
Public Const strPass = "123" 123 是口令
Sub 行上再插入一行()
ActiveSheet.Unprotect password:=strPass
Selection.Copy
Selection.Insert Shift:=xlDown
Selection.PasteSpecial Paste:=xlFormats, Operation:=xlNone,
SkipBlanks:= _
False, Transpose:=False
Application.CutCopyMode = False
ActiveSheet.Protect password:=strPass
End Sub
可以在工作表关闭之前进行手工保存工作
ThisWorkbook.save
如何实现动态时间显示?
sub mytime
range("a1")=now()
Word 联盟 – http://www.wordlm.com
Application.OnTime Now + Timevalue("00:00:01"), "mytime"
end sub
“Range("F7:F12")”等。
性或 Columns 属性的多个调用组合起来。下例将活动工作簿中第
一张工作表上的第
一行、第三行和第五行的字体设置为加粗。
Sub SeveralRows()
Worksheets("Sheet1").Activate
Dim myUnion As Range
Set myUnion = Union(Rows(1), Rows(3), Rows(5))
myUnion.Font.Bold = True
End Sub
Word 联盟 – http://www.wordlm.com
如果只是你说的只连接几个储存格那用简单的方法
Range("A1").Formula = Application.Evaluate("=[Book2.xls]Sheet1!
A1")
或
Range("A1").Formula = "=[Book2.xls]Sheet1!A1"
我在 a1:b100 插入名称∶myrange
请问我如何用 vba 选取此范围
Range("myrange").Select
("A1:A10").Value
wbSource.Close False
xlapp.Quit
End Sub
找 ID="{00000000-0000-0000-0000-000000000000}"(有工程锁定密
码时),或
ID="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"(没有工程锁定密
码时),修改其中
的任意 1 位后,保存,即可达到目的.当查看工程是会出现“工程不
可查看”的提示.
注意:修改前,一定要备份原文件,以防不测
Word 联盟 – http://www.wordlm.com
To:=y
ActiveSheet.PageSetup.LeftMargin= 左边距
ActiveSheet.PageSetup..PaperSize = 纸张大小
替换 Excel 97 的菜单栏是很容易的,只需创建一个新的菜单栏就
会删除 Excel 97 的
系统的自定义菜单中只需两个命令按钮,一个用来返回到系统的
主画面
(ReturnMAIN),另一个用来退出系统(ExitSYS)。下面是模
块(Module)中有关
的宏或是事件控制程序。
Sub ZapMenu( )
On Error Resume Next
CommandBars(“保险查询系统”).Delete
End Sub
这是一个用来删除自定义菜单栏的宏。语句 On Error Resume Next
保证无论自
定义菜单栏是否存在都能正确删除它。
Sub ExitSYS( )
ZapMenu
ActiveWorkbook.Close SaveChanges := False
End Sub
这是用来退出系统的宏。它删除自定义菜单,并关闭活动的工作
簿(不提示保存
修改)。
Sub ReturnMAIN( )
Worksheets(“保险查询系统”).Select
End Sub
该宏用来返回主画面。它激活“保险查询系统”工作表。
Sub SetMenu( )
Dim myBar As CommandBar
Word 联盟 – http://www.wordlm.com
Dim myButton As CommandBarButton
ZapMenu
Set myBar = CommandBars.Add(Name:=“保险查询系统”, _
Position :=msoBarTop, _
MenuBar :=True)
Set myButton = myBar.Controls.Add(msoControlButton)
myButton. = msoButtonCaption
myButton.Caption = “退出[&E]”
myButton.OnAction = “ExitSYS”
Set myButton = myBar.Controls.Add(msoControlButton)
myButton. = msoButtonCaption
myButton.Caption = “返回[&R]”
myButton.OnAction = “ReturnMAIN”
myButton.Visible = False
myBar.Protection = msoBarNoMove + msoBarNoCustomize
myBar.Visible = True
End Sub
这个宏包含五部分。第一部分定义了一对变量。第二部分首先运行
ZapMenu 宏,
保证保险查询系统菜单栏是不存在的,然后创建它。参数
MenuBar 的值设为 True,确
保这个新创建的命令栏为一菜单栏。第三部分和第四部分将两个
命令按钮加入到菜单
新创建的菜单栏,使用户不能移动也不能自定义新菜单栏。
工作表汇总
Sub sum() '表汇总,第 1 张的 a1:e20 等于所有表的相同单元格的和
Attribute sum.VB_ProcData.VB_Invoke_Func = "z\n14"
Dim X As Worksheet
For y = 1 To 20
For z = 1 To 5
For Each X In Worksheets
shname = X.Name
ActiveSheet.Cells(y, z).Value = ActiveSheet.Cells(y, z).Value +
Worksheets(shname).Cells(y, z)
Next
Word 联盟 – http://www.wordlm.com
Next z
Next y
End Sub
图形对齐
Sub SnapToGrid()
Dim selObj As Visio.Selection
Dim shpObj As Shape
Dim shpPinX As Cell
Dim shpPinY As Cell
Dim str As String
'获得被选区域的图形集
Set selObj = ActiveWindow.Selection
'得到图形个数
shpsCount = selObj.Count
'遍历被选图形
For i = 1 To shpsCount
'获得当前被选图形对象
Set shpObj = selObj(i)
'判断是否是 2 维图形,要求图形中的一维图形都连接到 2
维图形的连接点
If (Not shpObj.OneD) Then
'获得图形的位置
Set shpPinX = shpObj.Cells("PinX")
Set shpPinY = shpObj.Cells("PinY")
'看看图形的位置是否与其他的连接点相连
str = shpPinX.Formula
If (Not Left(str, 3) = "PNT") Then
'这里乘除 25.4 可以根据网格大小做修改
'Visio 可能默认是英制,对公制处理还需考虑
shpPinX.Formula = Round(shpPinX * 25.4, 0) / 25.4
shpPinY.Formula = Round(shpPinY * 25.4, 0) / 25.4
End If
End If
Next
End Sub
Word 联盟 – http://www.wordlm.com