1,引用文件路径
1. ,常用的、带解释的 VBA 短句 by:yuhongpu
http://club.excelhome.net/dispbbs.asp?boardID=2&ID=169024&page=1&px=0
VBA起步]常用的、带解释的 VBA 短句
[A65536].End(xlUp).Row 'A列末行向上第一个有值的行数
[A1].End(xlDown).Row 'A列首行向下第一个有值之行数
[IV1].End(xlToLeft).Column '第一行末列向左第一列有数值之列数。
[A1].End(xlToRight).Column '第一行首列向右有连续值的末列之列数
Application.CommandBars("Standard").Controls(2).BeginGroup=True '在常用工具栏的第二个按钮前插入分隔符
Cells.WrapText = False '取消自动换行
If Len(Target) > 5 Then '如果当前单元格中的字符数超过5个,执行下一行
Target.WrapText = True '自动换行
End If
[A1:B10].SpecialCells(xlCellTypeBlanks).Rows.Hidden = True '有空格即隐藏行
[A2].parent.name '返回活动单元格的工作表名
[A2].parent.parent.name '返回活动单元格的工作簿名
如下代码可使工作簿打开后30秒(或闲置30秒)内不输入、不重新选择等,自动关闭工作簿
Private Sub Workbook_Open() '工作簿打开事件
tt '工作簿打开时启动 tt 过程
End Sub
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) '工作表变化事件
tt '工作表中任一单元格有变化时启动 tt 过程
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) '工作表选择变化事件
tt '工作表中单元格的选择有变化时启动 tt 过程
End Sub
Sub tt() 'tt 过程
Dim myNow As Date, BL As Integer '定义myNow为日期型;定义BL为长整型
myNow = Now '把当前的时间赋给变量myNow
Do '开始循环语句Do
BL = Second(Now) - Second(myNow) '循环中不断检查变量BL的值
If BL = 30 Then GoTo Cl '当BL=30即跳转到CL
DoEvents '转让控制权,以便sheets可继续操作
Loop Until BL > 30 '当BL>30即跳出循环
Exit Sub
Cl:
Application.EnableEvents = False '避免引起其他事件
ActiveWorkbook.Close True '关闭活动工作簿并保存
Application.EnableEvents = True '可触发其他事件
End Sub
range("e4").addcomment.Text "代头" & Chr(10) & "内容……" '添加批注
range("e4").Comment.Visible = True '显示批注
把工作簿中所有工作表的指定列调整为最佳列宽:
Sub 调整列宽()
Dim i%
For i = 1 To Sheets.Count '遍历工作簿中所有的工作表
Sheets(i).Columns("A:K").AutoFit '把每个工作表的[A:K]列调整为最佳列宽
Next i
End Sub
Do循环语句的几种形式:
1.
Do While i>1 '条件为True时执行
... ... '要执行的语句
Loop
2.
Do Until i>1 '条件为False时执行
... ... '要执行的语句
Loop
3.
Do
... ... '要执行的语句
Loop While i>1 '条件为True时执行
4.
Do
... ... '要执行的语句
Loop Until i>1 '条件为False时执行
5.While...Wend 语句
While i>1 '条件为True时执行
... ... '要执行的语句
Wend
勾选"VBA项目的信任"
Application.SendKeys "%(tmstv){ENTER}" '在 Excel 窗口操作
Application.SendKeys "%(qtmstv){ENTER}" '在 VBE 窗口操作
Application.CommandBars("命令按钮名称").Position = msoBarFloating '使[命令按钮]悬浮在表格中
Application.CommandBars("命令按钮名称").Position = msoBarTop '使[命令按钮]排列在工具栏中
ActiveSheet.protect Password:="wshzw" '为工作表保护加口令
ActiveSheet.Unprotect Password:="wshzw" '解除工作表保护
Activesheet.ProtectContents '判断工作表是否处于保护状态
工作表的复制与命名
Sub wshzw()
Dim i As Integer
For i = 1 To 5
Sheets("Sheet1").Copy After:=Sheets(1) 'Before/After 复制新表在 Sheets("Sheet1") 前/后
ActiveSheet.Name = i & "月" '为复制的新表命名
Next i
Sheets("Sheet1").Name = "总表" '为 Sheets("Sheet1") 改名
End Sub
Application.EnableEvents = False
......
Application.EnableEvents = True '抑制事件连锁执行
Application.EnableEvents = False
ActiveWorkbook.Save '抑制BeforeSave事件的发生
Application.EnableEvents = True '抑制指定事件
Application.DisplayAlerts=False '屏蔽确认提示
Application.ScreenUpdating = False
.......
Application.ScreenUpdating = true ' 冻结屏幕以加快程序运行
ActiveCell.CurrentRegion.Select '选择与活动单元格相连的区域
range("a2:a20").NumberFormatLocal = "00-00" '区域的格式化
ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row '已用区域的最末行
ActiveSheet.Copy Before:=Sheets(1) '复制活动工作表到第一张工作表之前
range("a2:a20").FormulaHidden = True '工作表处于保护状态时隐藏部分单元格公式
FileDateTime("E:\My Documents\33.xls")
或
FileDateTime(thisworkbook.FullName) '文件被创建或最后修改后的日期和时间
FileLen(thisworkbook.FullName) / 1024
或
FileLen("E:\My Documents\temp\33.xls") / 1024 '文件的长度(大小),单位是 KB
Application.AskToUpdateLinks = False '不询问是否更新链接,并自动更新链接
ActiveSheet.Hyperlinks.Delete '删除活动工作表超链接
ActiveWorkbook.SaveLinkValues = False '不保存活动工作簿的外部链接值
ActiveSheet.PageSetup.CenterFooter = Range("k2").Value '打印时设置自定义页脚
ActiveSheet.PageSetup.Orientation = xlLandscape '设置为横向打印
ActiveSheet.PageSetup.Orientation = xlPortrait '设置为纵向打印
Application.WindowState = xlMinimized '最小化窗口
Application.WindowState = xlNormal '最大化窗口
Sub 删除工作表()
Application.DisplayAlerts = False
Sheet1.Delete
Application.DisplayAlerts = True
End Sub
有删除就有添加
Sub 添加工作表()
For i = 1 To 5
Worksheets.Add.Name = i
Next
End Sub
[A1:A20].AdvancedFilter xlFilterCopy, [B1], Unique:=True '可去掉重复数据
[A2:C32].Replace What:="F", Replacement:="G" '指定范围内的查找与替换
Activesheet.AutoFilterMode = false '取消自动筛选
执行以下语句可有效缩小工作簿的大小,执行前请先看清每条语句的作用:
ActiveSheet.UsedRange.Comment.Shape.TextFrame.AutoSize = True ‘根据批注内容自动调整大小
ActiveSheet.UsedRange.ClearComments '清除活动工作表已使用范围所有批注
ActiveSheet.UsedRange.ClearFormats '清除活动工作表已使用范围所有格式
ActiveSheet.UsedRange.Validation.Delete '取消活动工作表已使用范围的数据有效性
ActiveSheet.Hyperlinks.Delete '删除活动工作表超链接
ActiveSheet.DrawingObjects.Delete '删除活动工作表已使用范围的所有对象
ActiveSheet.UsedRange = ActiveSheet.UsedRange.Value '取消活动工作表已使用范围的公式并保留值
还有:
Sub x()
Dim myRange As String
myRange = ActiveSheet.UsedRange.Address '去除活动工作表无数据的行列
End Sub
ActiveWorkbook.FullName '当前窗口文件名与路径
Application.AltStartupPath= "E:\My\MyStart" '替补启动目录路径
Application.AutoRecover.Path '返回/设置Excel存储"自动恢复"临时文件的完整路径
Application.DefaultFilePath '选项>常规中的默认工作目录
Application.Evaluate("=INFO(""directory"")") '默认工作目录
Application.LibraryPath '返回库文件夹的路径
Application.NetworkTemplatesPath '返回保存模板的网络路径
Application.Path '返回应用程序完整路径
Application.RecentFiles.Item(1).Path '返回最近使用的某个文件路径,Item(1)=第一个文件
Application.StartupPath 'Excel启动文件夹的路径
Application.TemplatesPath '返回模板所存储的本地路径
Application.UserLibraryPath '返回用户计算机上 COM 加载宏的安装路径
Debug.Print Application.PathSeparator '路径分隔符 "\"
CurDir '默认工作目录
Excel.Parent.DefaultFilePath '默认工作目录
ThisWorkbook.Path '返回当前工作薄的路径
dim mm(2,10)
Range("a1:b10")=mm '可以将二维数组赋值给Range
Application.Dialogs(XLdialogsaveas).show 显示保存对话框
[SIZE=1]Sub x()
Dim myRange As String
myRange = ActiveSheet.UsedRange.Address '去除活动工作表无数据的行列
End Sub
这相当于把新的已使用区域赋值给变量,效果等同于手工删除多余的列或行后立即保存;
来一个函数的
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'右边单元格反向显示活动单元格文本
If ActiveCell.Column < 256 Then ActiveCell.Offset(0, 1) = StrReverse(ActiveCell)
End Sub
想不到UsedRange还可以这样用,又学到了!有了这个就可以轻松取得当前Sheet的最末行和最末列号了:
Sub test()
Dim myRange As String
myRange = ActiveSheet.UsedRange.Address
Debug.Print "LastRow=" & Cells.SpecialCells(xlCellTypeLastCell).Row
Debug.Print "LastColumn=" & Cells.SpecialCells(xlCellTypeLastCell).Column
myRange = ""
End Sub
跟一帖:如上下相邻单元格数据相同则删除一个
Sub Yjue()
Dim myCell As Range, NCell As Range '定义
Set myCell = ActiveSheet.Range("b2") '把对象ActiveSheet.Range("b2")赋给变量myCell
Do While Not IsEmpty(myCell) '条件为True时执行
Set NCell = myCell.Offset(1, 0) '把对象myCell的下一个单元格赋给变量NCell
If NCell.Value = myCell.Value Then '如上下相邻单元格数据相同,则望下执行
myCell.Delete '删除myCell
End If '结束条件语句
Set myCell = NCell '把变量NCell赋给变量myCell,等于在循环中把原myCell下移了一格
Loop
End Sub
复制行高列宽与内容:
Sub Yjue() '过程的名称
Sheet2.Rows("2:23").Copy '复制行区域
Sheet3.Select '选择粘贴区域
Range("A2").PasteSpecial Paste:=xlPasteColumnWidths '粘贴类型
ActiveSheet.Paste '实施粘贴
Application.CutCopyMode = False '取消复制模式
End Sub
如整行为空白则删除整行:
Sub DelRow()
Dim i As Integer, LastRow As Integer
LastRow = ActiveSheet.Cells.SpecialCells(xlCellTypeLastCell).Row '把最后行的行号赋给变量
For i = LastRow To 1 Step -1 '倒循环
If Range("iv" & i).End(xlToLeft).Column = 1 And Range("a" & i) = "" Then
Range("a" & i).EntireRow.Delete '如整行为空白则删除整行
End If
Next i
End Sub
T = Application.GetOpenFilename("Text Files (*.dat), *.dat")选择文件保存路径
通过依次赋色给单元格的例子,展示简单的 On Error GoTo Line1 用法:
Sub Yjue() '过程名
Dim i As Integer '定义 i 为整型
On Error GoTo Line1 '遇到错误跳转到 Line1
For i = 0 To 65 '予设从 0 循环到 65
Cells(i + 1, 2).Interior.ColorIndex = i '依次赋色给第2列的单元格
Cells(i + 1, 1) = i '依次给第1列的单元格标上色索引号
Next i
Exit Sub '退出过程
Line1: '遇到错误跳转到这行继续执行
MsgBox "默认颜色只有 " & i - 1 & "种。" '提示对话框
End Sub '结束过程
通过显示或取消网格线,展示运算符“Not”应用的简单示例:
Dim myLine As Boolean '定义变量myLine为布尔型
With CommandButton1 'With语句结构
If .Caption = "取消网格线" Then '如按钮上显示为"取消网格线"
.Caption = "显示网格线" '改按钮上的字幕为"显示网格线"
myLine = ActiveWindow.DisplayGridlines '把活动窗口当前网格线的显示状态赋给变量
ActiveWindow.DisplayGridlines = Not myLine '进行逻辑否定运算
Else
.Caption = "取消网格线" '否则按钮上显示为"取消网格线"
ActiveWindow.DisplayGridlines = Not myLine '进行逻辑否定运算
End If
End With '结束With语句结构
ActiveCell.Offset(, -1).Name = "hzw" '定义名称
ActiveCell.Precedents.Address '被当前单元格所引用的区域地址
ActiveCell.Resize(0, 2).Select '选定当前单元格并向右延伸二格
Activesheet.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Count - 1 '显示自动筛选后的行数
有选择地删除指定区域内的单元格
点击按钮可选择性的删除[A1:A20]区域内含有[D1]中字样的单元格;再点击按钮可返回原样;
如果替换了[D1]中的字样,点击按钮后所删除[A1:A20]区域中的单元格亦会随着变化。
With CommandButton1
If .Caption = "删除单元格" Then '如按钮显示的字符为:"删除单元格",
.Caption = "反悔删除" '则改为:"反悔删除"
For i = 20 To 1 Step -1 '倒循环
If Cells(i, 1) Like "*" & Range("d1") & "*" Then
Cells(i, 1).Delete Shift:=xlUp '如循环中发现某个单元格含有[D1]中字符,则删除该单元格
End If
Next i
Else
.Caption = "删除单元格" '否则让按钮显示的字符为:"删除单元格"
Range("a1:a20") = Range("f1:f20").Value '把[F1:F20]赋给[A1:A20],为了可反复测试
End If
End With
下面换个话题,举一个限制鼠标只能在[B2:G60]以外的区域活动的例子:
With ActiveSheet 'With 语句,在一个单一对象上执行一系列的语句
.Unprotect '解除没设密码的工作表保护
.Cells.Locked = False '解除活动工作表中所有单元格的“锁定”
.Range("b2:g60").Locked = True '只锁定 [B2:G60] 区域
.EnableSelection = xlUnlockedCells '仅允许选定未被有效锁定的单元格
.Protect '工作表保护(没设密码)
End With 'With 语句结束
一个复制数据后,只能粘贴数值的例子
Private Sub Worksheet_SelectionChange(ByVal T As Range) '工作表SelectionChange事件
On Error Resume Next '忽略代码运行中的错误,并越过错误继续执行后面的语句
If T.Column = 1 Then '如活动单元格为第一列时执行下面的语句
Selection.PasteSpecial Paste:=xlPasteValues '粘贴数值
Application.CutCopyMode = False '立即清空剪贴板
End If 'IF结构结束
End Sub '本过程结束
-----------------------------------------------------------
如何用VBA获得工作簿名称?
For Each wbk In Workbooks
MsgBox wbk.Name
Next
Workbooks.Close '关闭所有工作簿
Application.Quit '关闭所有工作簿
工作簿调用的问题
本人做了一个程序,里面自定义了工具菜单:
如果程序打开后,调用了一个新的工作簿,当再次调用第二个新的工作簿时如何用vba编写一段代码,先保存退出调用的第一个工作簿,然后再打开第二个新的工作簿
Dim Wb As Workbook
Sub test()
Set Wb = Workbooks.Open("book2.xls")
End Sub
Sub test2()
Wb.Close savechanges:=True
Set Wb = Workbooks.Open("book5.xls")
End Sub
下面代码为何不能进行两工作簿中的工作之间的复制?(复制代码出现不支持此属性或方法的错误)
Mybo = ActiveWorkbook.Name
She = Sheets(1).Name
Range("A1:B1").Select
Selection.AutoFilter
Range("B2").Select
Selection.AutoFilter Field:=1, Criteria1:=">100", Operator:=xlAnd, _
Criteria2:="<200"
Windows(Mybo).Worksheets(She).Range("A1:K5000").Copy _
Destination:=Windows(mybook).Worksheets("acfmis").Range("A1")
2. 选择变色 by:Lht7777
http://club.excelhome.net/dispbbs.asp?boardID=1&ID=222901&page=1&px=0
‘选中B3时,B1A3变红色;选中C4时,C1A4变黄色
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Count = 1 Then
If Target.Address = "$B$3" Then
Range("b1,a3").Interior.ColorIndex = 3
Else
Range("b1,a3").Interior.ColorIndex = xlautocolor
End If
If Target.Address = "$C$4" Then
Range("c1,a4").Interior.ColorIndex = 6
Else
Range("c1,a4").Interior.ColorIndex = xlautocolor
End If
End If
End Sub
3. 工作表权限 by:fieldsun
‘http://club.excelhome.net/dispbbs.asp?BoardID=1&ID=72744&replyID=&skin=0
Private Sub Worksheet_Change(ByVal Target As Range)
Dim c As Range
If Target.Address = "$F$1" Then
Application.ScreenUpdating = False
For Each c In Range("A2:A21")
Sheets(c.Value).Visible = c.Offset(0, Range("G1").Value).Value
Next c
Application.ScreenUpdating = True
End If
End Sub
By: andysky
http://excel.aa.topzj.com/viewthread.php?tid=372297&extra=page%3D1
Private Sub Workbook_SheetActivate(ByVal Sh As Object)
Dim a As Byte
a = ActiveSheet.Index
If a <> 4 Then
If InputBox("密码:", "请确认密码", 4) = a Then
Sheets(a).Select
Else
Sheets(4).Select
End If
End If
End Sub
4. 浮动按钮 by:Qee用
http://www.excelpx.com/dispbbs.asp?boardid=5&id=13551&star=1#63383
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
[Button].Top = Target.Top
End Sub
Sub Fill10()
‘自动填充十行
Dim rg As Range
Application.EnableEvents = False
For Each rg In Selection
rg.Resize(11, 1) = rg
Next rg
Application.EnableEvents = True
End Sub
5. 导出到文本文件 by:chenimbile
http://www.excelpx.com/dispbbs.asp?boardid=5&id=13772&star=1#65435
Private Sub CommandButton1_Click()
Dim filesavename As String
Dim str2 As String
Dim x As Integer
Dim maxrow As Integer
filesavename = Application.GetSaveAsFilename( _
InitialFileName:="d:\", fileFilter:="Text Files (*.txt), *.txt") ‘选择文件
Set fs = CreateObject("Scripting.FileSystemObject")
Set a = fs.CreateTextFile(filesavename, True)
maxrow = Range("e65535").End(xlUp).Row
For x = 4 To maxrow
str2 = Range("e" & x).Value & "," & Range("f" & x).Value
If x = maxrow Then
a.write (str2) ‘最后一行,系统自动加回车换行符,(Chr(13) + Chr(10))
Else
a.writeline (str2)
End If
Next
a.Close
End Sub
6. 合并删除单元格(定时设置) by:sjzhouzb
Private Sub CommandButton1_Click()
‘by: sjzhouab
‘但是只是删除了前面的,与题意有些不同
t = Timer
Application.ScreenUpdating = False
For i = 1 To [a65536].End(xlUp).Row
If Range("a" & i) <> "" And Range("a" & i) <> "序 号" And Range("a" & i) <> "分部分项工程量清单综合单价分析表" And Range("a" & i) <> "工程名称:" Then
If Application.WorksheetFunction.CountIf(Range("a1:a65536"), Range("a" & i)) > 1 Then
Rows(i).Select
Selection.Delete
End If
End If
Next
Application.ScreenUpdating = True
MsgBox "完成,耗时" & Timer - t & "秒"
End Sub
7. 筛选 by:Qee用
‘2007322
‘请教如何排序筛选.xls
Function rr(ByVal s As String) As String
Dim i%, arr(1 To 15) As Boolean, ar
ar = Split(s, " ")
For i = 0 To UBound(ar)
arr(Val(ar(i))) = True
Next i
For i = 1 To 15
If Not arr(i) Then rr = rr & Format(i, "00") & " "
Next i
rr = Trim(rr)
End Function
8. VBA编程问答程序集 by:fanjy
http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=698285&id=180664&page=1&skin=0&Star=1
http://club.excelhome.net/dispbbs.asp?boardID=2&ID=190388&page=1&px=0
[原创]VBA语句集100句(第2辑)
fanjy 发表于 2006-6-24 14:56:22
VBA语句集
(第2辑)
*******************************************************
定制模块行为
(101) Err.Clear ‘清除程序运行过程中所有的错误
*******************************************************
工作簿
(102) ThisWorkbook.BuiltinDocumentProperties(“Last Save Time”)
或Application.Caller.Parent.Parent.BuiltinDocumentProperties(“Last Save Time”) ‘返回上次保存工作簿的日期和时间
(103) ThisWorkbook.BuiltinDocumentProperties("Last Print Date")
或Application.Caller.Parent.Parent.BuiltinDocumentProperties(“Last Print Date”) ‘返回上次打印或预览工作簿的日期和时间
(104) Workbooks.Close ‘关闭所有打开的工作簿
(105) ActiveWorkbook.LinkSources(xlExcelLinks)(1) ‘返回当前工作簿中的第一条链接
(106) ActiveWorkbook.CodeName
ThisWorkbook.CodeName ‘返回工作簿代码的名称
(107) ActiveWorkbook.FileFormat
ThisWorkbook.FileFormat ‘返回当前工作簿文件格式代码
(108) ThisWorkbook.Path
ActiveWorkbook.Path ‘返回当前工作簿的路径(注:若工作簿未保存,则为空)
(109) ThisWorkbook.ReadOnly
ActiveWorkbook.ReadOnly ‘返回当前工作簿的读/写值(为False)
(110) ThisWorkbook.Saved
ActiveWorkbook.Saved ‘返回工作簿的存储值(若已保存则为False)
(111) Application.Visible = False ‘隐藏工作簿
Application.Visible = True ‘显示工作簿
注:可与用户窗体配合使用,即在打开工作簿时将工作簿隐藏,只显示用户窗体.可设置控制按钮控制工作簿可见
*******************************************************
工作表
(112) ActiveSheet.Columns("B").Insert ‘在A列右侧插入列,即插入B列
ActiveSheet.Columns("E").Cut
ActiveSheet.Columns("B").Insert ‘以上两句将E列数据移至B列,原B列及以后的数据相应后移
ActiveSheet.Columns("B").Cut
ActiveSheet.Columns("E").Insert ‘以上两句将B列数据移至D列,原C列和D列数据相应左移一列
(113) ActiveSheet.Calculate ‘计算当前工作表
(114) ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetHidden ‘正常隐藏工作表,同在Excel菜单中选择“格式——工作表——隐藏”操作一样
ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetVeryHidden ‘隐藏工作表,不能通过在Excel菜单中选择“格式——工作表——取消隐藏”来重新显示工作表
ThisWorkbook.Worksheets(“sheet1”).Visible=xlSheetVisible ‘显示被隐藏的工作表
(115) ThisWorkbook.Sheets(1).ProtectContents ‘检查工作表是否受到保护
(116) ThisWorkbook.Worksheets.Add Count:=2, _
Before:=ThisWorkbook.Worksheets(2)
或 ThisWorkbook.Workshees.Add ThisWorkbook.Worksheets(2), , 2 ‘在第二个工作表之前添加两个新的工作表
(117) ThisWorkbook.Worksheets(3).Copy ‘复制一个工作表到新的工作簿
(118) ThisWorkbook.Worksheets(3).Copy ThisWorkbook.Worksheets(2) ‘复制第三个工作表到第二个工作表之前
(119) ThisWorkbook.ActiveSheet.Columns.ColumnWidth = 20 ‘改变工作表的列宽为20
ThisWorkbook.ActiveSheet.Columns.ColumnWidth = _
ThisWorkbook.ActiveSheet.StandardWidth ‘将工作表的列宽恢复为标准值
ThisWorkbook.ActiveSheet.Columns(1).ColumnWidth = 20 ‘改变工作表列1的宽度为20
(120) ThisWorkbook.ActiveSheet.Rows.RowHeight = 10 ‘改变工作表的行高为10
ThisWorkbook.ActiveSheet.Rows.RowHeight = _
ThisWorkbook.ActiveSheet.StandardHeight ‘将工作表的行高恢复为标准值
ThisWorkbook.ActiveSheet.Rows(1).RowHeight = 10 ‘改变工作表的行1的高度值设置为10
(121) ThisWorkbook.Worksheets(1).Activate ‘当前工作簿中的第一个工作表被激活
(122) ThisWorkbook.Worksheets("Sheet1").Rows(1).Font.Bold = True ‘设置工作表Sheet1中的行1数据为粗体
(123) ThisWorkbook.Worksheets("Sheet1").Rows(1).Hidden = True ‘将工作表Sheet1中的行1隐藏
ActiveCell.EntireRow.Hidden = True ‘将当前工作表中活动单元格所在的行隐藏
注:同样可用于列。
(124) ActiveSheet.Range(“A:A”).EntireColumn.AutoFit ‘自动调整当前工作表A列列宽
(125) ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlTextValues) ‘选中当前工作表中常量和文本单元格
ActiveSheet.Cells.SpecialCells(xlCellTypeConstants,xlErrors+xlTextValues) ‘选中当前工作表中常量和文本及错误值单元格
*******************************************************
公式与函数
(126) Application.MacroOptions Macro:=”SumPro”,Category:=4 ‘将自定义的SumPro函数指定给Excel中的“统计函数”类别
(127) Application.MacroOptions Macro:=”SumPro”, _
Description:=”First Sum,then Product” ‘为自定义函数SumPro进行了功能说明
(128) Application.WorksheetFunction.CountA(Range(“A:A”))+1 ‘获取A列的下一个空单元格
(129) WorksheetFunction.CountA(Cell.EntireColumn) ‘返回该单元格所在列非空单元格的数量
WorksheetFunction.CountA(Cell.EntireRow) ‘返回该单元格所在行非空单元格的数量
(130) WorksheetFunction.CountA(Cells) ‘返回工作表中非空单元格数量
(131) ActiveSheet.Range(“A20:D20”).Formula=“=Sum(R[-19]C:R[-1]C”’对A列至D列前19个数值求和
*******************************************************
图表
(132) ActiveWindow.Visible=False
或 ActiveChart.Deselect ‘使图表处于非活动状态
(133) TypeName(Selection)=”Chart” ‘若选中的为图表,则该语句为真,否则为假
(134) ActiveSheet.ChartObjects.Delete ‘删除工作表上所有的ChartObject对象
ActiveWorkbook.Charts.Delete ‘删除当前工作簿中所有的图表工作表
*******************************************************
窗体和控件
(135) UserForms.Add(MyForm).Show ‘添加用户窗体MyForm并显示
(136)TextName.SetFocus ‘设置文本框获取输入焦点
(137) SpinButton1.Value=0 ‘将数值调节钮控件的值改为0
(138) TextBox1.Text=SpinButton1.Value ‘将数值调节钮控件的值赋值给文本框控件
SpinButton1.value="/Val(TextBox1.Text)" ‘将文本框控件值赋给数值调节钮控件
CStr(SpinButton1.Value)=TextBox1.Text ‘数值调节钮控件和文本框控件相比较
(139) UserForm1.Controls.Count ‘显示窗体UserForm1上的控件数目
(140) ListBox1.AddItem “Command1” ‘在列表框中添加Command1
(141) ListBox1.ListIndex ‘返回列表框中条目的值,若为-1,则表明未选中任何列表框中的条目
(142) RefEdit1.Text ‘返回代表单元格区域地址的文本字符串
RefEdit1.Text=ActiveWindow.RangeSelection.Address ‘初始化RefEdit控件显示当前所选单元格区域
Set FirstCell=Range(RefEdit1.Text).Range(“A1”) ‘设置某单元格区域左上角单元格
(143) Application.OnTime Now + TimeValue("00:00:15"), "myProcedure" ‘等待15秒后运行myProcedure过程
(144) ActiveWindow.ScrollColumn=ScrollBarColumns.Value ‘将滚动条控件的值赋值给ActiveWindow对象的ScrollColumn属性
ActiveWindow.ScrollRow=ScrollBarRows.Value ‘将滚动条控件的值赋值给ActiveWindow对象的ScrollRow属性
(145) UserForm1.ListBox1.AddItem Sheets(“Sheet1”).Cells(1,1) ‘将单元格A1中的数据添加到列表框中
ListBox1.List=Product ‘将一个名为Product数组的值添加到ListBox1中
ListBox1.RowSource=”Sheet2!SumP” ‘使用工作表Sheet2中的SumP区域的值填充列表框
(146) ListBox1.Selected(0) ‘选中列表框中的第一个条目(注:当列表框允许一次选中多个条目时,必须使用Selected属性)
(147) ListBox1.RemoveItem ListBox1.ListIndex ‘移除列表框中选中的条目
*******************************************************
对象
Application对象
(148) Application.UserName ‘返回应用程序的用户名
(149) Application.Caller ‘返回代表调用函数的单元格
(150) Application.Caller.Parent.Parent ‘返回调用函数的工作簿名称
(151) Application.StatusBar=”请等待……” ‘将文本写到状态栏
Application.StatusBar=”请等待……” & Percent & “% Completed” ‘更新状态栏文本,以变量Percent代表完成的百分比
Application.StatusBar=False ‘将状态栏重新设置成正常状态
(152) Application.Goto Reference:=Range(“A1:D4”) ‘指定单元格区域A1至D4,等同于选择“编辑——定位”,指定单元格区域为A1至D4,不会出现“定位”对话框
(153) Application.Dialogs(xlDialogFormulaGoto).Show ‘显示“定位”对话框,但定位条件按钮无效
(154) Application.Dialogs(xlDialogSelectSpecial).Show ‘显示“定位条件”对话框
(155) Application.Dialogs(xlDialogFormatNumber).show ‘显示“单元格格式”中的“数字”选项卡
Application.Dialogs(xlDialogAlignment).show ‘显示“单元格格式”中的“对齐”选项卡
Application.Dialogs(xlDialogFontProperties).show ‘显示“单元格格式”中的“字体”选项卡
Application.Dialogs(xlDialogBorder).show ‘显示“单元格格式”中的“边框”选项卡
Application.Dialogs(xlDialogPatterns).show ‘显示“单元格格式”中的“图案”选项卡
Application.Dialogs(xlDialogCellProtection).show ‘显示“单元格格式”中的“保护”选项卡
注:无法一次显示带选项卡的“单元格格式”对话框,只能一次显示一个选项卡。
(156) Application.Dialogs(xlDialogFormulaGoto).show Range("b2"), True ‘显示“引用位置”的默认单元格区域并显示引用使其出现在窗口左上角(注:内置对话框参数的使用)
(157) Application.CommandBars(1).Controls(2).Controls(16).Execute ‘执行“定位”话框,相当于选择菜单“编辑——定位”命令
(158) Application.Transpose(Array(“Sun”,”Mon”,”Tur”,”Wed”,”Thu”,”Fri”,”Sat”)) ‘返回一个垂直的数组
(159) Application.Version ‘返回使用的Excel版本号
(160) Application.Cursor = xlNorthwestArrow ‘设置光标形状为北西向箭头
Application.Cursor = xlIBeam ‘设置光标形状为Ⅰ字形
Application.Cursor = xlWait ‘设置光标形状为沙漏(等待)形
Application.Cursor = xlDefault ‘恢复光标的默认设置
(161) Application.WindowState ‘返回窗口当前的状态
Application.WindowState = xlMinimized ‘窗口最小化
Application.WindowState = xlMaximized ‘窗口最大化
Application.WindowState = xlNormal ‘窗口正常状态
(162) Application.UsableHeight ‘获取当前窗口的高度
Application.UsableWidth ‘获取当前窗口的宽度
(163) Application.ActiveCell.Address ‘返回活动单元格的地址(注:返回的是绝对地址)
(164) Application.ActivePrinter ‘返回当前打印机的名称
(165) Application.ActiveSheet.Name ‘返回活动工作表的名称
(166) Application.ActiveWindow.Caption ‘返回活动窗口的标题
(167) Application.ActiveWorkbook.Name ‘返回活动工作簿的名称
(168) Application.Selection.Address ‘返回所选区域的地址
(169) Application.ThisWorkbook.Name ‘返回当前工作簿的名称
(170) Application.CalculationVersion ‘返回Excel计算引擎版本(右边四位数字)及Excel版本(左边两位数字)
(171) Application.MemoryFree ‘以字节为单位返回Excel允许使用的内存数(不包括已经使用的内存)
(172) Application.MemoryUsed ‘以字节为单位返回Excel当前使用的内存数
(173) Application.MemoryTotal ‘以字节为单位返回Excel可以使用的内存数(包括已使用的内存,是MemoryFree和MemoryUsed的总和)
(174) Application.OperatingSystem ‘返回所使用的操作系统的名称和版本
(175) Application.OrganizationName ‘返回Excel产品登记使用的组织机构的名称
(176) Application.FindFormat ‘查找的格式种类
Application.ReplaceFormat ‘替换查找到的内容的格式种类
ActiveSheet.Cells.Replace What:=” “, _
Replacement:=” “,SearchFormat:=True,ReplaceFormat:=True ‘替换查找到的格式
(177) Application.Interactive=False ‘忽略键盘或鼠标的输入
(178) Application.Evaluate("Rate") ‘若在工作表中定义了常量0.06的名称为”Rate”,则本语句将返回值0.06
(179) Application.OnUndo “Undo Option”,“Undo Procedure” ‘选择UndoOption后,将执行Undo Procedure过程
*******************************************************
Range对象
(180) Range(A1:A10).value="/Application.WorksheetFunction.Transpose(MyArray)" ‘将一个含有10个元素的数组转置成垂直方向的工作表单元格区域(A1至A10)
注:因为当把一维数组的内容传递给某个单元格区域时,该单元格区域中的单元格必须是水平方向的,即含有多列的一行。若必须使用垂直方向的单元格区域,则必须先将数组进行转置,成为垂直的。
(181) Range(“A65536”).End(xlUp).Row+1 ‘返回A列最后一行的下一行
(182) rng.Range(“A1”) ‘返回区域左上角的单元格
(183) cell.Parent.Parent.Worksheets ‘访问当前单元格所在的工作簿
(184) Selection.Font.Bold=Not Selection.Font.Bold ‘切换所选单元格是否加粗
(185) ActiveSheet.Range("A:B").Sort Key1:=Columns("B"), Key2:=Columns("A"), _
Header:=xlYes ‘两个关键字排序,相邻两列,B列为主关键字,A列为次关键字,升序排列
(186) cell.Range(“A1”).NumberFormat ‘显示单元格或单元格区域中的第一个单元格的数字格式
(187) cell.Range(“A1”).HasFormula ‘检查单元格或单元格区域中的第一个单元格是否含有公式
或cell.HasFormula ‘工作表中单元格是否含有公式
(188) Cell.EntireColumn ‘单元格所在的整列
Cell.EntireRow ‘单元格所在的整行
(189) rng.Name.Name ‘显示rng区域的名称
(190) rng.Address ‘返回rng区域的地址
(191) cell.Range(“A1”).Formula ‘返回包含在rng区域中左上角单元格中的公式。
注:若在一个由多个单元格组成的范围内使用Formula属性,会得到错误;若单元格中没有公式,会得到一个字符串,在公式栏中显示该单元格的值。
(192) Range(“D5:D10”).Cells(1,1) ‘返回单元格区域D5:D10中左上角单元格
(193) ActiveCell.Row ‘活动单元格所在的行数
ActiveCell.Column ‘活动单元格所在的列数
(194) Range("A1:B1").HorizontalAlignment = xlLeft ‘当前工作表中的单元格区域数据设置为左对齐
(195) ActiveSheet.Range(“A2:A10”).NumberFormat=”#,##0” ‘设置单元格区域A2至A10中数值格式
(196) rng.Replace “ “,”0” ‘用0替换单元格区域中的空单元格
*******************************************************
Collection与object
(197) Dim colMySheets As New Collection
Public colMySheets As New Collection ‘声明新的集合变量
(198) Set MyRange=Range(“A1:A5”) ‘创建一个名为MyRange的对象变量
(199) .Add Cell.Value CStr(Cell.Value) ‘向集合中添加惟一的条目(即将重复的条目忽略)
*******************************************************
Windows API
(200) Declare Function GetWindowsDirectoryA Lib “kernel32” _
(ByVal lpBuffer As String,ByVal nSize As Long) As Long ‘API函数声明。返回安装Windows所在的目录名称,调用该函数后,安装Windows的目录名称将在第一个参数lpBuffer中,该目录名称的字符串长度包含在第二个参数nSize中
(By fanjy in 2006-6-24)
9. 不打开工作簿取值
' Retrieves a value from a closed workbook
‘http://www.experts-exchange.com/Software/Office_Productivity/Office_Suites/MS_Office/Excel/Q_21848838.html?qid=21848838
Private Function GetValue(path, file, sheet, ref)
Dim arg As String
'确保文件存在
If Right(path, 1) <> "\" Then path = path & "\"
If Dir(path & file) = "" Then
GetValue = "File Not Found"
Exit Function
End If
'创建参数
arg = "'" & path & "[" & file & "]" & sheet & "'!" & _
Range(ref).Range("A1").Address(, , xlR1C1)
'执行宏
GetValue = ExecuteExcel4Macro(arg)
End Function
Sub TestGetValue()
p = "c:\XLFiles\Budget"
f = "99Budget.xls"
s = "Sheet1"
a = "A1"
MsgBox GetValue(p, f, s, a)
End Sub
10. 轨迹变色 by:Nothwolves
‘轨迹变色.xls
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=237019&page=1&px=0
Sub Macro4()
'by:northwolves
'2007/4/28
Application.ScreenUpdating = False
Dim n As Long
n = [d65536].End(xlUp).Row
[k2].FormulaArray = "=IF(COUNTIF(R1C4:R[-1]C4,RC6),MAX((R1C4:R[-1]C4=RC6)*ROW(R1C4:R[-1]C4)),0)"
‘从D1到当前行区域中查找当前行F列,取得最近的相等值的行数
[k2].AutoFill [k2].Resize(n - 1, 1)
‘复制到数据最下端
[h2].Resize(n - 1, 1) = "=IF(RC11>0,RIGHT(LARGE(OFFSET(R1C4,RC[3]-1,0,1,3),1)+LARGE(OFFSET(R1C4,RC[3]-1,0,1,3),2),1),"""")"
‘利用K列辅助列,求得两个大值相加之和的个位数
[i2].Resize(n - 1, 2) = "=IF(LEN(RC[-1]),RIGHT(RC[-1]+1),"""")"
‘I、j列同行赋值
[h:j] = [h:j].Value
‘用数值选择性粘贴到原位
[k2].Resize(n - 1, 1) = ""
‘删除辅助列
[h2].Resize(n - 1, 3).Select
‘运用条件格式公式,相同数字变红色
Selection.FormatConditions.Delete
Selection.FormatConditions.Add Type:=xlExpression, Formula1:="=COUNTIF($D2:$F2,H2)>0"
Selection.FormatConditions(1).Font.ColorIndex = 3
[h1].Select
Application.ScreenUpdating = True
End Sub
Sub macro1()
'by:northwolves
'2007/4/28
Dim r As Range, i As Long, n As Long, v As Byte
n = [d65536].End(xlUp).Row
[h:j].Delete
For i = 2 To n
Set r = [d1].Resize(i - 1, 1).Find(Cells(i, 6), , , , , xlPrevious)‘从D1-I上一行区域中查找F列I行的值
If Not r Is Nothing Then
v = (WorksheetFunction.Large(r.Resize(1, 3), 1) + WorksheetFunction.Large(r.Resize(1, 3), 2)) Mod 10‘三个数中两个大的相加,取个位数
For j = 0 To 2
Cells(i, 8 + j) = (v + j) Mod 10‘H、I、J三列赋值
If WorksheetFunction.CountIf(Cells(i, 4).Resize(1, 3), Cells(i, 8 + j)) > 0 Then Cells(i, 8 + j).Font.Color = vbRed
‘如果在DEF列中有相同的数,字体变红色
Next
End If
Next
[h1].Resize(n, 3).Borders.LineStyle = 1
‘加边框
MsgBox "ok"
End Sub
11. 用字典筛选重复值 by:oobird
Private Sub CommandButton3_Click()
‘by:oobird
‘dictionary查找.xls
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=239140&page=1&px=0
Dim dic As Object, i%
Columns(2).Clear
Set dic = CreateObject("Scripting.Dictionary")
For i = 1 To 10
If Not dic.exists(Application.Large([a1:a10], i)) Then‘用最大值排序
dic.Add Application.Large([a1:a10], i), ""
End If
Next
Range("b1").Resize(dic.Count, 1) = WorksheetFunction.Transpose(dic.keys)
Set dic = Nothing
End Sub
狼版主的颜色对应Hex值
http://club.excelhome.net/dispbbs.asp?boardid=2&id=239127&star=1#838565
http://100055.myabc.cn/home/blog/view/6931.htm
12. 用字典筛选重复值,计数 by:oobird
Sub yy()
'by:oobird
'http://club.excelhome.net/dispbbs.asp?boardID=2&ID=244818&page=1&px=0
‘多条件计数.xls
'2007/6/5
Dim arr, arr2, i&, x$
arr = Sheet1.[a2:b3122] '赋值给数组
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr)
x = arr(i, 1) & arr(i, 2)
If Not d.exists(x) Then
d.Add x, 1
Else
d(x) = d(x) + 1
End If
Next
ReDim arr2(1 To 3121)
For i = 1 To UBound(arr)
x = arr(i, 1) & arr(i, 2)
arr2(i) = d(x)
Next i
[c2].Resize(3121, 1) = Application.Transpose(arr2)
End Sub
13. 取剪贴板数据,测试多空格,导入文本
By:lipton
Sub test()
Dim arr
Dim mydata As New DataObject
Dim s As String
mydata.GetFromClipboard '取剪贴板数据
s = mydata.GetText
Do Until InStr(s, " ") = 0 '测试是否有两个以上空格
s = VBA.Replace(s, " ", " ") '替换成一个空格
Loop
arr = VBA.Split(s, " ") '用空格分成数组
Sheet4.Cells(2, 1).Resize(1, UBound(arr) + 1) = arr '写进工作表
End Sub
14. 数据有效性,限制输入和修改
By:gvntw
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=249448&page=1&px=0
Private Sub Worksheet_Change(ByVal Target As Range)
'如果目标行不是B列就不执行此代码,否则如果A列单元格不等于当前系统日期,则:
'不能输入或者修改。也即只能当日输入和修改。
If Target.Column <> 2 Then Exit Sub
Application.EnableEvents = False
If Target.Offset(, -1) <> Date Then Application.Undo
Application.EnableEvents = True
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'如果目标行不是B列就不执行此代码,否则设置数据有效性为:
'只能输入整数,介于1-50
If Target.Column <> 2 Then Exit Sub
With Selection.Validation
.Delete
.Add Type:=xlValidateWholeNumber, Operator:=xlBetween, Formula1:="1", Formula2:="50"
End With
End Sub
15. 导出全部区位码字库
Sub getallquwei()
'导出全部区位码字库
'by: northwolves
Dim i As Byte, j As Byte, k As Byte, n As Integer, arr(1 To 1000, 1 To 10)
n = 1
For i = 16 To 87
For j = 1 To IIf(i = 55, 89, 94)
k = k + 1
arr(n, k) = Chr("&H" & Hex(i + 160) & Hex(j + 160)) & "(" & i & Format(j, "00") & ")"
If k = 10 Then k = 0: n = n + 1
Next j
Next i
[a1:j1000] = arr
End Sub
16. 有条件连续输入递增数字
(数组赋值)
Private Sub CommandButton1_Click()
'by:Northwolves
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=250658&page=1&px=0
Dim arr(1 To 65536, 1 To 1), i As Long, j As Long, n As Long, arr2
Application.ScreenUpdating = False
arr2 = [a1].Resize([a65536].End(xlUp).Row, 1) ‘数组赋值
For i = 1 To UBound(arr2)
For j = 1 To arr2(i, 1)
n = n + 1
arr(n, 1) = i
Next
Next
[b1:b65536] = arr
Application.ScreenUpdating = True
MsgBox "ok"
End Sub
17. 运用字典对象汇总
(数组赋值)
Sub yy()
Dim i%, j%, m%, n%, rng, d As Object, w$, ar() '声明变量
Set d = CreateObject("Scripting.Dictionary") '创建字典对象d
n = [a65536].End(xlUp).Row '判断 A列数据使用过的最后行数的值。包括其中有数据的空行.就是从A65536单元格向上查找,第一个有内容的单元格。
m = 1 '赋值1 给变量m
rng = Range("a2:j" & n) '把区域A2:Jn的值赋值给数组变量rng
ReDim ar(1 To n - 1) '重新声明数组变量ar的大小
For i = 1 To n - 1 '开始循环
On Error Resume Next '如果出现错误,就执行下一条
w = rng(i, 2) '把编码赋值给变量w
d.Add w, m '把编码和序号m值加入字典对象
m = m + 1 '把序号+1
If Err.Number = 0 Then '如果编码是唯一的话
ar(i) = rng(i, 10) '把金额赋值给数组变量ar
Else '否则
s = d(w) '这一个编码在字典里的序号赋值给变量s
ar(s) = ar(s) + rng(i, 10) '金额累加汇总
End If
Next i
[k2].Resize(n - 1, 1) = Application.WorksheetFunction.Transpose(ar) '把汇总以后金额转置到K列
End Sub
18. Err.Number
(VBA帮助文件选)
Sub test()
On Error GoTo out
Dim x, y
x = 1 / y ' 引发一个“除以零”的错误
Exit Sub
out:
MsgBox Err.Number
MsgBox Err.Description
' 检查是否发生“除以零”的错误
If Err.Number = 11 Then
y = y + 1
End If
Resume
End Sub
19. 运用字典对象排序(行排序)
(数组赋值、数组按不重复值的大小排序、按它的次数排序)
Sub yy()
'by:oobird
‘数组求助.xls
Dim i%, c As Range, x, d As Object
Set d = CreateObject("Scripting.Dictionary")
For Each c In Sheet2.UsedRange
If c.Value <> "" Then
If Not d.exists(c.Value) Then
d.Add c.Value, 1
Else
d(c.Value) = d(c.Value) + 1
End If
End If
Next
k = d.keys: t = d.items 'k是各个不重复值,t是各个不重复值的个数
ReDim x(1 To 2, 1 To d.Count)
For i = 1 To d.Count
x(2, i) = Application.Large(k, i) ‘从大到小排序
x(1, i) = d(x(2, i))
Next i
With Sheet3 ‘增加辅助表格,排序后返回表1,不影响表1的其它数据
.[b2].Resize(2, i - 1) = x ‘两行一起赋值
.[b2].Resize(2, i - 1).Copy .[b5]
.[b5].Resize(2, i - 1).Sort Key1:=[b5], Order1:=xlDescending, Header:=xlNo, _
OrderCustom:=1, Orientation:=xlLeftToRight ‘行排序
.[b5].Resize(2, i - 1).Copy Sheet1.[b5]
End With
With Sheet1
.[b2].Resize(2, i - 1) = x
End With
Set d=nothing
End Sub
Sub yy1()
‘by:oobird
Dim i%, c As Range, x, d As Object
Set d = CreateObject("Scripting.Dictionary")
For Each c In Sheet2.UsedRange
If c.Value <> "" Then
If Not d.exists(c.Value) Then
d.Add c.Value, 1
Else
d(c.Value) = d(c.Value) + 1
End If
End If
Next
k = d.keys: t = d.items 'k是各个不重复值,t是各个不重复值的个数
ReDim x(1 To 2, 1 To d.Count)
For i = 1 To d.Count
x(2, i) = Application.Large(k, i) ‘从大到小排序
x(1, i) = d(x(2, i))
Next i
With Sheet1
.[b2].Resize(2, i - 1) = x
ReDim x(1 To 2, 1 To d.Count)
For i = 1 To d.Count
x(1, i) = Application.Max(t) ‘从大到小排序
w = Application.Match(x(1, i), t, 0) – 1 ‘查找此值在不重复值系列中的排位,因为w是从0开始的,所以-1
x(2, i) = k(w) ‘求得对应的不重复值
t(w) = "" ‘使前面的最大值为空,继续循环
Next i
.[b5].Resize(2, i - 1) = x ‘两行一起赋值给B5开始的单元格
End With
End Sub
20. Dictionary对象的成员概要
http://www.phome.net/document/asp/200504/asp111246376614560.html
表5-2和表5-3列出了Dictionary对象的属性和方法及相应的说明。
当增加一个键/条目对时,如果该键已存在;或者删除一个键/条目对时,该关键字/条目对不存在,或改变已包含数据的Dictionary对象的CompareMode,都将产生错误。
表5-2 Dictionary对象的属性和说明
属 性 说 明
CompareMode (仅用于VBScript)设定或返回键的字符串比较模式
Count 只读。返回Dictionary里的键/条目对的数量
Item(key) 设定或返回指定的键的条目值
Key(key) 设定键值
表5-3 Dictionary对象的方法和说明
方 法 说 明
Add(key,item) 增加键/条目对到Dictionary
Exists(key) 如果指定的键存在,返回True,否则返回False
Items() 返回一个包含Dictionary对象中所有条目的数组
Keys() 返回一个包含Dictionary对象中所有键的数组
Remove(key) 删除一个指定的键/条目对
RemoveAll() 删除全部键/条目对
21. 多表比较(数组和Union方法)
Sub macro1()
'by:Northwolves
'2007年包装工7月份-1.xls
On Error Resume Next
Dim sh As Worksheet, n As Long, i As Long, j As Long, ARR
Application.ScreenUpdating = False
For Each sh In Sheets
If sh.Name Like "D*" Then
n = sh.[A65536].End(xlUp).Row
ARR = sh.[a1].Resize(n, 8)
For i = 3 To n - 1
For j = i + 1 To n
If ARR(i, 1) & ARR(i, 2) = ARR(j, 1) & ARR(j, 2) Then
If Not ARR(i, 5) & ARR(i, 8) = ARR(j, 5) & ARR(j, 8) Then _ Union(sh.Cells(i, 2), sh.Cells(j, 2)).Interior.Color = vbRed
End If
Next j
Next i
End If
Next sh
Application.ScreenUpdating = True
22. End Sub
23. 不打开工作薄在指定文件夹内取数 by:northwolves
对于固定格式,固定表名的工作薄的汇总,还是建议选择ADO+SQL.假如文件夹内有成百上千个表,由于不必逐个在前台打开工作薄,ADO将表现出其绝对的优势,参考以下代码:
‘http://club.excelhome.net/dispbbs.asp?boardid=2&ID=262194
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False
Dim f As String, n As Long, n0 As Long
[a6:r65536] = ""
n = 6
n0 = 6
'On Error Resume Next
f = Dir(ThisWorkbook.Path & "\*.xls")
With CreateObject("ADODB.Connection")
While f > ""
If Not f = "查询.xls" Then
.Open "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;Hdr=No;imex=1';Data Source=" & ThisWorkbook.Path & "\" & f
Cells(n0, 2).CopyFromRecordset .Execute("select * from [应收+实收$a7:r100] where f1='" & [b2] & "' or f4='" & [b2] & "'")
n = [b65536].End(xlUp).Row + 1
Cells(n0, 1).Resize(n - n0, 1) = .Execute("select * from [应收+实收$b3:b3]")(0)
n0 = n
.Close
End If
f = Dir
Wend
End With
[a6:r65536].Sort [a6]
Range("cx6:cx22").Select
Selection.NumberFormatLocal = "m-d;@"
Range("A6").Select
Application.ScreenUpdating = True
End Sub
24. ADODBRecordset中取不重复值
Public Sub RunMacro()
'http://www.excelpx.com/dispbbs.asp?boardid=5&id=25884&star=1#105942
Dim lcConnectString, lcCommandText As String
Dim loADODBConnection As ADODB.Connection
Dim loADODBRecordset As ADODB.Recordset
ActiveWorkbook.Save
lcConnectionString = "Driver={Microsoft Excel Driver (*.xls)}; " & _
"DBQ=" + ActiveWorkbook.FullName + ";" & _
"ReadOnly=True"
lcCommandText = "select distinct 学生,到过的国家 from [sheet1$]"
Set loADODBConnection = CreateObject("ADODB.Connection")
Set loADODBRecordset = CreateObject("ADODB.Recordset")
loADODBConnection.Open lcConnectionString
loADODBRecordset.Open lcCommandText, loADODBConnection, 3, 1, 1
Sheets.Add
Dim r, f As Integer
r = 1
For f = 0 To loADODBRecordset.Fields.Count - 1
Sheets(1).Cells(r, f + 1) = loADODBRecordset.Fields(f).Name
Next
While Not loADODBRecordset.EOF
r = r + 1
For f = 0 To loADODBRecordset.Fields.Count - 1
Sheets(1).Cells(r, f + 1) = loADODBRecordset.Fields(f).Value
Next
loADODBRecordset.MoveNext
Wend
loADODBConnection.Close
25. End Sub
26. 统计及取不重复值 by:oobird
By:oobird
http://club.excelhome.net/dispbbs.asp?boardid=2&id=265510&star=1#998519
Sub Macro1()
Dim w
w = "Sheet1!" & Application.ConvertFormula(Sheet1.UsedRange.Address, xlA1, xlR1C1, 1) ‘转换公式成地址转换
‘”Sheet1!R1C1:R14C4”
With Sheet2
.UsedRange.Clear
.[a1].Consolidate w, xlSum, 1, 1 ‘Sources:=w,Function:=xlSum,TopRow:=True,LeftColumn:=True
End With
End Sub
Sub yy()
'by:oobird
Dim n%
With Sheet1
n = .[a1].End(xlDown).Row ‘A1是字段名
.Range("A1:A" & n).AdvancedFilter 2, , Sheet2.[a1], 1
End With
End Sub
Match方法:
查找数组第2列里有“A”字符串:
arr = [a1:b10]arr2 = Application.Index(arr, , 2)If IsError(Application.Match("A", arr2, 0)) Then MsgBox "不包含A"Else MsgBox "包含A"End If
Filter方法:
If UBound(Filter(Application.Transpose(arr2), "A")) >= 0 Then MsgBox "包函A"
27. 数组赋值及取不重复值 By:山菊花
Private Sub CommandButton1_Click()
‘http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=569457&id=196095&page=1&skin=0&Star=2
‘数组入门11.xls
Dim xm() As String, Arr() As String, Temp() As String '声明变量
Dim s%, r% '声明单值变量
On Error Resume Next '启动一个错误处理程序
xm = Split(Range("a1"), ",") '用A1单元格的数据创建数组
r = 0 '初值
s = UBound(xm) '最大下标
For i = 0 To s '循环,数组中取不重复值
Temp = Filter(Arr, xm(i)) '搜索数组
If UBound(Temp) = -1 Then '如果未找到(数组的上限=-1,说明该数组为空,即没有元素)
r = r + 1 '序号,自增1
ReDim Preserve Arr(1 To r) '定义动态数组大小
Arr(r) = xm(i) '把姓名复制到数组Arr()中。
End If
Next
Range("a2").Resize(1, r) = Arr '填充到工作表的一行之中
'Range("a2") = Join(Arr, ",") '填充到工作表的A2之中
End Sub
By:Unarthur
取工作表区域的绝对引用公式到数组:arr=[a1:c5].Formula
2,取工作表区域的相对引用公式到数组:arr=[a1:c5].Formular1c1
3,取工作表区域的转置到数组:arr=Application.Transpose([a1:c5]) 数组间也可以转置:arr1=Application.Transpose(arr)
4,取数组arr的第n列赋值到某列区域:[e1:e5]=Application.Index(arr, , n) 或者赋值产生一个新数组:arr1=Application.Index(arr, , n)
5,同理,取数组arr的第n行赋值到某行区域:[a6:c6]=Application.Index(arr,n ) 或者赋值产生一个新数组:arr1=Application.Index(arr, n )
数组技巧.xls
Private Sub CommandButton1_Click()
arr = [a4:c8].Formula '将公式保存到数组
[e4:g8] = arr
End Sub
Private Sub CommandButton2_Click()
arr = [a13:c17].FormulaR1C1 '将公式保存到数组
[e13:g17] = arr
End Sub
Private Sub CommandButton3_Click()
arr = Application.Transpose([a22:c26])
[e22:i24] = arr
End Sub
Private Sub CommandButton4_Click()
arr = [e22:i24]
[k22:m26] = Application.Transpose(arr)
End Sub
Private Sub CommandButton5_Click()
arr = [a32:c36]
[e32:e36] = Application.Index(arr, , 3)
End Sub
Private Sub CommandButton6_Click()
arr = [a42:c46]
[e42:g42] = Application.Index(arr, 3)
28. End Sub
29. SQL中用字符串变量和数值型变量
'sql中包含并使用变量str (注意该变量是字符串)
Private Sub CommandButton7_Click()
Dim str As String
str = "my5"
Set conn = New ADODB.Connection: conn.Open "dsn=excel files;dbq=" & ThisWorkbook.Path & "\db.xls"
sql = "select * from [a$] where xm='" & str & "'"
[a2].CopyFromRecordset conn.Execute(sql): conn.Close: Set conn = Nothing
End Sub
'sql中包含并使用变量nl2 (注意该变量是数值型)
Private Sub CommandButton8_Click()
nl2 = 10
Set conn = New ADODB.Connection: conn.Open "dsn=excel files;dbq=" & ThisWorkbook.Path & "\db.xls"
sql = "select * from [a$] where nl= " & nl2 & ""
[a2].CopyFromRecordset conn.Execute(sql): conn.Close: Set conn = Nothing
End Sub
30. 把一组汉字变为一组汉字拼音的第一个字母的自定义函数
By:一念
Option Compare Text
Function PY(ByVal rng As Range)
Dim i%, k%, str$
str = Replace(Replace(rng, " ", ""), " ", "")
For i = 1 To Len(str)
If Mid(str, i, 1) < "吖" Then
PY = PY & Mid(str, i, 1)
Else
k = 1
Do Until Mid("八擦哒妸发旮铪讥讥咔垃妈拿哦妑七然仨他哇哇哇夕丫匝咗", k, 1) > Mid(str, i, 1)
k = k + 1
Loop
PY = PY & Chr(64 + k)
End If
Next
End Function
31. 时间转换DatePart、Choose函数
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=269922&page=1&px=0
Sub aa()
Dim x%, aa$, Myday, Myr%
Myr = [a65536].End(xlUp).Row
For x = 2 To Myr
Myday = Day(Cells(x, 1))
Cells(x, 2) = Format(VBA.DatePart("ww", Cells(x, 1)), "00")
Cells(x, 3) = DatePart("q", Cells(x, 1))
Cells(x, 4) = Application.Choose(Myday \ 10 + 1, "上旬", "中旬", "下旬")
Next x
End Sub
32. 数据有效性不重复值 By:oobird
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=270071&page=1&px=0
Sub yy()
Dim i%, x(), rng
Set d = CreateObject("Scripting.Dictionary")
rng = Sheet5.Range(Sheet5.[b2], Sheet5.[b2].End(xlDown))
For i = 1 To UBound(rng)
c = d(rng(i, 1))
Next
With [b3].Validation
.Delete
.Add Type:=xlValidateList, Formula1:=Join(d.keys, ",")
End With
33. End Sub
34. 数组重复值的个数为最大
‘Book1007.xls
‘http://excel.aa.topzj.com/thread-394037-1-1.html
Sub zuiduo1009()
'2007/10/9
Dim arr, arr2, i%, j%, x$, d As Object, t, n%, k, aa, r1
Sheets("Sheet2").Activate
arr = [a1:gh500] '赋值给数组
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To 500
For j = 1 To 190
x = arr(i, j)
If Not d.exists(x) Then
d.Add x, 1
Else
d(x) = d(x) + 1
End If
Next j
Next i
n = d.Count
‘不重复值的数量
t = d.items ‘各个重复值的重复次数数组
k = d.keys ‘不重复值的数组
For i = 0 To n - 1
Cells(i + 1, "gj") = t(i)
Cells(i + 1, "gk") = k(i)
Next i
aa = Application.WorksheetFunction.Max(t)
Set r1 = Range("gj1:gj" & n).Find(aa)
If Not r1 Is Nothing Then
[gl1] = Cells(r1.Row, "gk")
End If
End Sub
35. 两条直线的交点坐标(单变量求解、Replace、Iif、Like、Evaluate、绝对引用)by:狼版主
‘直线交点坐标.xls
‘http://club.excelhome.net/dispbbs.asp?boardid=2&id=272572&star=1#1044619
Sub macro1()
Dim q1 As String, q2 As String
q1 = "y=9-2x"
q2 = "y=x-3"
[a2] = Replace(Mid(q1, 2), "x", IIf(q1 Like "*[=+-]x*", "", "*") & "r1c1") & "-(" & Replace(Mid(q2, 3), "x", IIf(q2 Like "*[=+-]x*", "", "*") & "r1c1") & ")"
[a2].GoalSeek 0, [a1]
MsgBox "x=" & [a1] & vbCrLf & "y=" & Evaluate(Replace(Mid(q1, 3), "x", IIf(q1 Like "*[=+-]x*", "", "*") & [a1]))
[a1:a2] = ""
End Sub
用IIf(q1 Like "*[=+-]x*", "", "*")来判别q1里面x前面是数字还是=+-号
[a4] = Replace(Mid(q1, 2), "x", IIf(q1 Like "*[=+-]x*", "", "*") & "r1c1") [a4]单元格里是绝对引用的公式=9-2*$A$1,A1值改变A4值也改变;
[a5] = Replace(Mid(q1, 3), "x", IIf(q1 Like "*[=+-]x*", "", "*") & [a1]) [a5]单元格里是文本,因为没有”=”,9-2*4,引用的是A1的值;
[a6] = Replace(Mid(q1, 2), "x", IIf(q1 Like "*[=+-]x*", "", "*") & [a1]) [a6]单元格里是数值1,公式=9-2*4, A1值改变A4值不改变。
36. 多行独立排序 by:狼版主
Sub 多行独立排序()
Dim I As Long
With [B1].Resize(1, [B1].End(xlToRight).Column - 1)
For I = 0 To [A1].End(xlDown).Row - 1
.Offset(I, 0).Sort Key1:=[B1].Offset(I, 0), Order1:=xlDescending, Orientation:=xlLeftToRight
Next
End With
End Sub
或
Sub 多行独立排序()
Dim I As Long
For I = 1 To [A1].End(xlDown).Row
Rows(I).SpecialCells(xlCellTypeConstants, 23).Offset(, 1).Sort Key1:=Cells(I, 2), Order1:=xlDescending, Orientation:=xlLeftToRight
Next
End Sub
37. 列数据转换成行数据 by:狼版主
‘原始统计数据.xls
‘http://club.excelhome.net/dispbbs.asp?boardid=2&id=292081&star=1#1166135
Sub Macro1()
Dim i As Long, j As Long, arr, brr, temp, n As Long, k As Long
arr = Sheets("原始考勤数据").[a1].CurrentRegion
ReDim brr(1 To UBound(arr), 1 To 20)
For i = 1 To UBound(arr)
If arr(i, 3) <> temp Then
n = n + 1
k = 0
For k = 1 To 4
brr(n, k) = arr(i, k)
Next
temp = arr(i, 3)
Else
brr(n, k) = arr(i, 4)
k = k + 1
End If
Next
Sheets("Sheet1").[a1].Resize(n, 20) = brr
Sheets("Sheet1").[D:T].NumberFormat = "h:mm;@"
End Sub
38. 单元格控制加载宏执行 by:喵喵
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Workbooks.Open Filename:="d:\My Documents\My QQ Files\全部计算.xla"
Application.Run ("计算")
End If
End Sub
39. 汇总(字典,数组) by:oobird
‘http://www.excelpx.com/dispbbs.asp?boardID=5&ID=35534&page=1
Sub kf2()
Dim d As Object, a, b, j%, w!
Dim ss As String, n As Integer, x
Me.UsedRange.Offset(3, 0) = ""
‘这句用法没见过
a = Sheet1.Range(Sheet1.[a4], Sheet1.[i65536].End(xlUp))
Set d = CreateObject("scripting.dictionary")
ReDim b(1 To UBound(a), 1 To 8)
For i = 1 To UBound(a)
ss = a(i, 1) & a(i, 2) & a(i, 4) & a(i, 5) & a(i, 6) & a(i, 8)
If Not d.Exists(ss) Then
n = n + 1
d.Add ss, n
b(n, 1) = a(i, 2): b(n, 2) = a(i, 5): b(n, 3) = a(i, 6): b(n, 4) = a(i, 4)
b(n, 5) = a(i, 1): b(n, 6) = a(i, 8): b(n, 7) = a(i, 9)
Else
b(d(ss), 7) = b(d(ss), 7) & "+" & a(i, 9)
End If
Next
For i = 1 To d.Count‘本来用evaluate方法的,但是受限于其参数需<256个字符
x = Split(b(i, 7), "+")‘改用此法,甚妙!
For j = 0 To UBound(x)
w = w + x(j)
Next j
b(i, 8) = b(i, 5) * b(i, 6) * w / 100: w = 0
Next
[b4].Resize(n, 8) = b
End Sub
40. 人员分类(数组) by:山菊花
‘山菊花_VBA(数组)人员分类.xls
Private Sub CommandButton1_Click()
Application.ScreenUpdating = False '运行下面程序时,不进行屏幕刷新
Dim nR_a%, nR_b%, cBy$ '声明变量
Dim s1%, s2%, s3%, Arr1(), Arr3()
nR_a = Range("a65536").End(xlUp).Row 'A列最后一行的行号
Sy = WorksheetFunction.Transpose(Range("a3:a" & nR_a)) '上月名单保存到数组
nR_b = Range("b65536").End(xlUp).Row 'B列最后一行的行号
By = WorksheetFunction.Transpose(Range("b3:b" & nR_b)) '本月名单保存到数组
Range("c3:f" & nR_a + nR_b + 2).ClearContents '清除C至F列原来结果
cBy = Join(By, ",") '把本月名单转换到单值变量cBy中
s = UBound(Sy) '上月人数
s1 = 0: s2 = 0: s3 = 0 '给变量赋初值
For i = 1 To s '循环上月名单
If InStr(cBy, Sy(i) & ",") > 0 Or Right(cBy, Len(Sy(i))) = Sy(i) Then '如果在本月名单中找到上月名单中的名字(留守人员)
If Right(cBy, Len(Sy(i))) = Sy(i) Then
cBy = Left(cBy, Len(cBy) - Len(Sy(i))) '在cby中删除找到的名字
Else
cBy = Replace(cBy, Sy(i) & ",", "")
End If
s1 = s1 + 1
ReDim Preserve Arr1(1 To s1) '重新定义动态数组Arr1
Arr1(s1) = Sy(i) '把该名字保存到数组Arr1中
Else
s3 = s3 + 1
ReDim Preserve Arr3(1 To s3)
Arr3(s3) = Sy(i) '如果在本月名单中找不到上月中的名字,把该名字保存到数组Arr3中(离开人员)。
End If
Next
Arr2 = Split(cBy, ",") '把cby剩余的名字保存到数组Arr2中(新增人员)
s2 = UBound(Arr2) + 1
With WorksheetFunction
Range("d3").Resize(s1) = .Transpose(Arr1) '把数组的值输出到工作中
Range("e3").Resize(s2) = .Transpose(Arr2)
Range("f3").Resize(s3) = .Transpose(Arr3)
End With
'把各数组元素添加人员性质“留守、新增、离开”,再输出到工作表C列:
s = IIf(s1 > s2, s1, s2)
s = IIf(s > s3, s, s3)
For i = 1 To s
If i <= s1 Then Arr1(i) = Arr1(i) & "留守"
If i <= s2 Then Arr2(i - 1) = Arr2(i - 1) & "新增"
If i <= s3 Then Arr3(i) = Arr3(i) & "离开"
Next
With WorksheetFunction
Range("c3").Resize(s1) = .Transpose(Arr1)
Range("c" & 3 + s1).Resize(s2) = .Transpose(Arr2)
Range("c" & 3 + s1 + s2).Resize(s3) = .Transpose(Arr3)
End With
Application.ScreenUpdating = True '打开屏幕刷新
End Sub
41. 递归(数组、子程序参数) by:Northwolevs
‘http://www.excelpx.com/dispbbs.asp?boardid=5&id=36116&star=1#36116
Sub macro1()
Dim arr() As String
getall 3, "", arr
MsgBox Join(arr, ",")
End Sub
Sub getall(ByVal m As Byte, ByRef a As String, ByRef arr() As String, Optional ByRef count As Long)
If Len(a) = m Then
count = count + 1
ReDim Preserve arr(1 To count)
arr(count) = a
Exit Sub
End If
For i = 1 To m
If InStr(a, Cells(1, 1 + i)) = 0 Then getall m, a & Cells(1, 1 + i), arr, count
Next i
42. End Sub
43. 复制图片到Word by:taller
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=296132&page=1&px=0
VBE,点击工具-》引用,选中“Microsoft Word x.0 Object Lib"
Sub CopyPic2Word()
Dim wd As Word.Application, doc As Word.Document
Set wd = New Word.Application
wd.Visible = True
ActiveSheet.Range("A1:B10").CopyPicture
wd.Documents.Add.Content.Paste
wd.ActiveDocument.SaveAs FileName:="c:\temp\doc1.doc"
End Sub
44. 数字固定和的组合 by:oobird
‘http://www.excelpx.com/dispbbs.asp?boardid=5&id=36715&star=1#261171
‘递归Book0129.xls
‘注:发现有重复数字出现,有重复组合出现。
Sub yy()
Dim s%, i%, sum!, rng, arr(), n%, x%
rng = [b1:b59]
For x = 1 To 30
n = [d65536].End(xlUp).Row + 1
1: sum = 0: i = 0
Do
i = i + 1
ReDim Preserve arr(1 To i)
s = Int(Rnd * 59) + 1
sum = sum + rng(s, 1)
arr(i) = rng(s, 1)
If sum > 88 Then Erase arr: GoTo 1
Loop Until sum = 88
Range(Cells(n, 4), Cells(n, UBound(arr) + 3)) = arr
Next x
'MsgBox Join(arr, "+") & "=88"
End Sub
45. 使菜单的撤销工作表保护命令变灰 by:冰山上的来客
‘http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=748666&id=224965&page=1&skin=0&Star=2
Private Sub Workbook_Open() If Sheet1.ProtectScenarios Then With Application.CommandBars(1).Controls("工具(&T)") .Controls("保护(&P)").Controls("撤消工作表保护(&P)...").Enabled = False End With End IfEnd Sub
彭希仁之破解工作表保护法:
最简单的方法就是,复制工作表粘贴到新的工作表,删除需破解的工作表,将新工作表命名为原来的工作表,这样密码就解开啦。
46. 数组比较法 by:ccwan
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=302620&page=1&px=0
Sub cc()
Dim arr, brr, i&, x&, d As Object
arr = Range("a1:a" & [a65536].End(xlUp).Row)
brr = Range("c1:c" & [c65536].End(xlUp).Row)
Set d = CreateObject("scripting.dictionary")
For i = 1 To UBound(arr)
d(arr(i, 1)) = ""
Next
For x = 1 To UBound(brr)
If d.exists(brr(x, 1)) Then
d.Remove brr(x, 1)
End If
Next
[d1].Resize(d.Count, 1) = Application.Transpose(d.keys)
47. End Sub
48. 数组搜索精确匹配法 by:msdn
‘http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/modcore/html/deconusingfilterfunctiontosearchstringarrays.asp
Function FilterExactMatch(astrItems() As String, _
strSearch As String) As String()
' 该函数在一个字符串数组中搜索那些
' 与搜索字符串完全匹配的元素。
Dim astrFilter() As String
Dim astrTemp() As String
Dim lngUpper As Long
Dim lngLower As Long
Dim lngIndex As Long
Dim lngCount As Long
' 为搜索字符串而过滤数组。
astrFilter = Filter(astrItems, strSearch)
' 存储结果数组的上限和下限。
lngUpper = UBound(astrFilter)
lngLower = LBound(astrFilter)
' 将临时数组调整到相同大小。
ReDim astrTemp(lngLower To lngUpper)
' 在经过滤的数组的每个元素中循环。
For lngIndex = lngLower To lngUpper
' 检查该元素是否与搜索字符串完全匹配。
If astrFilter(lngIndex) = strSearch Then
' 在另一个数组中存储完全匹配的元素。
astrTemp(lngCount) = strSearch
lngCount = lngCount + 1
End If
Next lngIndex
' 重新调整包含完全匹配的元素的数组的大小。
ReDim Preserve astrTemp(lngLower To lngCount - 1)
' 返回包含完全匹配的元素的数组。
FilterExactMatch = astrTemp
End Function
49. 导出不重复值为文本文件(字典法) by:山版主
‘小新666_导出.xls
Private Sub CommandButton1_Click()
Dim nR1%, nR2%, ds, cTxt$
On Error Resume Next
Set ds = CreateObject("scripting.dictionary") '定义字典
Open "f:\txt\" & Left(ThisWorkbook.Name, InStrRev(ThisWorkbook.Name, ".")) & "txt" For Output As #1 '打开文本文件
nR1 = Range("a65536").End(xlUp).Row 'A列最大行号
nR2 = Range("c65536").End(xlUp).Row 'C列最大行号
hm1 = Range("a1:a" & nR1) 'A列数据保存到数组
hm2 = Range("c1:c" & nR2) 'C列数据保存到数组
For i = 3 To nR2 '循环数组2
ds(CStr(hm2(i, 1))) = "" '将数据保存到字典
Next
For i = 3 To nR1 '循环数组1
ds.Add CStr(hm1(i, 1)), "" '添加数据到字典
If Err = 0 Then '如果不重复
cTxt = cTxt & hm1(i, 1) & Chr(13) & Chr(10) '将数据添加到文本变量cTxt中
Else
Err.Clear
End If
Next
Print #1, cTxt '写入到文件文件
Close #1 '关闭文件
MsgBox "导出完毕。", 64, "提示"
End Sub
50. 导出多文本文件 学习山版主
导出文本:
‘导出工具0414.xls 2008-4-14精英论坛
Sub daocuwb0414()
Dim myRng, Filename$, data, f
Dim aa$, n%, i%, Myrc%, Myrh%, Myrj%, wjnm$, shtnm$, m%, bb$, wbnm$
Dim Sht1 As Worksheet, Sht2 As Worksheet, wb As Workbook
Application.ScreenUpdating = False
Set wb = ThisWorkbook
Set Sht1 = wb.Sheets("Sheet1")
Myrc = [c5].CurrentRegion.Rows.Count + 4
Myrh = [h65536].End(xlUp).Row
Myrj = [j65536].End(xlUp).Row
myRng = Range("h5:h" & Myrh)
For x = 5 To Myrj
f = Dir(Cells(x, "j"), vbDirectory) '判断文件夹是否已经存在
If f = "" Then MkDir (Cells(x, "j")) '如果不存在就建立
Next x
For x = 5 To Myrc
Sht1.Activate
m = 0
wjnm = Split(Sht1.Cells(x, 3), ",")(0) '动态工作簿文件名
shtnm = Split(Sht1.Cells(x, 3), ",")(1) '动态工作表名
bb = Left(wjnm, Len(wjnm) - 4)
bb = Left(wjnm, Len(wjnm) - 4)
cc = Len(bb) - Len(Replace(bb, "\", ""))
wbnm = Split(bb, "\")(cc) '目录层数 '加一句cc,再把3改为cc
Workbooks.Open wjnm
Set Sht2 = ActiveWorkbook.Sheets(shtnm)
Sht2.Activate
For y = 5 To Myrh
m = m + 1: col = ""
Filename = Sht1.Cells(y, "j") & wbnm & ".txt"
Range("bh:bh").ClearContents
Columns("bh:bh").NumberFormatLocal = "@"
f1 = Split(Sht1.Cells(y, "h"), ":")(0) '判断列号
For y1 = 1 To Len(f1)
temp = Mid(f1, y1, 1)
If temp Like "[A-Za-z]" Then
col = col & temp '动态区域列号
End If
Next y1
n = Cells(65536, col).End(xlUp).Row
Range(Cells(1, "bh"), Cells(n, "bh")) = Range(Cells(1, col), Cells(n, col)).Value
Set rng = Range(Cells(1, "bh"), Cells(n, "bh"))
'山版主代码 运用数组及join函数一次转换连接成文本
arr = WorksheetFunction.Transpose(Range(Cells(2, "bh"), Cells(n, "bh"))) '把当列数据(从第2行开始)保存到数组
ctxt = Join(arr, Chr(13) & Chr(10)) '连接为文本
Do While InStr(ctxt, " ") > 0 '删除空格
ctxt = Replace(ctxt, " ", "")
Loop
Do While InStr(ctxt, Chr(13) & Chr(10) & Chr(13) & Chr(10)) > 0
ctxt = Replace(ctxt, Chr(13) & Chr(10) & Chr(13) & Chr(10), Chr(13) & Chr(10))
Loop
Open Filename For Output As #1
'Open cPath2(i, 1) & Replace(MyName, ".xls", ".txt") For Output As #1 '打开文本文件
Print #1, ctxt '将数据一次写入文本文件
Close #1 '关闭文本文件
Next y
ActiveWorkbook.Close False
Next x
Application.ScreenUpdating = True
End Sub
51. 农历(XML) by:狼版主
‘http://club.excelhome.net/dispbbs.asp?boardID=2&ID=311057&page=1&px=0
‘10403.xls
‘有农历节气
Sub macro1()
Dim arr, i As Long, s As String
arr = [a2].Resize([a65536].End(xlUp).Row - 1)
With CreateObject("Msxml2.XMLHTTP")
For i = 1 To UBound(arr)
.Open "GET", "http://www.google.cn/search?q=gl" & arr(i, 1), False
.Send
arr(i, 1) = Trim(Split(Split(.responseText, "农历")(1), "<")(0) & Mid(Split(Split(.responseText, "星期")(1), "<")(0), 2))
Next
End With
[b2].Resize(UBound(arr)) = arr
End Sub
‘http://tech.51cto.com/art/200511/11652.htm
Function GetResult(urlStr) Dim xmlHttp Dim retStrSet xmlHttp = CreateObject("Msxml2.XMLHTTP") '创建对象On Error Resume Next '出错处理 xmlHttp.Open "POST", urlStr, False '用POST方式打开连接,异步执行。 xmlHttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" '上传表单xmlHttp.Send '发送指令If Err.Number = 0 Then '如果连接正确 retStr = xmlHttp.responseText '等待并获得服务端返回的结果字符串Else retStr = "Url not found" '否则返回出错信息 End If Set xmlHttp = nothing '释放对象 GetResult = retStr '返回结果 End Function
52. 身份证校验 by:secowu
‘http://club.excelhome.net/dispbbs.asp?boardid=2&replyid=126500&id=35402&page=1&skin=0&Star=2
Public Function sfzjy(sid, xb) ' As Currency
'1、身份证不满15位,2、性别与身份证不符,3、出生月份出错(不在1-12)
'4、出生日期出错(不在1-31范围内),5、18位校验位出错,6、18位身份证年份出借
On Error Resume Next
Dim s1, s2, jym, x
If xb = 1 Then x = 1
If xb = "男" Then x = 1
If xb = 2 Then x = 0
If xb = "女" Then x = 0
s1 = " 7 910 5 8 4 2 1 6 3 7 910 5 8 4 2"
s2 = "10x98765432"
If Len(sid) <> 15 And Len(sid) <> 18 Then
sfzjy = "身份证位数错误"
'测试15位身份证的信息
ElseIf Len(sid) = 15 And Val(Mid(sid, 7, 2)) < 10 Then
sfzjy = "年龄好大,请多多保重!"
ElseIf Len(sid) = 15 And Val(Mid(sid, 9, 2)) > 12 Then
sfzjy = "出生月份错误!"
ElseIf Len(sid) = 15 And Val(Mid(sid, 11, 2)) > 31 Then
sfzjy = "出生日期错误!"
ElseIf Len(sid) = 15 And Mid(sid, 15, 1) Mod 2 <> x Then
sfzjy = "性别错误!"
ElseIf Len(sid) = 15 Then
newid = Left(sid, 6) + "19" + Right(sid, 9)
jym = 0
For i = 1 To 17
jym = jym + Val(Mid(s1, i * 2 - 1, 2)) * Val(Mid(newid, i, 1))
Next i
sfzjy = newid + Mid(s2, jym Mod 11 + 1, 1)
'测试18位身份证的信息
ElseIf Len(sid) = 18 And Val(Mid(sid, 7, 2)) <> 19 Then
sfzjy = "出生年错误!"
ElseIf Len(sid) = 18 And Val(Mid(sid, 9, 2)) < 10 Then
sfzjy = "年龄好大,请多多保重!"
ElseIf Len(sid) = 18 And Val(Mid(sid, 11, 2)) > 12 Then
sfzjy = "出生月份错误!"
ElseIf Len(sid) = 18 And Val(Mid(sid, 13, 2)) > 31 Then
sfzjy = "出生日期错误!"
ElseIf Len(sid) = 18 And Mid(sid, 17, 1) Mod 2 <> x Then
sfzjy = "性别错误!"
Else
newid = Left(sid, 17)
jym = 0
For i = 1 To 17
jym = jym + Val(Mid(s1, i * 2 - 1, 2)) * Val(Mid(newid, i, 1))
Next i
If Mid(s2, jym Mod 11 + 1, 1) <> Mid(sid, 18, 1) Then
sfzjy = "识别码错,应为:" & Mid(s2, jym Mod 11 + 1, 1)
Else
sfzjy = sid
End If
End If
End Function
53. 桌面地址 by:狼版主
Sub 获取当前电脑桌面地址()
MsgBox "当前电脑桌面地址是:" & Environ("USERPROFILE") & "\桌面"
End Sub
‘http://club.excelhome.net/thread-506694-1-1.html###能否增加些作用:
ph = Environ("USERPROFILE") & "\桌面"myDes = ph & "\zm.xls" 'zm可改为你需要的文件名ThisWorkbook.SaveAs myDes
54. 字典法排序 by:oobird
‘http://www.excelpx.com/dispbbs.asp?boardID=5&ID=48575&page=1
Private Sub CommandButton1_Click()
Dim d As Object, rng, i%, j%, arr
Set d = CreateObject("Scripting.Dictionary")
rng = Range("a3:f" & [a65536].End(xlUp).Row)
ReDim arr(1 To UBound(rng), 1 To 4)
For i = 1 To UBound(rng) ‘求得A列的不重复值
d(CStr(rng(i, 1))) = i
Next i
For j = 3 To 5 Step 2
For i = 1 To Cells(65536, j).End(xlUp).Row - 2
If d(CStr(rng(i, j))) <> "" Then
arr(d(CStr(rng(i, j))), j - 2) = rng(i, j) ‘从上面的d(CStr(rng(i, j)))取得i 的值
arr(d(CStr(rng(i, j))), j - 1) = rng(i, j + 1)
End If
Next i
Next j
[c3].Resize(UBound(rng), 4) = arr
End Sub
55. 字典数组法排列转换 by:oobird
‘http://www.excelpx.com/dispbbs.asp?boardID=5&ID=52112&page=1
‘book数组处理2.xls
Sub yy()
'by:oobird
Dim d As Object, rng, c%, i%, k%, arr(1 To 10000, 1 To 100), b(100) As Integer
Set d = CreateObject("Scripting.Dictionary")
rng = Range([a1], [b65536].End(xlUp))
For i = 1 To UBound(rng)
If d(rng(i, 1)) = "" Then
k = k + 1
d(rng(i, 1)) = k
arr(k, 1) = rng(i, 1): arr(k, 2) = rng(i, 2): b(k) = 2
Else
arr(d(rng(i, 1)), b(k) + 1) = rng(i, 2): b(k) = b(k) + 1
c = IIf(b(k) > c, b(k), c)
End If
Next i
[d1].Resize(k, c) = arr
End Sub
56. 横向筛选查询 by:oobird
‘宏实现横向筛选.xls
‘http://www.excelpx.com/dispbbs.asp?boardID=5&ID=52668&page=1
Private Sub Worksheet_Change(ByVal T As Range)
If T.Address <> "$A$1" Or T.Count > 1 Then Exit Sub
c = [2:2].Find(T).Column
[b:n].EntireColumn.Hidden = True
Columns(c).Hidden = False
End Sub
57. 组合 by:狼版主
‘Book数字组合1.xls EH
‘12选5
‘http://club.excelhome.net/dispbbs.asp?boardid=2&id=322092&star=1#322092
DefLng A-F
Sub MACRO1()
F = 1
For A = 1 To 8
For B = A + 1 To 9
For C = B + 1 To 10
For D = C + 1 To 11
For E = D + 1 To 12
F = F + 1
Cells(F, A) = A
Cells(F, B) = B
Cells(F, C) = C
Cells(F, D) = D
Cells(F, E) = E
Next E, D, C, B, A
MsgBox "OK"
End Sub
58. 筛选重复值
‘http://excel.aa.topzj.com/thread-397307-1-1.html
‘请教.xls
Sub sxcfz()
'2008/6/1
Dim arr, arr2, i&, x$
Dim Myr%
[f:g].ClearContents
Myr = [e65536].End(xlUp).Row
arr = Sheet1.Range("e1:e" & Myr) '赋值给数组
Set d = CreateObject("Scripting.Dictionary")
For i = 1 To UBound(arr)
x = arr(i, 1)
If Not d.exists(x) Then
d.Add x, 1
Else
d(x) = d(x) + 1
End If
Next
n = d.Count: m = 1
t = d.items
k = d.keys
For j = 0 To n - 1
If t(j) > 1 Then
Cells(m, 6).Resize(t(j), 1) = Application.Transpose(k(j)): m = m + t(j)
End If
Next j
End Sub
59. 绘制任意正多边形(自定义数据类型) by:Moneky
‘描绘正多边形.xls
‘http://club.excelhome.net/dispbbs.asp?boardid=2&id=328315
‘Sheet1代码
Private Sub CommandButton1_Click()
vDraw [a3].Value, [b3].Value, [c3].Value, [d3].Value, [e3].Value
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If InStr("$C$3$D$3$E$3", Target.Address) > 0 Then Label1.BackColor = RGB([c3].Value, [d3].Value, [e3].Value)
End Sub
‘模块1代码
Type vPoint
X As Single
Y As Single
End Type
Sub vLine(vSheet As Worksheet, X1 As Single, Y1 As Single, X2 As Single, Y2 As Single, vColor As Long)
With vSheet.Shapes.AddLine(X1, Y1, X2, Y2).Line
.ForeColor.RGB = vColor
End With
End Sub
Sub vDraw(vNum As Long, vLength As Single, vR As Long, vG As Long, vB As Long)
Dim vArr() As vPoint
ReDim vArr(vNum - 1)
Dim vPI As Single
Dim vJ As Single
Dim i As