Top Banner

Click here to load reader

1,引用文件路径 - aschool.cnfile2.aschool.cn/files/2016-05/17/17141731931.doc · Web viewReDim arr(1 To rng.Count, 1 To 2)...

Jan 24, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript

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