VBA完整学习笔记1-39集(共60集)

目录

第1集:宏与VBA

1 什么是VBA,它有什么作用

2 VBA在哪里存放的?怎么运行的

3、什么是宏?宏和VBA有什么关系?

4、录制一个宏

5、编写第一个宏

第2集:VBA中的语句、对象、方法与属性

  一、VBA属性

二 、VBA方法

三、VBA对象

四VBA语句

第3集:循环语句

if判断语句

select判断

判断范围

第4集:判断语句

第5集:VBA变量

第6集:函数与公式

'一、在单元格中输入公式

'二、利用单元格公式返回值

'三、借用工作表函数

'四、利用VBA函数

'五、编写自定义函数

第8集:VBA分支与End语句

'一、END语句

'二、Exit语句

分支语句

第7集:VBE编辑器

'一、VBE的窗口

第9集:excel文件操作

excel文件的操作

excel文件的几个概念

第10集:excel工作表操作

工作表文件的操作

excel工作表的分类

 第11集:单元格选取

'1 表示一个单元格(a1)

'2 表示相邻单元格区域

'3 表示不相邻的单元格区域

'4 表示行

'5 表示列

'6 重置坐标下的单元格表示方法

'7 表示正在选取的单元格区域

第12集:特殊单元格定位

'1 已使用的单元格区域

'2 某单元格所在的单元格区域

'3 两个单元格区域共同的区域

'4 调用定位条件选取特殊单元格

'5 端点单元格

实例

第13集:单元格信息

'1 单元格的值

 '2 单元格的地址

 '3 单元格的行列信息

 '4、单元格的格式信息

  '5、单元格批注信息

  '6 单元格的位置信息

  '7 单元格的上级信息

   '8 内容判断

    '9 单元格数据类型(另讲)

第14集:单元格的格式

'一、判断数值的格式

'二、设置单元格自定义格式

单元格合并

 '综合示例

第15集:单元格编辑示例

单元格输入

第16集:单元格查找

单元格查询

入库单实例

第17集:excel事件程序(上)

第18集:工作簿事件

第19集:excel程序事件

第20集:VBA数组-1:数组基础

第1_了解VBA运算特点

第2_什么是VBA数组

第3_VBA数组的写入

第21集:BA数组-2读取

第1_了解VBA运算特点

第2_什么是VBA数组

第3_VBA数组的写入

第4_VBA数组的读取

第22集:数组-3

第5_数组的空间

第23集:数组-4:数组与函数

可以生成数组的函数

数组的处理

第24集:VBA数组-5:数组与单元格格式

'数组也可以设置格式?

第25集:VBA数组之VBA排序算法(上)

插入排序

快速排序

递归快速排序

冒泡排序

第26集:VBA数组-7:VBA排序算法之插入排序和希尔排序

第27集:VBA字典-1

'1 什么是VBA字典?

'2 即然有数组,为什么还要学字典?

'3 字典有什么局限?

'4 字典在哪里?如何创建字典?

字典的使用

第28集:VBA字典-2

字典与查找

字典与求和

字典与唯一值

第29集:VBA数组与字典综合应用之下棋法(兰色原创)

多列汇总

多条件多列汇总

数据透视式汇总

第30集:自定义函数基础

什么是自定义函数

编写和使用自定义函数

自定义函数的常见问题

第31集:自定义函数的参数设置

第32集:Msgbox函数完全应用

Msgbox函数简介

'二、基本语法

设置信息框上的帮助

  特殊值及含义说明

第33集:Inputbox函数方法应用

基本应用

Inputbox语法概述

Inputbox的扩展应用

第34集:调用Excel对话框

'一 FileDialog 对象简介

GetOpenFilename

GetSaveFilename

第35集:字符串的拆分、查找与转换

字符串拆与组合

字符转换

第36集:like运算符的使用

实例

序号    求和类型        对比规则

第37集:正则表达式1

一 正则表达式

'二 使用方法

 '三 常用属性

     入门例子

第38集  正则表达式2

第39集:正则表达式3

其他常用符号

第40集:正则表达式4

第41集:正则表达式5

第42集:数据类型转换

数据类型

数据类型检查

数据类型转换

第43集:时间与日期

第45集:随机抽取之移形换位法

第46集:组合之递归算法

第47集:VBA程序提速

第48集:基本操作

'遍历指定文件夹中的文件

第49集:文件夹遍历

父子转换法

第50集:VBA压缩文件和解压缩

一_压缩文件

二_压缩文件的路径

三_添加压缩密码

四_压缩后删除源文件

五_压缩时排除

六_文件批量单独压缩

七_从压缩包中删除指定文件

八_解压缩

第51 txt 读写

第52集:Txt文件的读取

第53集:窗体与控件基础

第54集:窗体事件

第55集:标签、按钮

第56集:文字框

第57集:列表和组合框

第58集:单选复选和框架和多页

第59、60集:Listview控件

第61集:日期和进度条

第62集:窗体综合实例

第63集:命令栏操作之命令栏

第64集:命令栏操作之自定义命令


第1集:宏与VBA

1 什么是VBA,它有什么作用

  A 实现Excel中没有提供的功能

  B 提高运行速度

  C 编写自定义函数

  D 实现自动化功能

  F 通过插入窗体做小型管理软件

2 VBA在哪里存放的?怎么运行的

3、什么是宏?宏和VBA有什么关系?

4、录制一个宏

5、编写第一个宏

第2集:VBA中的语句、对象、方法与属性

  一、VBA属性

    VBA属性就是VBA对象所具有的特点

    表示某个对象的属性的方法是

        对象.属性=属性值

    Sub ttt()

      Range("a1").Value = 100

    End Sub

    Sub ttt1()

      Sheets(1).Name = "工作表改名了"

    End Sub

    Sub ttt2()

    

       Sheets("Sheet2").Range("a1").Value = "abcd"

    End Sub

    Sub ttt3()

      Range("A2").Interior.ColorIndex = 3

    End Sub

二 、VBA方法

   VBA方法是作用于VBA对象上的动作

     表示用某个方法作用于VBA的对象上,可以用下面的格式:

  Sub ttt4()

 

      牛排.做 熟的程度:=七成熟

     

      Range("A1").Copy Range("A2")

  End Sub

   

  Sub ttt5()

  

    Sheet1.Move before:=Sheets("Sheet3")

    

  End Sub

三、VBA对象

  VBA中的对象其实就是我们操作的具有方法、属性的excel中支持的对象

Excel中的几个常用对象表示方法

 1、工作簿

       Workbooks 代表工作簿集合,所有的工作簿,Workbooks(N),表示已打开的第N个工作簿

       Workbooks ("工作簿名称")

       ActiveWorkbook 正在操作的工作簿

       ThisWorkBook 代码所在的工作簿

     

  2、工作表

     Sheets("工作表名称")

      Sheet1 表示第一个插入的工作表,Sheet2表示第二个插入的工作表....

      Sheets(n) 表示按排列顺序,第n个工作表

      ActiveSheet 表示活动工作表,光标所在工作表

      worksheet 也表示工作表,但不包括图表工作表、宏工作表等。

  3、单元格

       cells 所有单元格

       Range ("单元格地址")

       Cells(行数,列数)

       Activecell 正在选中或编辑的单元格

       Selection 正被选中或选取的单元格或单元格区域

VBA中的代码的基本结构与组成部分

四VBA语句

1、宏程序语句

  运行后可以完成一个功能

Sub test()  开始语句

  

  Range("a1") = 100

End Sub   结束语句

2、函数程序语句

   

   运行后可以返回一个值

   

Function shcount()

  shcount = Sheets.Count

  

End Function

3、在程序中应用的语句

  Sub test2()    

    Call test

  End Sub

 Sub test3()

   For x = 1 To 100   for next 循环语句

      Cells(x, 1) = x

   Next x

 End Sub

第3集:循环语句

if判断语句

Sub 判断1() '单条件判断

  If Range("a1").Value > 0 Then

     Range("b1") = "正数"

  Else

     Range("b1") = "负数或0"

  End If

End Sub

Sub 判断2() '多条件判断

  If Range("a1").Value > 0 Then

     Range("b1") = "正数"

  ElseIf Range("a1") = 0 Then

     Range("b1") = "等于0"

  ElseIf Range("B1") <= 0 Then

     Range("b1") = "负数"

  End If

End Sub

Sub 多条件判断2()

 If Range("a1") <> "" And Range("a2") <> "" Then

   Range("a3") = Range("a1") * Range("a2")

 End If

End Sub

select判断

Sub 判断1() '单条件判断

  Select Case Range("a1").Value

  Case Is > 0

     Range("b1") = "正数"

  Case Else

     Range("b1") = "负数或0"

  End Select

End Sub

Sub 判断2() '多条件判断

  Select Case Range("a1").Value

  Case Is > 0

     Range("b1") = "正数"

  Case Is = 0

     Range("b1") = "0"

  Case Else

     Range("b1") = "负数"

  End Select

End Sub

Sub 判断3()

 If Range("a3") < "G" Then

   MsgBox "A-G"

 End If

End Sub

判断范围

Sub if区间判断()

If Range("a2") <= 1000 Then

  Range("b2") = 0.01

ElseIf Range("a2") <= 3000 Then

  Range("b2") = 0.03

ElseIf Range("a2") > 3000 Then

  Range("b2") = 0.05

End If

End Sub

Sub select区间判断()

 Select Case Range("a2").Value

 Case 0 To 1000

   Range("b2") = 0.01

 Case 1001 To 3000

   Range("b2") = 0.03

 Case Is > 3000

   Range("b2") = 0.05

 End Select

End Sub

第4集:判断语句

Sub s1()

 Dim rg As Range

 For Each rg In Range("a1:b7,d5:e9")

   If rg = "" Then

     rg = 0

   End If

  Next rg

End Sub

Sub s2()

 Dim x As Integer

 Do

   x = x + 1

   If Cells(x + 1, 1) <> Cells(x, 1) + 1 Then

      Cells(x, 2) = "断点"

      Exit Do

   End If

 Loop Until x = 14

End Sub

Sub t1()

  Range("d2") = Range("b2") * Range("c2")

  Range("d3") = Range("b3") * Range("c3")

  Range("d4") = Range("b4") * Range("c4")

  Range("d5") = Range("b5") * Range("c5")

  Range("d6") = Range("b6") * Range("c6")

End Sub

Sub t2()

Dim x As Integer

 For x = 10000 To 2 Step -3

  Range("d" & x) = Range("b" & x) * Range("c" & x)

 Next x

End Sub

Sub t3()

Dim rg As Range

 For Each rg In Range("d2:d18")

  rg = rg.Offset(0, -1) * rg.Offset(0, -2)

 Next rg

End Sub

Sub t4()

Dim x As Integer

 x = 1

 Do

   x = x + 1

   Cells(x, 4) = Cells(x, 2) * Cells(x, 3)

 Loop Until x = 18

End Sub

Sub t5()

 x = 1

 Do While x < 18

   x = x + 1

   Cells(x, 4) = Cells(x, 2) * Cells(x, 3)

 Loop

End Sub

第5集:VBA变量

Dim m As Integer

'变量

'一、什么是变量?

'所谓变量,就是可变的量。就好象在内存中临时存放的一个小盒子,这个小盒子放的什么物体不固定。

Sub t1()

  Dim X As Integer 'x就是一个变量

  For X = 1 To 10

    Cells(X, 1) = X

  Next X

End Sub

'二、小盒子里可以放什么?

   '1 放数字

     '如t1

     

    '2 放文本

    Sub t2()

     Dim st As String

     Dim X As Integer

     For X = 1 To 10

      st = st & "Excel精英培训"

     Next X

    End Sub

    

     '3 放对象

     

      Sub t3()

        Dim rg As Range

        Set rg = Range("a1")

        rg = 100

      End Sub

     

     

      '4 放数组

       Sub t4()

      

        Dim arr(1 To 10) As Integer, X As Integer

        For X = 1 To 10

          arr(X) = X

        Next X

       

       End Sub

 

'三、变量的类型和声明

 

   '1 变量的类型

     

       '详见帮助文件

      

   '2 为什么要声明变量

   

    

   '3 声明变量

     

      'dim public

   

    

'四、变量的存活周期

   

   '1 过程级变量:过程结束,变量值释放

      

       '如t1

   

   '2 模块级变量:变量的值只在本模块中保持,工作簿关闭时随时释放

       '例5

         Sub t6()

            m = 1

         End Sub

         Sub t5()

          MsgBox m

          m = 7

         End Sub

   '3 全局级变量: 在所有的模块中都可以调用,值会保存到EXCEL关闭时才会被释放。

      

       ' public 变量

      

         Sub t7()

           MsgBox qq

         End Sub

'五 变量的释放

    

     '一般情况下,过程级变量在过程运行结束后就会自动从内存中释放,而只有一些从外部借用的对象变量才需要使用set 变量=nothing进行释放。

第6集:函数与公式

Option Explicit

'一、在单元格中输入公式

'1、用VBA在单元格中输入普通公式

     Sub t1()

       Range("d2") = "=b2*c2"

     End Sub

     

     Sub t2()

      Dim x As Integer

      For x = 2 To 6

       Cells(x, 4) = "=b" & x & "*c" & x

      Next x

     End Sub

'2、用VBA在单元格输入带引号的公式

     Sub t3()

     

     Range("c16") = "=SUMIF(A2:A6,""b"",B2:B6)" '遇到单引号就把单引号加倍

     

     End Sub

     

'3、用VBA在单元格中输入数组公式

    Sub t4()

      Range("c9").FormulaArray = "=SUM(B2:B6*C2:C6)"

    End Sub

    

'二、利用单元格公式返回值

     Sub t5()

         Range("d16") = Evaluate("=SUMIF(A2:A6,""b"",B2:B6)")

         Range("d9") = Evaluate("=SUM(B2:B6*C2:C6)")

     End Sub

  

'三、借用工作表函数

    

     Sub t6()

       

        Range("d8") = Application.WorksheeFunction.CountIf(Range("A1:A10"), "B")

       

     End Sub

'四、利用VBA函数

     Sub t7()

     

      Range("C20") = VBA.InStr(Range("a20"), "E")

     End Sub

     

   

'五、编写自定义函数

      Function wn()

         wn = Application.Caller.Parent.Name

      End Function

第8集:VBA分支与End语句

Option Explicit

'一、END语句

   '作用:强制退出所有正在运行的程序。

'二、Exit语句

   '退出指定的语句

   

   '1、Exit Sub

     Sub e1()

     Dim x As Integer

        For x = 1 To 100

          Cells(1, 1) = x

          If x = 5 Then

            Exit Sub

          End If

         Next x

      Range("b1") = 100

     End Sub

    '2、Exit function

     Function ff()

     Dim x As Integer

        For x = 1 To 100

          If x = 5 Then

            Exit Function

          End If

         Next x

      ff = 100

     End Function

   

   '3、Exit for

     Sub e2()

     

     Dim x As Integer

        For x = 1 To 100

          Cells(1, 1) = x

          If x = 5 Then

            Exit For

          End If

         Next x

        

       Range("b1") = 100

     End Sub

   '4、Exit do

     Sub e3()

     Dim x As Integer

       Do

         x = x + 1

          Cells(1, 1) = x

          If x = 5 Then

            Exit Do

          End If

       Loop Until x = 100

       Range("b1") = 100

     End Sub

Option Explicit

'Goto语句,跳转到指定的地方

Sub t1()

  Dim x As Integer

  Dim sr

100:

  sr = Application.InputBox("请输入数字", "输入提示")

  If Len(sr) = 0 Or Len(sr) = 5 Then GoTo 100

  

End Sub

'gosub..return ,跳过去,再跳回来

Sub t2()

  Dim x As Integer

  For x = 1 To 10

     If Cells(x, 1) Mod 2 = 0 Then GoSub 100

  Next x

Exit Sub

100:

   Cells(x, 1) = "偶数"

   Return          '跳到gosub 100 这一句

End Sub

分支语句

'on error resume next '遇到错误,跳过继续执行下一句

 Sub t3()

  On Error Resume Next

  Dim x As Integer

  For x = 1 To 10

    Cells(x, 3) = Cells(x, 2) * Cells(x, 1)

  Next x

 End Sub

 

'on error goto  '出错时跳到指定的行数

 

  Sub t4()

  On Error GoTo 100

  Dim x As Integer

  For x = 1 To 10

    Cells(x, 3) = Cells(x, 2) * Cells(x, 1)

  Next x

   Exit Sub

100:

   MsgBox "在第" & x & "行出错了"

  End Sub

 

 'on error goto 0 '取消错误跳转

 

  Sub t5()

  On Error Resume Next

  Dim x As Integer

  For x = 1 To 10

    If x > 5 Then On Error GoTo 0

    Cells(x, 3) = Cells(x, 2) * Cells(x, 1)

  Next x

   Exit Sub

  End Sub

第7集:VBE编辑器

'VBA第七集:VBE编辑器

'一、VBE的窗口

 '1、工程窗口

 

    'A 显示工作簿工作表对象

    'B 窗体

    'C 模块

    'D 类模块

 'range("a1")=10

    

    '对应工程窗口的对象和模板,显示其所具体的一些特征。

     

 '3、代码窗口

    'A 注释文字的设置

    'B 代码缩进的设置

    'C 代码强制转行的设置

    'D 代码运行和调试

         '逐句运行

         '设置断点

    'E 对象列表框和过程列表框

 '4、立即窗口

 

 '立即窗口可以把运行过程中的值立即显示出来,主要用于程序的调试

Sub d()

 Dim x As Integer, st As String

 For x = 1 To 10

    st = st & Cells(x, 1)

    Debug.Print "第" & x & "次运行结果:" & st

 Next x

End Sub

 '5、本地窗口

   '在本地窗口中可以显示运行中断时对象信息、变量值、数组信息等。

 Sub d1()

 Dim x As Integer, k As Integer

 For x = 1 To 10

   k = k + Cells(x, 1)

 Next x

 End Sub

第9集:excel文件操作

excel文件的操作

'1 判断A.Xls文件是否存在

    Sub W1()

     If Len(Dir("d:/A.xls")) = 0 Then

       MsgBox "A文件不存在"

     Else

       MsgBox "A文件存在"

     End If

   End Sub

'2 判断A.Xls文件是否打开

    Sub W2()

     Dim X As Integer

      For X = 1 To Windows.Count

        If Windows(X).Caption = "A.XLS" Then

          MsgBox "A文件打开了"

          Exit Sub

        End If

      Next

    End Sub

   

'3 excel文件新建和保存

  Sub W3()

     Dim wb As Workbook

     Set wb = Workbooks.Add

       wb.Sheets("sheet1").Range("a1") = "abcd"

     wb.SaveAs "D:/B.xls"

  End Sub

'4 excel文件打开和关闭

  

 Sub w4()

    Dim wb As Workbook

    Set wb = Workbooks.Open("D:/B.xls")

    MsgBox wb.Sheets("sheet1").Range("a1").Value

    wb.Close False

 End Sub

'5 excel文件保存和备份

   Sub w5()

      Dim wb As Workbook

      Set wb = ThisWorkbook

      wb.Save

      wb.SaveCopyAs "D:/ABC.xls"

   End Sub

  

'6 excel文件复制和删除

   Sub W6()

      FileCopy "D:/ABC.XLS", "E:/ABCd.XLS"

      Kill "D:/ABC.XLS"

   End Sub

excel文件的几个概念

'excel文件和工作簿

  'excel文件就是excel工作簿,excel文件打开需要excel程的支持

  

   'Workbooks  工作簿集合,泛指excel文件或工作簿

   

   'Workbooks("A.xls"),名称为A的excel工作簿

     Sub t1()

        Workbooks("A.xls").Sheets(1).Range("a1") = 100

     End Sub

   

   'workbooks(2),按打开顺序,第二个打开的工作簿。

      Sub t2()

        Workbooks(2).Sheets(2).Range("a1") = 200

     End Sub

   'ActiveWorkbook ,当打开多个excel工作簿时,你正在操作的那个就是ActiveWorkbook(活动工作簿)

   

   'Thisworkbook,VBA程序所在的工作簿,无论你打开多少个工作簿,无论当前是哪个工作簿是活动的,thisworkbook就是指它所在的工作簿。

'工作簿窗口

    'Windows("A.xls"),A工作簿的窗口,使用windows可以设置工作簿窗口的状态,如是否隐藏等。

     Sub t3()

        Windows("A.xls").Visible = False

     End Sub

     Sub t4()

        Windows(2).Visible = True

     End Sub

第10集:excel工作表操作

工作表文件的操作

'1 判断A工作表文件是否存在

    Sub s1()

     Dim X As Integer

      For X = 1 To Sheets.Count

        If Sheets(X).Name = "A" Then

          MsgBox "A工作表存在"

          Exit Sub

        End If

      Next

      MsgBox "A工作表不存在"

    End Sub

   

'2 excel工作表的插入

  Sub s2()

     Dim sh As Worksheet

     Set sh = Sheets.Add

       sh.Name = "模板"

       sh.Range("a1") = 100

  End Sub

'3 excel工作表隐藏和取消隐藏

  

 Sub s3()

    Sheets(2).Visible = True

 End Sub

'4 excel工作表的移动

   Sub s4()

     Sheets("Sheet2").Move before:=Sheets("sheet1") 'sheet2移动到sheet1前面

     Sheets("Sheet1").Move after:=Sheets(Sheets.Count) 'sheet1移动到所有工作表的最后面

   End Sub

  

'6 excel工作表的复制

   Sub s5() '在本工作簿中

      Dim sh As Worksheet

      Sheets("模板").Copy before:=Sheets(1)

       Set sh = ActiveSheet

          sh.Name = "1日"

          sh.Range("a1") = "测试"

   End Sub

   

   Sub s6() '另存为新工作簿

      Dim wb As Workbook

       Sheets("模板").Copy

       Set wb = ActiveWorkbook

          wb.SaveAs ThisWorkbook.Path & "/1日.xls"

          wb.Sheets(1).Range("b1") = "测试"

          wb.Close True

   End Sub

'7 保护工作表

   Sub s7()

      Sheets("sheet2").Protect "123"

   End Sub

   Sub s8() '判断工作表是否添加了保护密码

      If Sheets("sheet2").ProtectContents = True Then

        MsgBox "工作簿保护了"

      Else

        MsgBox "工作簿没有添加保护"

      End If

   End Sub

   

 '8 工作表删除

     Sub s9()

       Application.DisplayAlerts = False

         Sheets("模板").Delete

       Application.DisplayAlerts = True

     End Sub

'9 工作表的选取

     Sub s10()

       Sheets("sheet2").Select

     End Sub

excel工作表的分类

  'excel工作表有两大类,一类是我们平常用的工作表(worksheet),另一类是图表、宏表等。这两类的统称是sheets

  

   'sheets  工作表集合,泛指excel各种工作表

   

   'Sheets("A"),名称为A的excel工作表

     Sub t1()

        Sheets("A").Range("a1") = 100

     End Sub

   

   'workbooks(2),按打开顺序,第二个打开的工作簿。

      Sub t2()

        Sheets(2).Range("a1") = 200

     End Sub

   'ActiveSheet ,当打开多个excel工作簿时,你正在操作的那个就是ActiveSheet

 第11集:单元格选取

'1 表示一个单元格(a1)

 Sub s()

   Range("a1").Select

   Cells(1, 1).Select

   Range("A" & 1).Select

   Cells(1, "A").Select

   Cells(1).Select

   [a1].Select

 End Sub

'2 表示相邻单元格区域

   

   

   Sub d() '选取单元格a1:c5

'     Range("a1:c5").Select

'     Range("A1", "C5").Select

'     Range(Cells(1, 1), Cells(5, 3)).Select

     'Range("a1:a10").Offset(0, 1).Select

      Range("a1").Resize(5, 3).Select

   End Sub

   

'3 表示不相邻的单元格区域

   

    Sub d1()

    

      Range("a1,c1:f4,a7").Select

     

      'Union(Range("a1"), Range("c1:f4"), Range("a7")).Select

     

    End Sub

    

    Sub dd() 'union示例

      Dim rg As Range, x As Integer

      For x = 2 To 10 Step 2

        If x = 2 Then Set rg = Cells(x, 1)

       

        Set rg = Union(rg, Cells(x, 1))

      Next x

      rg.Select

    End Sub

    

'4 表示行

  

    Sub h()

    

      'Rows(1).Select

      'Rows("3:7").Select

      'Range("1:2,4:5").Select

       Range("c4:f5").EntireRow.Select

      

    End Sub

    

'5 表示列

    

   Sub L()

    

      ' Columns(1).Select

      ' Columns("A:B").Select

      ' Range("A:B,D:E").Select

      Range("c4:f5").EntireColumn.Select '选取c4:f5所在的行

      

   End Sub

'6 重置坐标下的单元格表示方法

    Sub cc()

    

      Range("b2").Range("a1") = 100

     

    End Sub

    

'7 表示正在选取的单元格区域

   Sub d2()

     Selection.Value = 100

   End Sub

第12集:特殊单元格定位

'1 已使用的单元格区域

  Sub d1()

  

    Sheets("sheet2").UsedRange.Select

    

    'wb.Sheets(1).Range("a1:a10").Copy Range("i1")

  End Sub

'2 某单元格所在的单元格区域

   Sub d2()

 

      Range("b8").CurrentRegion.Select

   End Sub

'3 两个单元格区域共同的区域

    Sub d3()

     

    Intersect(Columns("b:c"), Rows("3:5")).Select

  

    End Sub

   

'4 调用定位条件选取特殊单元格

  

    Sub d4()

  

       Range("A1:A6").SpecialCells(xlCellTypeBlanks).Select

       

    End Sub

    

'5 端点单元格

 

   Sub d5()

   

     Range("a65536").End(xlUp).Offset(1, 0) = 1000

     

   End Sub

  

   Sub d6()

   

     Range(Range("b6"), Range("b6").End(xlToRight)).Select

     

   End Sub

实例

Option Explicit

Sub t()

 Dim x As Integer

  For x = 2 To 6

    If Cells(x, 2) > 0 Then

      Cells(x, "N") = "1月"

    Else

      Cells(x, "N") = Range("b" & x).End(xlToRight).Column - 1 & "月"

    End If

  Next x

  

End Sub

第13集:单元格信息

Option Explicit

'1 单元格的值

   Sub x1()

    Range("b10") = Range("c2").Value

    Range("b11") = Range("c2").Text

    Range("c10") = "'" & Range("I3").Formula

   End Sub

 '2 单元格的地址

   

    Sub x2()

     With Range("b2").CurrentRegion

       [b12] = .Address

       [c12] = .Address(0, 0)

       [d12] = .Address(1, 0)

       [e12] = .Address(0, 1)

       [f12] = .Address(1, 1)

     End With

    End Sub

 

 '3 单元格的行列信息

    Sub x3()

      With Range("b2").CurrentRegion

        [b13] = .Row

        [b14] = .Rows.Count

        [b15] = .Column

        [b16] = .Columns.Count

        [b17] = .Range("a1").Address

      End With

    End Sub

     

 '4、单元格的格式信息

    Sub x4()

      With Range("b2")

        [b19] = .Font.Size

        [b20] = .Font.ColorIndex

        [b21] = .Interior.ColorIndex

        [b22] = .Borders.LineStyle

      End With

    End Sub

      

  '5、单元格批注信息

     Sub x5()

        [B24] = Range("I2").Comment.Text

     End Sub

  '6 单元格的位置信息

     Sub x6()

        With Range("b3")

          [b26] = .Top

          [b27] = .Left

          [b28] = .Height

          [b29] = .Width

        End With

     End Sub

  '7 单元格的上级信息

    Sub x7()

      With Range("b3")

        [b31] = .Parent.Name

        [b32] = .Parent.Parent.Name

      End With

    End Sub

   '8 内容判断

      Sub x8()

       With Range("i3")

        [b34] = .HasFormula

        [b35] = .Hyperlinks.Count

       End With

      End Sub

    '9 单元格数据类型(另讲)

     

    

第14集:单元格的格式

单元格的数字格式

'一、判断数值的格式

  '1 判断是否为空单元格

    Sub d1()

       [b1] = ""

       'If Range("a1") = "" Then

       'If Len([a1]) = 0 Then

       If VBA.IsEmpty([a1]) Then

          [b1] = "空值"

        End If

    End Sub

  '2 判断是否为数字

    Sub d2()

      [b2] = ""

      'If VBA.IsNumeric([a2]) And [a2] <> "" Then

      'If Application.WorksheetFunction.IsNumber([a2]) Then

        [b2] = "数字"

      End If

    End Sub

  '3 判断是否为文本

    Sub d3()

      [b3] = ""

      'If Application.WorksheetFunction.IsText([A3]) Then

       If VBA.TypeName([a3].Value) = "String" Then

         [b3] = "文本"

      End If

    End Sub

  '4 判断是否为汉字

     Sub d4()

        [b4] = ""

        If [a4] > "z" Then

          [b4] = "汉字"

        End If

     End Sub

  '5 判断错误值

  Sub d10()

      [b5] = ""

      'If VBA.IsError([a5]) Then

      If Application.WorksheetFunction.IsError([a5]) Then

         [b5] = "错误值"

      End If

  End Sub

    Sub d11()

      [b6] = ""

      If VBA.IsDate([a6]) Then

         [b6] = "日期"

      End If

  End Sub

'二、设置单元格自定义格式

   Sub d30()

        Range("d1:d8").NumberFormatLocal = "0.00"

   End Sub

'三、按指定格式从单元格返回数值

   

   'Format函数语法(和工作表数Text用法基本一致)

   

    'Format(数值,自定义格式代码)

    

单元格的颜色

Option Explicit

'Excel中的颜色

   

    'Excel中的颜色可以用两种方式获取,一种是EXCEL内置颜色,另一种是利用QBCOLOR函数返回

  Sub y1()

   Dim x As Integer

    Range("a1:b60").Clear

    For x = 1 To 56

      Range("a" & x) = x

      Range("b" & x).Font.ColorIndex = 3

    Next x

  End Sub

   Sub y2()

    Dim x As Integer

     For x = 0 To 15

      Range("d" & x + 1) = x

      Range("e" & x + 1).Interior.Color = QBColor(x)

     Next x

   End Sub

  Sub y3()

    Dim 红 As Integer, 绿 As Integer, 蓝 As Integer

    红 = 255

    绿 = 123

    蓝 = 100

    Range("g1").Interior.Color = RGB(红, 绿, 蓝)

  End Sub

单元格合并

  Sub h1()

    

    Range("g1:h3").Merge

    

  End Sub

  

  '合并区域的返回信息

  Sub h2()

   

   Range("e1") = Range("b3").MergeArea.Address '返回单元格所在的合并单元格区域

   

  End Sub

  

  '判断是否含合并单元格

  Sub h3()

   'MsgBox Range("b2").MergeCells

   ' MsgBox Range("A1:D7").MergeCells

    Range("e2") = IsNull(Range("a1:d7").MergeCells)

    Range("e3") = IsNull(Range("a9:d72").MergeCells)

  End Sub

  

 '综合示例

 

   '合并H列相同单元格

   

     Sub h4()

      Dim x As Integer

      Dim rg As Range

      Set rg = Range("h1")

       Application.DisplayAlerts = False

      For x = 1 To 13

        If Range("h" & x + 1) = Range("h" & x) Then

          Set rg = Union(rg, Range("h" & x + 1))

        Else

        

           rg.Merge

         

          Set rg = Range("h" & x + 1)

        End If

      Next x

      Application.DisplayAlerts = True

     End Sub

    

第15集:单元格编辑示例

单元格行列的删除和插入

Option Explicit

Sub c1()

  Rows(4).Insert

End Sub

Sub c2() '插入行并复制公式

  Rows(4).Insert

  Range("3:4").FillDown

  Range("4:4").SpecialCells(xlCellTypeConstants) = ""

End Sub

Sub c3()

  Dim x As Integer

  For x = 2 To 20

    If Cells(x, 3) <> Cells(x + 1, 3) Then

      Rows(x + 1).Insert

      x = x + 1

    End If

  Next x

End Sub

Sub c4()

  Dim x As Integer, m1 As Integer, m2 As Integer

  Dim k As Integer

  m1 = 2

  For x = 2 To 1000

    If Cells(x, 1) = "" Then Exit Sub

    If Cells(x, 3) <> Cells(x + 1, 3) Then

      m2 = x

      Rows(x + 1).Insert

      Cells(x + 1, "c") = Cells(x, "c") & " 小计"

      Cells(x + 1, "h") = "=sum(h" & m1 & ":h" & m2 & ")"

      Cells(x + 1, "h").Resize(1, 4).FillRight

      Cells(x + 1, "i") = ""

      x = x + 1

      m1 = m2 + 2

    End If

  Next x

End Sub

Sub c44()

'个人方法

Dim x As Integer

Dim t As Integer

t = Range("c65536").End(xlUp).Row

For x = t To 2 Step -1

    If Cells(x, 3) <> Cells(x - 1, 3) Then

        Rows(x).Insert

         Cells(Cells(x, "C").Offset(1, 0).End(xlDown).Row + 1, "C") = Cells(Cells(x, "C").Offset(1, 0).End(xlDown).Row, "C") & " 小计"

        Cells(Cells(x, "H").Offset(1, 0).End(xlDown).Row + 1, "H") = _

        Application.Sum(Range(Cells(x, "h").Offset(1, 0), Cells(x, "H").Offset(1, 0).End(xlDown)))

    End If

Next x

End Sub

Sub dd() '删除小计行

 Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

End Sub

单元格输入

Option Explicit

 

'1 单元格输入

 

    Sub t1()

      Range("a1") = "a" & "b"

      Range("b1") = "a" & Chr(10) & "b" '换行答输入

    End Sub

    

'2 单元格复制和剪切

    

      Sub t2()

        Range("a1:a10").Copy Range("c1") 'A1:A10的内容复制到C1

      End Sub

    

      Sub t3()

        Range("a1:a10").Copy

        ActiveSheet.Paste Range("d1") '粘贴至D1

      End Sub

     

      Sub t4()

        Range("a1:a10").Copy

        Range("e1").PasteSpecial (xlPasteValues) '只粘贴为数值

      End Sub

      Sub t5()

        Range("a1:a10").Cut

        ActiveSheet.Paste Range("f1") '粘贴到f1

      End Sub

      Sub t6()

        Range("c1:c10").Copy

        Range("a1:a10").PasteSpecial Operation:=xlAdd '选择粘贴-加

      End Sub

     

      Sub T7()

          Range("G1:G10") = Range("A1:A10").Value

      End Sub

'3 填充公式

    Sub T8()

      Range("b1") = "=a1*10"

      Range("b1:b10").FillDown '向下填充公式

    End Sub

    

第16集:单元格查找

单元格查询

Option Explicit

'1 使用循环查找 (在单元格中查找效率太低)

'2 调用工作表函数

  

    Sub c1() '判断是否存在,并查找所在行数

      Dim hao As Integer

      Dim icount As Integer

      icount = Application.WorksheetFunction.CountIf(Sheets("库存明细表").[b:b], [g3])

      If icount > 0 Then

       MsgBox "该入库单号码已经存在,请不要重复录入"

       MsgBox Application.WorksheetFunction.Match([g3], Sheets("库存明细表").[b:b], 0)

      End If

    End Sub

    

    

'3 使用Find方法

    Sub c2()

      Dim r As Integer, r1 As Integer

      Dim icount As Integer

      icount = Application.WorksheetFunction.CountIf(Sheets("库存明细表").[b:b], [g3])

      If icount > 0 Then

       r = Sheets("库存明细表").[b:b].Find(Range("G3"), Lookat:=xlWhole).Row '查找号码第一次出现的位置

       r1 = Sheets("库存明细表").[b:b].Find([g3], , , , , xlPrevious).Row

       MsgBox r & ":" & r1

      End If

    End Sub

 

   Sub c3() '返回最下一行非空行的行数

    

      MsgBox Sheets("库存明细表").Cells.Find("*", , , , , xlPrevious).Row

    

   End Sub

入库单实例

Option Explicit

Sub 输入()

  Dim c As Integer   '号码在库存表中的个数

  Dim r As Integer   '入库单的数据行数

  Dim cr As Integer  '库存明细表中第一个空行的行数

With Sheets("库存明细表")

    c = Application.CountIf(.[b:b], Range("g3"))

    If c > 0 Then

       MsgBox "该单据号码已经存在!,请不要重复录入"

       Exit Sub

    Else

       r = Application.CountIf(Range("b6:b10"), "<>")

       cr = .[b65536].End(xlUp).Row + 1

       .Cells(cr, 1).Resize(r, 1) = Range("e3")

       .Cells(cr, 2).Resize(r, 1) = Range("g3")

       .Cells(cr, 3).Resize(r, 1) = Range("c3")

       .Cells(cr, 4).Resize(r, 6) = Cells(6, 2).Resize(r, 6).Value

       MsgBox "输入已完成"

    End If

 End With

End Sub

Sub 查找()

  Dim c As Integer   '号码在库存表中的个数

  Dim r As Integer   '入库单的数据行数

  

With Sheets("库存明细表")

    c = Application.CountIf(.[b:b], Range("g3"))

    If c = 0 Then

       MsgBox "该单据号码不存在!"

       Exit Sub

    Else

        r = .[b:b].Find(Range("g3"), , , , , xlNext).Row

        Range("c3") = .Cells(r, 3)

        Range("e3") = .Cells(r, 1)

        Cells(6, 2).Resize(c, 5) = .Cells(r, 4).Resize(c, 5).Value

       MsgBox "查询已完成"

    End If

 End With

End Sub

Sub 删除()

 Dim c As Integer   '号码在库存表中的个数

  Dim r As Integer   '入库单的数据行数

  

With Sheets("库存明细表")

    c = Application.CountIf(.[b:b], Range("g3"))

    If c = 0 Then

       MsgBox "该单据号码不存在!"

       Exit Sub

    Else

        r = .[b:b].Find(Range("g3"), , , , , xlNext).Row

        .Range(r & ":" & c + r - 1).Delete

       MsgBox "删除已完成"

    End If

 End With

End Sub

Sub 修改()

  Call 删除

  Call 输入

End Sub

第17集:excel事件程序(上)

Option Explicit

Private Sub Worksheet_Calculate()

 MsgBox "公式的值发生了改变"

End Sub

Private Sub Worksheet_Deactivate()

  MsgBox "谢谢使用sheet3"

End Sub

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

 MsgBox Target.Address

End Sub

Private Sub Worksheet_PivotTableUpdate(ByVal Target As PivotTable)

  

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

Private Sub Worksheet_Activate()

End Sub

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

End Sub

Private Sub Worksheet_PivotTableBeforeCommitChanges(ByVal TargetPivotTable As PivotTable, ByVal ValueChangeStart As Long, ByVal ValueChangeEnd As Long, Cancel As Boolean)

End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

第18集:工作簿事件

Private Sub Workbook_Deactivate()

End Sub

Private Sub Workbook_Open()

  UserForm1.Show

End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)

   'Cancel = True

End Sub

Private Sub Workbook_SheetDeactivate(ByVal Sh As Object)

End Sub

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)

 If Sh.name = "Sheet2" Then

  MsgBox Target.Address

  MsgBox Sh.name

 End If

End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)

End Sub

Private Sub Workbook_NewSheet(ByVal Sh As Object)

  MsgBox "本工作簿禁止插入新工作表"

  Application.DisplayAlerts = False

   Sh.Delete

  Application.DisplayAlerts = True

End Sub

Private Sub Workbook_BeforePrint(Cancel As Boolean)

 MsgBox "此excel文件禁止打印,如需打印请与管理员联系"

 Cancel = True

End Sub

Private Sub Workbook_Activate()

 

End Sub

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)

 MsgBox "你点击保存按钮了"

End Sub

第19集:excel程序事件

Public WithEvents app As Excel.Application

Private Sub app_NewWorkbook(ByVal Wb As Workbook)

 

End Sub

Private Sub app_SheetActivate(ByVal Sh As Object)

End Sub

Private Sub app_WorkbookOpen(ByVal Wb As Workbook)

' a = Application.InputBox("请输入打开excel程序口令", "安全提示")

' If a <> 123 Then

'   Wb.Close False

' End If

End Sub

Private Sub Workbook_Open()

 Set app = Excel.Application

End Sub

Option Explicit

Public WithEvents app As Excel.Application

Private Sub app_NewWorkbook(ByVal Wb As Workbook)

Wb.Close False

MsgBox "你没有新建工作簿的权限"

End Sub

Private Sub app_WorkbookBeforePrint(ByVal Wb As Workbook, Cancel As Boolean)

 MsgBox "你没有打印本工作簿的权限!"

 Cancel = True

End Sub

Private Sub app_WorkbookBeforeSave(ByVal Wb As Workbook, ByVal SaveAsUI As Boolean, Cancel As Boolean)

 MsgBox "本工作簿不能保存修改!谢谢合作"

 Cancel = True

End Sub

Private Sub app_WorkbookNewSheet(ByVal Wb As Workbook, ByVal Sh As Object)

Application.DisplayAlerts = False

  Sh.Delete

Application.DisplayAlerts = True

End Sub

Private Sub app_WorkbookOpen(ByVal Wb As Workbook)

Dim a

 If Wb.Name = "open.xla" Then Exit Sub

 a = Application.InputBox("请输入打开excel程序口令", "安全提示")

 If a <> 123 Then

   Wb.Close False

   MsgBox "很抱歉!你没有打开本机excel程序权限。"

 End If

 

End Sub

Private Sub Workbook_Open()

Set app = Excel.Application

End Sub

第20集:VBA数组-1:数组基础

第1_了解VBA运算特点

'****************************************************************************************************

'*                              VBA数组教程                                                         *

'*                                       --------excel精英培训网:兰色幻想                           *

'****************************************************************************************************

Sub v4() '运行时间0.01秒

 Dim t

 t = Timer

 For x = 1 To 100000

   m = m + 1000 '真接调用内存中的值

 Next x

 MsgBox Timer - t

End Sub

Sub v5() '运行时间0.5秒

 Dim t

 t = Timer

 For x = 1 To 100000

   m = m + Cells(1, 1) '调用单元格中的值

 Next x

  MsgBox Timer - t

End Sub

第2_什么是VBA数组

'1、什么是VBA数组呢?

    

    'VBA数组就是储存一组数据的数据空间?数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组.

    

'2 VBA数组存在形态

     ' VBA数组是以变量形式存放的一个空间,它也有行有列,也可以是三维空间。

          

    '1) 常量数组

          'array(1,2)

          'array(array(1,2,4),array("a","b","c"))

    '2) 静态数组

          'x(4) '有5个位置,编号从0~4

          'arr(1 to 10) '有10个位置,编号1~10

          'arr(1 to 10,1 to 2) '10行2列的空间,总共20个位置,这是二维数组

          'arr(1 to 10,1 to 2,1 to 3) '三维数组,总10*2*3=60个位置。这是三维数组

    '3)动态数组

          'arr() '不知道有多少行多少列

第3_VBA数组的写入

Option Explicit

'向VBA数组中写入数据

   

   '1、按编号(标)写入和读取

   

     Sub t1() '写入一维数组

     Dim x As Integer

     Dim arr(1 To 10)

   arr(2) = 190

   arr(10) = 5

     End Sub

  

    Sub t2() '向二维数组写入数据和读取

     Dim x As Integer, y As Integer

     Dim arr(1 To 5, 1 To 4)

     For x = 1 To 5

       For y = 1 To 4

         arr(x, y) = Cells(x, y)

       Next y

     Next x

    MsgBox arr(3, 1)

    End Sub

    

   '2、动态数组

       Sub t3()

        Dim arr()

        Dim row

        row = Sheets("sheet2").Range("a65536").End(xlUp).row - 1

        ReDim arr(1 To row)

        For x = 1 To row

           arr(x) = Cells(x, 1)

        Next x

        Stop

       End Sub

      

   '3、批量写入

    

      Sub t4() '由常量数组导入

      Dim arr

      arr = Array(1, 2, 3, "a")

      Stop

      End Sub

    

     Sub t5() '由单元格区域导入

       Dim arr

       arr = Range("a1:d5")

       Stop

     End Sub

    

第21集:BA数组-2读取

第1_了解VBA运算特点

'****************************************************************************************************

'*                              VBA数组教程                                                         *

'*                                       --------excel精英培训网:兰色幻想                           *

'****************************************************************************************************

Sub v4() '运行时间0.01秒

 Dim t

 t = Timer

 For x = 1 To 100000

   m = m + 1000 '真接调用内存中的值

 Next x

 MsgBox Timer - t

End Sub

Sub v5() '运行时间0.5秒

 Dim t

 t = Timer

 For x = 1 To 100000

   m = m + Cells(1, 1) '调用单元格中的值

 Next x

  MsgBox Timer - t

End Sub

第2_什么是VBA数组

'1、什么是VBA数组呢?

    

    'VBA数组就是储存一组数据的数据空间?数据类型可以数字,可以是文本,可以是对象,也可以是VBA数组.

    

'2 VBA数组存在形态

     ' VBA数组是以变量形式存放的一个空间,它也有行有列,也可以是三维空间。

          

    '1) 常量数组

          'array(1,2)

          'array(array(1,2,4),array("a","b","c"))

    '2) 静态数组

          'x(4) '有5个位置,编号从0~4

          'arr(1 to 10) '有10个位置,编号1~10

          'arr(1 to 10,1 to 2) '10行2列的空间,总共20个位置,这是二维数组

          'arr(1 to 10,1 to 2,1 to 3) '三维数组,总10*2*3=60个位置。这是三维数组

    '3)动态数组

          'arr() '不知道有多少行多少列

第3_VBA数组的写入

Option Explicit

'向VBA数组中写入数据

   

   '1、按编号(标)写入和读取

   

     Sub t1() '写入一维数组

     Dim x As Integer

     Dim arr(1 To 10)

   arr(2) = 190

   arr(10) = 5

     End Sub

  

    Sub t2() '向二维数组写入数据和读取

     Dim x As Integer, y As Integer

     Dim arr(1 To 5, 1 To 4)

     For x = 1 To 5

       For y = 1 To 4

         arr(x, y) = Cells(x, y)

       Next y

     Next x

    MsgBox arr(3, 1)

    End Sub

    

   '2、动态数组

       Sub t3()

        Dim arr()

        Dim row

        row = Sheets("sheet2").Range("a65536").End(xlUp).row - 1

        ReDim arr(1 To row)

        For x = 1 To row

           arr(x) = Cells(x, 1)

        Next x

        Stop

       End Sub

      

   '3、批量写入

    

      Sub t4() '由常量数组导入

      Dim arr

      arr = Array(1, 2, 3, "a")

      Stop

      End Sub

    

     Sub t5() '由单元格区域导入

       Dim arr

       arr = Range("a1:d5")

       Stop

     End Sub

第4_VBA数组的读取

Option Explicit

'VBA数组

  '1、在内存中读取

     

       '在内存中读取后用于继续运算,直接用下面的格式

       

        '数组变量(5)

        '数组变量(3,2)

     '例:

        Sub d1()

         Dim arr, arr1()

         Dim x As Integer, k As Integer, m As Integer

         arr = Range("a1:a10") '把单元格区域导入内存数组中

         m = Application.CountIf(Range("a1:a10"), ">10") '计算大于10的个数

         ReDim arr1(1 To m)

         For x = 1 To 10

           If arr(x, 1) > 10 Then

              k = k + 1

              arr1(k) = arr(x, 1)

              MsgBox arr1(k)

           End If

          

         Next x

         Stop

        

        End Sub

       

       

  '2、读取存入单元格中

         

      Sub d2() '二维数组存入单元格

        Dim arr, arr1(1 To 5, 1 To 1)

        Dim x As Integer

        arr = Range("b2:c6")

        For x = 1 To 5

          arr1(x, 1) = arr(x, 1) * arr(x, 2)

        Next x

        Range("d2").Resize(10) = arr1

      End Sub

      Sub vl()

         Dim arr, arr1

         Dim x, k As Integer

         Dim tt As Long

         Application.ScreenUpdating = False

                arr = Range("I2:J1433")

                arr1 = Range("f2:g1433")

                    For x = 1 To 1432

                                For k = 1 To 1432

                                    If arr(k, 1) = arr1(x, 1) Then

                                        arr1(x, 2) = arr(k, 2)

                                        Exit For

                                    End If

                                   Range("g2").Resize(1432) = arr1(x, 2)

                        Next k

                    Next x

                    Application.ScreenUpdating = True

      End Sub

     

      Sub d3() '一维数组存入单元格

        Dim arr, arr1(1 To 5)

        Dim x As Integer

        arr = Range("b2:c6")

        For x = 1 To 5

          arr1(x) = arr(x, 1) * arr(x, 2)

        Next x

        'Range("a13").Resize(1, 5) = arr1

        Range("d2").Resize(5) = Application.Transpose(arr1)

      End Sub

      

      Sub d4() '数组部分存入

        Dim arr, arr1(1 To 10000, 1 To 1)

        Dim x As Integer

        arr = Range("b2:c6")

        For x = 1 To 5

          arr1(x, 1) = arr(x, 1) * arr(x, 2)

        Next x

        Range("d2").Resize(5) = arr1

      End Sub

第22集:数组-3

第5_数组的空间

Option Explicit

'1、数组的大小

'数组是用编号排序的,那么如何获得一个数组的大小呢

 'Lbound(数组) 可以获取数组的最小下标(编号)

 'Ubound(数组) 可以获取数组的最大上标(编号)

 'Ubound(数组,1) 可以获得数组的行方面(第1维)最大上标

 'Ubound(数组,2) 可以获得数组的列方向(第2维)的最大上标

Sub d6()

 Dim arr

 Dim k, m

 arr = Range("a2:d5")

 For x = 1 To UBound(arr, 1)

   

 Next x

End Sub

'2、动态数组的动态扩充

   

     '如果一个数组无法或不方便计算出总的大小,而在一些特殊情况下又不允许有空位。这时我们就需要用动态的导入方法

  '

     'ReDim Preserve arr() 可以声明一个动态大小的数组,而且可以保留原来的数值,就相当于厂房小了,可以改扩建增大,但是它只能

        '让最未维实现动态,如果是一维不存在最未维,只有一维

    

     例子1见sheet1工作表

     

   Sub d7()

   Dim arr, arr1()

     arr = Range("a1:d6")

     Dim x, k

     For x = 1 To UBound(arr)

      If arr(x, 1) = "B" Then

         k = k + 1

         ReDim Preserve arr1(1 To 4, 1 To k)

         arr1(1, k) = arr(x, 1)

         arr1(2, k) = arr(x, 2)

         arr1(3, k) = arr(x, 3)

         arr1(4, k) = arr(x, 4)

      End If

     Next x

    Range("a8").Resize(k, 4) = Application.Transpose(arr1)

   End Sub

   

   Sub d8()

   Dim arr, arr1(1 To 100000, 1 To 4)

     arr = Range("a1:d6")

     Dim x, k

     For x = 1 To UBound(arr)

      If arr(x, 1) = "B" Then

         k = k + 1

         arr1(k, 1) = arr(x, 1)

         arr1(k, 2) = arr(x, 2)

         arr1(k, 3) = arr(x, 3)

         arr1(k, 4) = arr(x, 4)

      End If

     Next x

    Range("a15").Resize(k, 4) = arr1

   End Sub

   

'3 清空数组

     '清空数组使用earse语句

  Sub d9()

   Dim arr, arr1(1 To 1000, 1 To 1)

   Dim x, m, k

   arr = Range("a1:a16")

   For x = 1 To UBound(arr)

     If arr(x, 1) <> "" Then

        k = k + 1

        arr1(k, 1) = arr(x, 1)

     Else

        m = m + 1

        Range("c1").Offset(0, m).Resize(k) = arr1

        Erase arr1

        k = 0

     End If

   Next x

  End Sub

     

第23集:数组-4:数组与函数

     

可以生成数组的函数

Option Explicit

' 1、split函数

     '按分隔符把字符串截取成VBA数组,该数组是一维数组,编号从0开始

 

     'split(字符串,分隔符)

   

    Sub t1()

      Dim sr, arr

      sr = "A-BC-FGR-H"

      arr = VBA.Split(sr, "-")

      MsgBox Join(arr, ",")

    End Sub

     

' 2、Filter函数:

     '按条件筛选符合条件的值组成一个新的数组

     'Filter(数组,筛选条件,是/否)

     

     '注:如果是(true)则返回包含的数组,如果否则返回非包含的数组

    Sub t2()

     Dim arr, arr1, arr2

     arr = Application.Transpose(Range("A2:A10"))

     arr1 = VBA.Filter(arr, "W", True)

     arr2 = VBA.Filter(arr, "W", False)

     Range("B2").Resize(UBound(arr1) + 1) = Application.Transpose(arr1)

     Range("C2").Resize(UBound(arr2) + 1) = Application.Transpose(arr2)

    End Sub

    

'3、index函数:

    '调用该工作表函数可以把二维数组的某一列或某一行截取出来,构成一个新的数组。

     ' Application.Index(二维数组,0,列数)) 返回二维数组

     ' Application.Index(二维数组,行数,0)) 返回一维数组

    Sub t3()

     Dim arr, arr1, arr2

      arr = Range("a2:d6")

      arr1 = Application.Index(arr, , 1)

      arr2 = Application.Index(arr, 4, 0)

      Stop

    End Sub

'4、vlookup函数

      'Vlookup函数的第一个参数可以用VBA数组,返回的也是一个VBA数组

    Sub t4()

    Dim arr, arr1

      arr = Range("a2:d6")

      arr1 = Application.VLookup(Array("B", "C"), arr, 4, 0)

    End Sub

'5 Sumif函数和Countif函数

     'Countif和sumif函数的第二个参数都可以使用数组,所以也可以返回一个VBA数组,如:

     Sub t5()

     Dim T

     T = Timer

       Dim arr

       arr = Application.SumIf(Range("a2:a10000"), Array("B", "C", "G", "R"), Range("B2:B10000"))

     MsgBox Timer - T

     Stop

     End Sub

 

   Sub t55()

     Dim T

     T = Timer

      Dim arr, arr1(1 To 4, 1 To 2), x

      arr1(1, 1) = "B"

      arr1(2, 1) = "C"

      arr1(3, 1) = "G"

      arr1(4, 1) = "R"

     ' arr = Range("a1:d10000")

      For x = 2 To 10000

         Select Case Cells(x, 1)

         Case "B"

            arr1(1, 2) = arr1(1, 2) + Cells(x, 2)

         Case "C"

            arr1(2, 2) = arr1(2, 2) + Cells(x, 2)

         Case "G"

            arr1(3, 2) = arr1(3, 2) + Cells(x, 2)

         Case "R"

            arr1(4, 2) = arr1(4, 2) + Cells(x, 2)

         End Select

      Next x

     MsgBox Timer - T

   End Sub

数组的处理

Option Explicit

'1 数组的最值

    Sub s()

    Dim arr1()

    

    arr1 = Array(1, 12, 4, 5, 19)

    

    MsgBox "1, 12, 4, 5, 19最大值" & Application.Max(arr1)

    MsgBox "1, 12, 4, 5, 19最小值:" & Application.Min(arr1)

    MsgBox "1, 12, 4, 5, 19第二大值:" & Application.Large(arr1, 2)

    MsgBox "1, 12, 4, 5, 19第二小值:" & Application.Small(arr1, 2)

    

    End Sub

    

 '2、求和

    '用application.Sum (数组)

    

'3 统计个数

  'counta和count函数可以统计VBA数组的数字个数及所有已填充内容的个数

  

     Sub s1()

     

     Dim arr1, arr2(0 To 10), x

     arr1 = Array("a", "3", "", 4, 6)

     For x = 0 To 4

       arr2(x) = arr1(x)

     Next x

     

     MsgBox "数组1的数字个数:" & Application.Count(arr2)

     

     MsgBox "数组2的已填充数值的个数" & Application.CountA(arr2)

     

     End Sub

 

 '3 在数组里查找

     

     Sub s2()

      Dim arr

      On Error Resume Next

      arr = Array("a", "c", "b", "f", "d")

      MsgBox Application.Match("f", arr, 0)

     If Err.Number = 13 Then

        MsgBox "查找不到"

      End If

     End Sub

第24集:VBA数组-5:数组与单元格格式

 

    

Option Explicit

'数组也可以设置格式?

   '数组除了数字类型外,当然没有颜色、字体等格式,但是别忘了range对象可以表示多个连续或不连续的单元格区域

   '利用上述特点,我们就是要数组构造单元格地址串,然后批量对单元格进行格式设置。

   '注意,单元格地址串不能>255,所以如果单元格操作过多,我们还需要分次分批设置单元格格式

   

Sub 填充颜色()

 Range("a2:d2,a7:d7,a10:d10").Interior.ColorIndex = 3

End Sub

Option Explicit

Sub 单元格循环()

 Dim x As Integer

 Dim t

 清除颜色

 t = Timer

 For x = 2 To Range("a65536").End(xlUp).Row

   If Range("d" & x) > 500 Then

     Range(Cells(x, 1), Cells(x, 4)).Interior.ColorIndex = 3

   End If

 Next x

 MsgBox Timer - t

End Sub

Sub 清除颜色()

 Range("a:d").Interior.ColorIndex = xlNone

End Sub

Sub 数组方法()

 Dim arr, t

 Dim x As Integer

 Dim sr As String, sr1 As String

 清除颜色

 t = Timer

 arr = Range("d2:d" & Range("a65536").End(xlUp).Row)

 For x = 1 To UBound(arr)

   If x = UBound(arr) And sr <> "" Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3

   If arr(x, 1) > 500 Then

      sr1 = sr

      sr = sr & "A" & x + 1 & ":D" & x + 1 & ","

      If Len(sr) > 255 Then

        sr = sr1

        Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3

        sr = ""

      End If

   End If

 Next x

 MsgBox Timer - t

End Sub

Sub 数组方法2()

Dim arr, t

 Dim x As Integer, x1 As Integer

 Dim sr As String, sr1 As String

 清除颜色

 t = Timer

 arr = Range("d2:d" & Range("a65536").End(xlUp).Row)

 For x = 1 To UBound(arr)

   If x = UBound(arr) Then Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3

   If arr(x, 1) > 500 Then

      sr1 = sr

      x1 = x + 1

      Do

        x = x + 1

      Loop Until arr(x, 1) <= 500

     

      sr = sr & "A" & x1 & ":D" & x & ","

      If Len(sr) > 255 Then

        sr = sr1

        x = x1 - 1

        Range(Left(sr, Len(sr) - 1)).Interior.ColorIndex = 3

        sr = ""

      End If

      x = x - 1

   End If

 Next x

 MsgBox Timer - t

End Sub

Sub 数组方法3()

Dim arr, t

 Dim x As Integer, x1 As Integer

 Dim sr As String, sr1 As String

 清除颜色

 t = Timer

 arr = Range("d2:d" & Range("a65536").End(xlUp).Row)

 For x = 1 To UBound(arr)

   If x = UBound(arr) Then Application.Intersect(Range("a:d"), Range(Left(sr, Len(sr) - 1))).Interior.ColorIndex = 3

   If arr(x, 1) > 500 Then

      sr1 = sr

      x1 = x + 1

      Do

        x = x + 1

      Loop Until arr(x, 1) <= 500

     

      sr = sr & x1 & ":" & x & ","

      If Len(sr) > 255 Then

        sr = sr1

        x = x1 - 1

        Application.Intersect(Range("a:d"), Range(Left(sr, Len(sr) - 1))).Interior.ColorIndex = 3

        sr = ""

      End If

      x = x - 1

   End If

 Next x

 MsgBox Timer - t

End Sub

第25集:VBA数组之VBA排序算法(上)

插入排序

Sub 插入排序()

Dim arr, temp, x, y, t, iMax, k, k1, k2

  t = Timer

  arr = Range("a1:a10")

  For x = 1 + 1 To UBound(arr)

  

     temp = arr(x, 1) '记得要插入的值

     

     For y = x - 1 To 1 Step -1

       If arr(y, 1) <= temp Then Exit For

       arr(y + 1, 1) = arr(y, 1)

       'k1 = k1 + 1

     Next y

     arr(y + 1, 1) = temp

     'k2 = k2 + 1

  Next

 ' Range("d3").Resize(UBound(arr)) = ""

 ' Range("d3").Resize(UBound(arr)) = arr

 'Range("d2") = Timer - t

 MsgBox k1

End Sub

Sub 插入排序单元格演示()

On Error Resume Next

  Dim arr, temp, x, y, t, iMax, k

  For x = 2 To 10

  

     temp = Cells(x, 1) '记得要插入的值

               Range("A" & x).Interior.ColorIndex = 3

     For y = x - 1 To 1 Step -1

               Range("A" & y).Interior.ColorIndex = 4

       If Cells(y, 1) <= temp Then Exit For

               Cells(y + 1, 1) = Cells(y, 1)

               Range("A" & y).Interior.ColorIndex = xlNone

     Next y

     Cells(y + 1, 1) = temp

               Range("A" & y).Interior.ColorIndex = xlNone

               Range("A" & x).Interior.ColorIndex = xlNone

  Next

End Sub

快速排序

Sub dd()

    Dim arr1(0 To 4999) As Long, arr, x, t

    t = Timer

    arr = Range("a1:a5000")

    For x = 1 To 5000

      arr1(x - 1) = arr(x, 1)

    Next x

    QuickSort arr1()

    Range("f2") = Timer - t

End Sub

Public Sub QuickSort(ByRef lngArray() As Long)

    Dim iLBound As Long

    Dim iUBound As Long

    Dim iTemp As Long

    Dim iOuter As Long

    Dim iMax As Long

   

    iLBound = LBound(lngArray)

    iUBound = UBound(lngArray)

    

    '若只有一个值,不排序

    If (iUBound - iLBound) Then

        For iOuter = iLBound To iUBound

            If lngArray(iOuter) > lngArray(iMax) Then iMax = iOuter

        Next iOuter

       

        iTemp = lngArray(iMax)

        lngArray(iMax) = lngArray(iUBound)

        lngArray(iUBound) = iTemp

    

        '开始快速排序

        InnerQuickSort lngArray, iLBound, iUBound

    End If

    Range("f3").Resize(5000) = Application.Transpose(lngArray)

End Sub

Private Sub InnerQuickSort(ByRef lngArray() As Long, ByVal iLeftEnd As Long, ByVal iRightEnd As Long)

    Dim iLeftCur As Long

    Dim iRightCur As Long

    Dim iPivot As Long

    Dim iTemp As Long

    

    If iLeftEnd >= iRightEnd Then Exit Sub

    

    iLeftCur = iLeftEnd

    iRightCur = iRightEnd + 1

    iPivot = lngArray(iLeftEnd)

    

    Do

        Do

            iLeftCur = iLeftCur + 1

        Loop While lngArray(iLeftCur) < iPivot

       

        Do

            iRightCur = iRightCur - 1

        Loop While lngArray(iRightCur) > iPivot

       

        If iLeftCur >= iRightCur Then Exit Do

       

        '交换值

        iTemp = lngArray(iLeftCur)

        lngArray(iLeftCur) = lngArray(iRightCur)

        lngArray(iRightCur) = iTemp

    Loop

    

递归快速排序

    lngArray(iLeftEnd) = lngArray(iRightCur)

    lngArray(iRightCur) = iPivot

    InnerQuickSort lngArray, iLeftEnd, iRightCur - 1

    InnerQuickSort lngArray, iRightCur + 1, iRightEnd

End Sub

冒泡排序

Option Explicit

Sub 冒泡排序()

 Dim arr, temp, x, y, t, k

 t = Timer

 arr = Range("a1:a10")

 For x = 1 To UBound(arr) - 1

   For y = x + 1 To UBound(arr) '只和当前数字下面的数进行比较

     If arr(x, 1) > arr(y, 1) Then '如果它大于它下面某一个数字

       temp = arr(x, 1)

       arr(x, 1) = arr(y, 1)

       arr(y, 1) = temp

     End If

      

   Next y

 Next x

 Range("b3").Resize(x) = ""

 Range("b3").Resize(x) = arr

 'Range("b2") = Timer - t

 MsgBox k

End Sub

Sub 冒泡排序演示()

 Dim arr, temp, x, y, t, k

 For x = 1 To 9

                         Range("a" & x).Interior.ColorIndex = 3

   For y = x + 1 To 10  '只和当前数字下面的数进行比较

                         Range("a" & y).Interior.ColorIndex = 4

     If Cells(x, 1) > Cells(y, 1) Then '如果它大于它下面某一个数字

       temp = Cells(x, 1)

       Cells(x, 1) = Cells(y, 1)

       Cells(y, 1) = temp

2     End If

                         Range("a" & y).Interior.ColorIndex = xlNone

   Next y

                         Range("a" & x).Interior.ColorIndex = xlNone

                         

 Next x

End Sub

第26集:VBA数组-7:VBA排序算法之插入排序和希尔排序

希尔排序

Sub 希尔排序()

  Dim arr

  Dim 总大小, 间隔, x, y, temp, t

  t = Timer

  arr = Range("a1:a30")

  总大小 = UBound(arr) - LBound(arr) + 1

  间隔 = 1

  If 总大小 > 13 Then

     Do While 间隔 < 总大小

       间隔 = 间隔 * 3 + 1

     Loop

     间隔 = 间隔  9

  End If

'  Stop

  Do While 间隔

     For x = LBound(arr) + 间隔 To UBound(arr)

      temp = arr(x, 1)

      For y = x - 间隔 To LBound(arr) Step -间隔

         If arr(y, 1) <= temp Then Exit For

         arr(y + 间隔, 1) = arr(y, 1)

        ' k1 = k1 + 1

      Next y

      arr(y + 间隔, 1) = temp

     Next x

    间隔 = 间隔  3

   Loop

  ' MsgBox k1

   'Range("e3").Resize(5000) = ""

    Range("d1").Resize(UBound(arr)) = arr

   'Range("e2") = Timer - t

End Sub

Sub 打乱顺序()

 Dim arr, temp, x

 arr = Range("a1:a" & Range("a65536").End(xlUp).Row)

 For x = 1 To UBound(arr)

   num = Int(Rnd() * UBound(arr) + 1)

   temp = arr(num, 1)

   arr(num, 1) = arr(x, 1)

   arr(x, 1) = temp

 Next x

 Range("a1").Resize(x - 1) = arr

End Sub

Sub 希尔排序单元格演示()

  Dim arr

  Dim 总大小, 间隔, x, y, temp, t

  t = Timer

  arr = Range("a1:a" & Range("a65536").End(xlUp).Row)

  总大小 = UBound(arr) - LBound(arr) + 1

  间隔 = 1

  If 总大小 > 13 Then

     Do While 间隔 < 总大小

       间隔 = 间隔 * 3 + 1

     Loop

     间隔 = 间隔  9

  End If

'  Stop

  Do While 间隔

     For x = LBound(arr) + 间隔 To UBound(arr)

      temp = Cells(x, 1)

      Range("a" & x).Interior.ColorIndex = 3

      For y = x - 间隔 To LBound(arr) Step -间隔

          Range("a" & y).Interior.ColorIndex = 6

         If Cells(y, 1) <= temp Then Exit For

         Cells(y + 间隔, 1) = Cells(y, 1)

        ' k1 = k1 + 1

      Next y

      Cells(y + 间隔, 1) = temp

      Range("a1:a30").Interior.ColorIndex = xlNone

     Next x

    间隔 = 间隔  3

   Loop

  ' MsgBox k1

   'Range("e3").Resize(5000) = ""

   ' Range("d1").Resize(UBound(arr)) = arr

   'Range("e2") = Timer - t

End Sub

选择排序

Option Explicit

Sub 选择排序()

  Dim arr, temp, x, y, t, iMax, k, k1, k2

  t = Timer

  arr = Range("a1:a10")

  For x = UBound(arr) To 1 + 1 Step -1

     iMax = 1 '最大的索引

     For y = 1 To x

          If arr(y, 1) > arr(iMax, 1) Then iMax = y

     Next y

     temp = arr(iMax, 1)

     arr(iMax, 1) = arr(x, 1)

     arr(x, 1) = temp

  Next x

  

  'Range("c3").Resize(UBound(arr)) = ""

  'Range("c3").Resize(UBound(arr)) = arr

  'Range("c2") = Timer - t

  'MsgBox k1

End Sub

Sub 选择排序单元格演示()

  Dim arr, temp, x, y, t, iMax, k, k1, k2

  For x = 10 To 2 Step -1

     iMax = 1

                       Range("a" & x).Interior.ColorIndex = 3

     For y = 1 To x

                       Range("a" & y).Interior.ColorIndex = 4

          If Cells(y, 1) > Cells(iMax, 1) Then

                       Range("a" & iMax).Interior.ColorIndex = xlNone

           iMax = y

          End If

                       Range("a" & y).Interior.ColorIndex = xlNone

                       Range("a" & iMax).Interior.ColorIndex = 6

                       

     Next y

     temp = Cells(iMax, 1)

     Cells(iMax, 1) = Cells(x, 1)

     Cells(x, 1) = temp

     Range("a" & x).Interior.ColorIndex = xlNone

     Range("a" & iMax).Interior.ColorIndex = xlNone

  Next x

End Sub

    

第27集:VBA字典-1

基本概念

Option Explicit

'1 什么是VBA字典?

   '字典(dictionary)是一个储存数据的小仓库。共有两列。

      '第一列叫key , 不允许有重复的元素。

      '第二列是item,每一个key对应一个item,本列允许为重复

            'Key   item

             'A     10

             'B     20

             'C     30

             'Z     10

'2 即然有数组,为什么还要学字典?

   '原因:提速,具体表现在

      '1) A列只能装入非重复的元素,利用这个特点可以很方便的提取不重复的值

      '2) 每一个key对应一个唯一的item,只要指点key的值,就可以马上返回其对应的item,利用字典可以实现快速的查找

'3 字典有什么局限?

    '字典只有两列,如果要处理多列的数据,还需要通过字符串的组合和拆分来实现。

    '字典调用会耗费一定时间,如果是数据量不大,字典的优势就无法体现出来。

    

'4 字典在哪里?如何创建字典?

    

    '字典是由scrrun.dll链接库提供的,要调用字典有两种方法

      '第一种方法:直接创建法

        'Set d = CreateObject("scripting.dictionary")

      '第二种方法:引用法

        '工具-引用-浏览-找到scrrun.dll-确定

字典的使用

Option Explicit

 '1 装入数据

    Sub t1()

      Dim D As New Dictionary

      Dim x As Integer

      For x = 2 To 4

       D.Add Cells(x, 1).Value, Cells(x, 2).Value

      Next x

      MsgBox D.Keys(0)

      MsgBox D.Keys(1)

      MsgBox D.Keys(2)

      MsgBox D.Items(0)

      'Stop

    End Sub

 '2 读取数据

    Sub t2()

'      Dim D

      Dim D As New Dictionary

      Dim arr

      Dim x As Integer

'      Set D = CreateObject("scripting.dictionary")

      For x = 2 To 4

       D.Add Cells(x, 1).Value, Cells(x, 2).Value

      Next x

      MsgBox D("李四")

      MsgBox D.Keys(2)

      Range("d1").Resize(D.Count) = Application.Transpose(D.Keys)

      Range("e1").Resize(D.Count) = Application.Transpose(D.Items)

      arr = D.Items

    End Sub

  '3 修改数据

    Sub t3()

      Dim D As New Dictionary

      Dim x As Integer

      For x = 2 To 4

       D.Add Cells(x, 1).Value, Cells(x, 2).Value

      Next x

      D("李四") = 78

      MsgBox D("李四")

      D("赵六") = 100

      MsgBox D("赵六")

    End Sub

  '4 删除数据

    Sub t4()

      Dim D As New Dictionary

      Dim x As Integer

      For x = 2 To 4

        D(Cells(x, 1).Value) = Cells(x, 2).Value

      Next x

       D.Remove "李四"

     ' MsgBox d.Exists("李四")

      D.RemoveAll

      MsgBox D.Count

    End Sub

 

'区分大小写

    Sub t5()

      Dim D As New Dictionary

      Dim x

      For x = 1 To 5

        D(Cells(x, 1).Value) = ""

      Next x

      Stop

    End Sub

    ub 求和问题()

    Dim arr, D As Object, ar

    Dim i As Integer, j As Byte

    Set D = CreateObject("scripting.dictionary")

    arr = Sheet2.Range("a1").CurrentRegion '选定区域装入数组

    Dim t$

    For i = 1 To UBound(arr) '循环从数组第1行到数组的最后一行

        t = arr(i, 1) & "|" & arr(i, 2)

        If D.Exists(t) Then

            D(t) = t & "|" & (--Split(D(t), "|")(2) + arr(i, 3))    '如果有相应的key,则提取对应item的的销售额与现有的相加,再组合后存入字典

        Else

            D(t) = t & "|" & arr(i, 3)                              '如果没有相应的Key,则存入"日期|名称|销售额"

        End If

    Next i

    Erase arr

    ReDim arr(1 To D.Count, 1 To 3)

    ar = D.Items

    For i = 1 To UBound(ar) + 1

        For j = 1 To 3

            arr(i, j) = Split(ar(i - 1), "|")(j - 1)

        Next j

    Next i

    Sheet3.Range("a1").CurrentRegion.ClearContents

    Sheet3.Range("a1").Resize(UBound(arr), 3) = arr

End Sub

第28集:VBA字典-2

字典与查找

Option Explicit

Sub 多表双向查找()

 Dim d As New Dictionary

 Dim x, y

 Dim arr

 For x = 3 To 5

   arr = Sheets(x).Range("a2").Resize(Sheets(x).Range("a65536").End(xlUp).Row - 1, 2)

   For y = 1 To UBound(arr)

     d(arr(y, 1)) = arr(y, 2)

     d(arr(y, 2)) = arr(y, 1)

   Next y

 Next x

 MsgBox d("C1")

 MsgBox d("吴情")

End Sub

字典与求和

Option Explicit

Sub 汇总()

 Dim d As New Dictionary

 Dim arr, x

 arr = Range("a2:b10")

 For x = 1 To UBound(arr)

   d(arr(x, 1)) = d(arr(x, 1)) + arr(x, 2) 'key对应的item的值在原来的基础上加新的

 Next x

 Range("d2").Resize(d.Count) = Application.Transpose(d.Keys)

 Range("e2").Resize(d.Count) = Application.Transpose(d.Items)

End Sub

字典与唯一值

Option Explicit

Sub 提取不重复的产品()

 Dim d As New Dictionary

 Dim arr, x

 arr = Range("a2:a12")

 For x = 1 To UBound(arr)

      d(arr(x, 1)) = ""

 Next x

 Range("c2").Resize(d.Count) = Application.Transpose(d.Keys)

End Sub

第29集:VBA数组与字典综合应用之下棋法(兰色原创)

多列汇总

Option Explicit

Sub 下棋法之多列汇总()

 Dim 棋盘(1 To 10000, 1 To 3)

 Dim 行数

 Dim arr, x, k

 Dim d As New Dictionary

 arr = Range("a2:c" & Range("a65536").End(xlUp).Row)

 For x = 1 To UBound(arr)

   If d.Exists(arr(x, 1)) Then

      行数 = d(arr(x, 1))

      棋盘(行数, 2) = 棋盘(行数, 2) + arr(x, 2)

      棋盘(行数, 3) = 棋盘(行数, 3) + arr(x, 3)

   Else

      k = k + 1

      d(arr(x, 1)) = k

      棋盘(k, 1) = arr(x, 1)

      棋盘(k, 2) = arr(x, 2)

      棋盘(k, 3) = arr(x, 3)

   End If

 Next x

 Range("f2").Resize(k, 3) = 棋盘

End Sub

多条件多列汇总

Option Explicit

Sub 下棋法之多条件多列汇总()

 Dim 棋盘(1 To 10000, 1 To 4)

 Dim 行数

 Dim arr, x As Integer, sr As String, k As Integer

 Dim d As New Dictionary

 arr = Range("a2:d" & Range("a65536").End(xlUp).Row)

 For x = 1 To UBound(arr)

    sr = arr(x, 1) & "-" & arr(x, 2)

    If d.Exists(sr) Then

      行数 = d(sr)

      棋盘(行数, 3) = 棋盘(行数, 3) + arr(x, 3)

      棋盘(行数, 4) = 棋盘(行数, 4) + arr(x, 4)

    Else

      k = k + 1

      d(sr) = k

      棋盘(k, 1) = arr(x, 1)

      棋盘(k, 2) = arr(x, 2)

      棋盘(k, 3) = arr(x, 3)

      棋盘(k, 4) = arr(x, 4)

    End If

 Next x

   Range("g2").Resize(k, 4) = 棋盘

End Sub

数据透视式汇总

Option Explicit

Sub 下棋法之数据透视表式汇总()

 Dim d As New Dictionary

 Dim 棋盘(1 To 10000, 1 To 7)

 Dim 行数, 列数

 Dim arr, x, k

 

 arr = Range("a2:c" & Range("a65536").End(xlUp).Row)

 

 For x = 1 To UBound(arr)

   列数 = (InStr("1月2月3月4月5月6月", arr(x, 2)) + 1) / 2 + 1

   If d.Exists(arr(x, 1)) Then

      行数 = d(arr(x, 1))

     

      棋盘(行数, 列数) = 棋盘(行数, 列数) + arr(x, 3)

   Else

      k = k + 1

      d(arr(x, 1)) = k

      棋盘(k, 1) = arr(x, 1)

      棋盘(k, 列数) = arr(x, 3)

   End If

 Next x

 

 Range("f2").Resize(k, 7) = 棋盘

End Sub

第30集:自定义函数基础

什么是自定义函数

Option Explicit

'1 什么是自定义函数?

  '在VBA中有VBA函数,我们还可以调用工作表函数,我们能不能自已编写函数呢?可以,这就是本集所讲的自定义函数

  

'2 怎么编写自定义函数?

 

   '我们可以按下面的结构编写自定义函数

  

    ' Function 函数名称(参数1,参数2....)

        

         '代码

         '函数名称=返回的值或数组

        

    ' End Function

    

编写和使用自定义函数

Option Explicit

'1 取得工作表总个数的自定义函数

Function shcount()

 shcount = Sheets.Count

End Function

Sub dd()

 MsgBox getv(Range("a7"))

End Sub

'2 取得单元格显示值的自定义函数

  Function getv(rg As Range)

    getv = rg.Text

  End Function

'3 截取字符串的函数

 Function jiequ(sr As String, fh As String, wz As Integer)

    

    Dim Arr

    Arr = Split(sr, fh)

    jiequ = Arr(wz - 1)

    

 End Function

  

'4 提取不重复值的个数

  Function 不重复个数(rg As Range)

   Dim d, Arr, ar

   Arr = rg

   Set d = CreateObject("scripting.dictionary")

   For Each ar In Arr

     d(ar) = ""

   Next ar

   不重复个数 = d.Count

  End Function

 Sub test()

  

  MsgBox jiequ("A-BRT-C-EF", "-", 2)

  

 End Sub

自定义函数的常见问题

Option Explicit

'1 怎么让自定义函数在所有工作簿中使用?

   '答: 把含有自定义函数的文件另存为加截宏,然后通过工具-加截宏-浏览找到这个文件-确定。

'2 怎么给自定义函数添加说明

    '工具-宏-宏名输入自定义函数的名称-选项--在说明栏中写入这个函数的名称

    

'3、怎么给自定义函数分类

    Sub 分类()

     Application.MacroOptions "不重复个数", Category:=4

    End Sub

     

   '注:

         '0 是全部

         '1 财务

         '2 日期和时间

         '3 数学和三角

         '4 统计

         '5 查找和引用

         '6 数据库

         '7 文本

         '8 逻辑

         '9 信息

     

第31集:自定义函数的参数设置

参数不定的自定义函数

Option Explicit

Function cheng(ParamArray n())

Dim num, k

  k = 0

  For Each num In n

    k = k + num

  Next num

  cheng = k

End Function

参数值默认和参数缺省

Option Explicit

Function shuiji1(maxnum, geshu, Optional qo As Integer)

 Dim d As New Dictionary

 Dim num

 Application.Volatile

 Do

   num = Int(Rnd() * maxnum + 1)

   If qo = 0 Then

    d(num) = ""

   ElseIf qo = 2 Then

    If num Mod 2 = 0 Then d(num) = ""

   ElseIf qo = 1 Then

    If Not num Mod 2 = 0 Then d(num) = ""

   End If

 Loop Until d.Count = geshu

 shuiji1 = Application.Transpose(d.Keys)

End Function

Function shuiji2(maxnum, geshu, Optional qo As Integer = 2)

 Dim d As New Dictionary

 Dim num, m

 Application.Volatile

 m = 1

 Do

   num = Int(Rnd() * maxnum + 1)

   If qo = 2 Then

    If num Mod 2 = 0 Then d(num) = ""

   ElseIf qo = 1 Then

    If Not num Mod 2 = 0 Then d(num) = ""

   Else

    Exit Function

   End If

 Loop Until d.Count = geshu

 shuiji2 = Application.Transpose(d.Keys)

End Function

返回数组的自定义函数

Option Explicit

'返回一个固定区间固定个数的不重复随数

Function shuiji(maxnum, geshu) 'maxnum是区间最大的数,geshu是返回多少个不重复的数

 Dim d As New Dictionary

 Dim num

 Application.Volatile

 Do

   num = Int(Rnd() * maxnum + 1)

   d(num) = ""

 Loop Until d.Count = geshu

 shuiji = Application.Transpose(d.Keys)

End Function

第32集:Msgbox函数完全应用

Msgbox函数简介

Option Explicit

'一、什么MsgBox函数

   '它可以弹出一个窗口,显示你设定的内容。并且窗口上有可以让你选择的按钮,点击不同的按钮会返回不同的数值。

 '用msgbox信息窗口可以增加一个程序对话的机会,以告诉程序下一步应该怎么做

  

    Sub test1()

      MsgBox "大家好,我是msgbox窗口"

    End Sub

'二、基本语法

   

   'Msgbox (窗口中显示的内容,按钮和图示类别,窗口标题,相关的帮助文件,帮助文件上下文的编号)

窗口的按钮类型和图标

Option Explicit

'按钮类型

   '消息窗体由按钮显示,图标显示,缺省按钮和其他特殊功能组合,这些功能都可以随意组合,组合他们只需要用"+"号

   

  Sub test8()

    MsgBox "test", vbYesNoCancel + vbExclamation + vbDefaultButton2 + vbMsgBoxHelpButton '显示确定和取消按钮并显示询问图标

  End Sub

  Sub test9()

    MsgBox "mytest", vbExclamation + vbYesNo '显示危险图标和是否按钮

  End Sub

  Sub test10()

    MsgBox "测试窗体结构", vbYesNoCancel + vbMsgBoxHelpButton + vbCritical + vbDefaultButton3, "测试四个按钮的窗口"

  End Sub

 Sub dd()

   MsgBox "dd", vbYesNo + vbExclamation + vbMsgBoxHelpButton

 End Sub

窗口和标题显示文字

Option Explicit

'1、窗口显示的内容

    

     '1) 基本显示:只需要给第一个参数设置一个字符串或生成字符串的表达式即或

       

        '例:

        Sub test2()

          MsgBox "你好,欢迎你的使用"

          MsgBox "你好!,欢迎你使用" & ThisWorkbook.Name

        End Sub

     

      '2) 换行显示。

            'chr(10) 可以生成换行符

            'chr(13) 可以生成回车符

            'vbcrlf 换行符和回车符

            'vbCr 等同于chr(10)

            'vblf 等同于chr(13)

         '例:

         Sub test3()

           MsgBox "我爱" & Chr(10) & "Excel精英培训"

          ' MsgBox "我爱你" & Chr(13) & "Excel"

          ' MsgBox "今天" & vbCrLf & "我是水王"

         End Sub

     

        '3) 表格显示

          'chr(9) 制表符

          Sub test4()

             MsgBox "姓名" & Chr(9) & "职业" & Chr(10) & "张三" & Chr(9) & "工程师" _

                     & Chr(10) & "于上伟" & Chr(9) & "教师"

          End Sub

     

          Sub test5()

            Dim sr, x, y

            For x = 1 To 5

              For y = 1 To 3

                sr = sr & Cells(x, y) & Chr(9) & Chr(9)

              Next y

              sr = sr & Chr(13)

            Next x

            MsgBox sr

          End Sub

        

          '用空格键设置

            ' space(n) 可以产生N个空格

          Sub test6()

          Dim x, y, sr, k

             For x = 1 To 5

               For y = 1 To 3

                 If VBA.IsNumeric(Cells(x, y)) Then

                   k = 12 - Len(Cells(x, y))

                 Else

                  k = 12 - Len(Cells(x, y)) * 2

                 End If

                  sr = sr & Cells(x, y) & Space(k)

               Next y

               sr = sr & Chr(13)

             Next x

           MsgBox sr

          End Sub

 

 '2  标题的显示文字

    Sub test7()

      MsgBox "核对关系出错了", , "系统提示"

    End Sub

   

窗体的返回值

Option Explicit

'要想和消息框交流,还需要在我们点击窗体的按钮后能返回一个值,告诉程序我们点了哪个按钮.

 Sub test11()

  Dim k

  k = MsgBox("测试返回值", vbYesNoCancel)

  MsgBox "你点击了按钮:" & Choose(k, "确定", "取消", "终止", "重试", "忽略", "是", "否")

 End Sub

 '应用示例

   Sub test12()

     If MsgBox("你确定要删除第15行吗?", vbQuestion + vbYesNo, "删除提示") = vbYes Then

       Rows(15).Delete

       MsgBox "删除成功"

     Else

       MsgBox "你取消了删除"

     End If

   End Sub

设置信息框上的帮助

Option Explicit

 

  '要添加帮助,需要设置msgbox 函数的第四和第五个参数

    '第四个参数是帮助文件的路径,帮助文件要放在C:WINDOWSHelp路径下

    '第五个参数和帮助文件本身有关,是为了准备的打开帮助文件而设置的上下文编号,如果没有则设置为0

  Sub test13()

  Dim x

  x = MsgBox("测试添加帮助的效果", vbOKCancel + vbMsgBoxHelpButton, "测试帮助!", "D:/a.chm", 0) '"C:WINDOWSHelpexcel.chm", 0)

  End Sub

自动定时关闭消息框

Option Explicit

'1 自动定时关闭消息框,可以用其他消息框完成

 Sub AA()

    Dim WshShell As Object

    Set WshShell = CreateObject("Wscript.Shell")

    WshShell.Popup "1秒后关闭!", 1, "提示!", 16

End Sub

 

  特殊值及含义说明

常数            值           描述

vbOKOnly         0          只显示 确定 按钮

VbOKCancel      1          显示 确定 及 取消 按钮。

VbAbortRetryIgnore      2          显示 放弃、重试 及 忽略 按钮。

VbYesNoCancel 3          显示 是、否 及 取消 按钮。

VbYesNo           4          显示 是 及 否 按钮。

VbRetryCancel  5          显示 重试 及 取消 按钮。

VbCritical          16        危险图标

VbQuestion      32        询问图标

VbExclamation  48        警告图示

VbInformation  64        信息图标

vbDefaultButton1         0          第一个按钮是缺省值。

vbDefaultButton2         256      第二个按钮是缺省值。

vbDefaultButton3         512      第三个按钮是缺省值。

vbDefaultButton4         768      第四个按钮是缺省值。

vbApplicationModal      0          应用程序强制返回;应用程序一直被挂起,直到用户对消息框作出响应才继续工作。

vbSystemModal 4096     系统强制返回;全部应用程序都被挂起,直到用户对消息框作出响应才继续工作。

vbMsgBoxHelpButton   16384   将Help按钮添加到消息框

VbMsgBoxSetForeground          65536   指定消息框窗口作为前景窗口,就是显示在窗口的最上层

vbMsgBoxRight 524288 文本为右对齐

vbMsgBoxRtlReading     1048576           指定文本应为在希伯来和阿拉伯语系统中的从右到左显示

常数     值        说明

vbOK    1          确定

vbCancel2         取消

vbAbort            3          终止

vbRetry 4          重试

vbIgnore5         忽略

vbYes   6          是

vbNo    7          否

第33集:Inputbox函数方法应用

基本应用

Option Explicit

  '最后一个参数数值说明:

 '     值    含义

      '0     公式

      '1     数字

      '2     文本 (字符串)

      '4     逻辑值 (True 或 False)

      '8     单元格引用,作为一个 Range 对象

      '16    错误值,如 #N/A

      '64    数值数组

     

' 1.引用单元格

     'inputbox方法的最后个参数值为8的时候,可以用鼠标选择单元格的地址.使用变量是使用SET声明的对象变量,则返回的是一个单元格对象,

  '否则反回的这个单元格区域的值,即VBA数组.

   Sub text5()

     Dim rg As Range

     Set rg = Application.InputBox("请选择单元格区域", "选取提示", , , , , , 8)

     MsgBox rg.Parent.Name & "!" & rg.Address

   End Sub

  

     Sub text6()

     Dim rg

      rg = Application.InputBox("请选择单元格区域", "选取提示", , , , , , 8)

     MsgBox rg(2, 1)

   End Sub

 '2 公式引用

    '当最后一个参数设置为0时,可以输入公式,返回的也是一个公式字符串,如果公式中含单元格引用,可以自动转换成rc引用格式(以当前活动单元格为参照)

    

    Sub test7()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 0)

      MsgBox r

    End Sub

 '3 限制输入返回的数值格式

  Sub test8()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 1) '输入非数字则会提示无效的数字

      MsgBox r

  End Sub

  Sub test9()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 2) '可以输入字符,当然,文字型数字也符字符

      MsgBox TypeName(r)

  End Sub

 '4.数值数组

    '可以选取单元格区域的值作为数组,也可以输入以带有大括号的一维或二维数组

  Sub test10()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 64) '可以输入字符,当然,文字型数字也符字符

      MsgBox r(2, 1)

  End Sub

Inputbox语法概述

Option Explicit

'1.inpubox函数

  

  '语法:

    'inputbox(输入框显示内容,窗体标题,默认值,水平位置,垂直位置,帮助文件,帮助文件ID

    

'2.Application对象的Inputbox方法:显示一个接收用户输入的对话框。返回此对话框中输入的信息

  

   '语法:

     'Application.InputBox(对话框显示内容,输入框标题,文本框内默认值,x坐标,y坐标,帮助文件,帮助文件上下文ID,文本框内输入类型)

  

  '最后一个参数数值说明:

 '     值    含义

      '0     公式

      '1     数字

      '2     文本 (字符串)

      '4     逻辑值 (True 或 False)

      '8     单元格引用,作为一个 Range 对象

      '16    错误值,如 #N/A

      '64    数值数组

 '什么时候用方法,什么时候用函数

       '从上面的参数可以看出inputbox函数和方法的不同之处是方法比函数多了后面几个参不数,如果只是简单的输入,可以用方法,

    '如果需要添加帮助和设置输入类型,则用Application对象的Inputbox方法.

Inputbox的扩展应用

Option Explicit

  '最后一个参数数值说明:

 '     值    含义

      '0     公式

      '1     数字

      '2     文本 (字符串)

      '4     逻辑值 (True 或 False)

      '8     单元格引用,作为一个 Range 对象

      '16    错误值,如 #N/A

      '64    数值数组

     

' 1.引用单元格

     'inputbox方法的最后个参数值为8的时候,可以用鼠标选择单元格的地址.使用变量是使用SET声明的对象变量,则返回的是一个单元格对象,

  '否则反回的这个单元格区域的值,即VBA数组.

   Sub text5()

     Dim rg As Range

     Set rg = Application.InputBox("请选择单元格区域", "选取提示", , , , , , 8)

     MsgBox rg.Parent.Name & "!" & rg.Address

   End Sub

  

     Sub text6()

     Dim rg

      rg = Application.InputBox("请选择单元格区域", "选取提示", , , , , , 8)

     MsgBox rg(2, 1)

   End Sub

 '2 公式引用

    '当最后一个参数设置为0时,可以输入公式,返回的也是一个公式字符串,如果公式中含单元格引用,可以自动转换成rc引用格式(以当前活动单元格为参照)

    

    Sub test7()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 0)

      MsgBox r

    End Sub

 '3 限制输入返回的数值格式

  Sub test8()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 1) '输入非数字则会提示无效的数字

      MsgBox r

  End Sub

  Sub test9()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 2) '可以输入字符,当然,文字型数字也符字符

      MsgBox TypeName(r)

  End Sub

 '4.数值数组

    '可以选取单元格区域的值作为数组,也可以输入以带有大括号的一维或二维数组

  Sub test10()

      Dim r

      r = Application.InputBox("请输入公式", "输入提示", , , , , , 64) '可以输入字符,当然,文字型数字也符字符

      MsgBox r(2, 1)

  End Sub

第34集:调用Excel对话框

FileDialog对象

Option Explicit

'一 FileDialog 对象简介

 '提供文件对话框,功能与 Microsoft Office 应用程序中标准的“打开”和“保存”对话框类似。

 '利用这些对话框,解决方案的用户可以简便地指定解决方案中应该使用的文件和文件夹。

'“打开”对话框:让用户选择一个或多个可以在主机应用程序中使用 Execute 方法打开的文件。

'“另存为”对话框:让用户选择一个可以使用 Execute 方法保存当前文件的文件。

'“文件选取器”对话框:让用户选择一个或多个文件。用户选择的文件路径将捕获到 FileDialogSelectedItems 集合。

'“文件夹选取器”对话框:让用户选择一个路径。用户选择的文件路径将捕获到 FileDialogSelectedItems 集合。

'二 属性和方法

  

   '1 AllowMultiSelect 如果允许用户从文件对话框中选择多个文件,则返回 True。Boolean 类型,可读写

   '2 SelectedItems 选取的多个文件集合

   '3 InitialFileName 属性:设置初始路径和文件名称

   '4 InitialView 属性 :可以设置初始文件的显示样多

   '5 show 可以判断用户是否点击了取消按钮,如果点击取消会返回0,否则返回-1

   

    '选择并返回一组文件名和路径

      Sub f1()

        Dim f

        Dim dig As Object

        Set dig = Application.FileDialog(msoFileDialogOpen)

        With Application.FileDialog(msoFileDialogOpen)

           .AllowMultiSelect = True

           .Filters.Add "Excel文件", "*.xls", 1

           .InitialFileName = ThisWorkbook.FullName '"d:"

           .InitialView = msoFileDialogViewDetails

           .Title = "对话框测试"

           .Show

           MsgBox .Show

          For Each f In .SelectedItems

            MsgBox f

          Next f

        End With

        Set dig = Nothing

      End Sub

   '选择并返回文件夹

     Sub F2()

      Dim dig As Object

      Set dig = Application.FileDialog(msoFileDialogFolderPicker)

       With dig

         .InitialFileName = "d:"

         .Show

         MsgBox .SelectedItems(1)

       End With

     Set dig = Nothing

     End Sub

   '

Sub t10()

Dim f

 With Application.FileDialog(msoFileDialogOpen)

     .AllowMultiSelect = True

     .Filters = "Excel表格,*.xls"

     .InitialFileName = "测试.xls"

     .FilterIndex = 1

     .Title = "测试"

  End With

End Sub

GetOpenFilename

Option Explicit

' 一、 概述基本语法

   'GetOpenFilename相当于Excel打开窗口,通过该窗口选择要打开的文件,并可以返回选择的文件完整路径和文件名。

     '注:此方法并不会真正打开文件?

  'Application.GetOpenFilename(文件类型筛选规则,优先显示第几个类型的文件,标题,是否允许选择多个文件名)

  

     

  

 '二、示例

   

      '1 打开类型只限excel文件

     

        '设置打开某类文件可以用下面的规则:

         

           '"文件类型说明文字,*.文件类型后辍"

      Sub t1()

        Dim f

        f = Application.GetOpenFilename("Excel文件,*.xls")

        MsgBox f

      End Sub

        

      '2、打开多种文件类型(word和excel)

       

       '打开多种文件类型,只需要用","隔开,添加新的文件类型说明和文件类型。

      

      Sub t2()

        Dim f

        f = Application.GetOpenFilename("Excel2003文件,*.xls,Word文件,*.doc")

        MsgBox f

      End Sub

  

      '3 打开多种文件类型,默认显示word文件

     

      Sub t3()

        Dim f

        f = Application.GetOpenFilename("Excel2003文件,*.xls,Word文件,*.doc,文本文件,*.txt", 2)

        MsgBox f

      End Sub

       

       '4 设置对话框名称

      

       Sub t4()

          Dim f

           f = Application.GetOpenFilename("Excel2003文件,*.xls,Word文件,*.doc,文本文件,*.txt", 2, "选择要汇总的文件")

           MsgBox f

      End Sub

   

       '5 选择多个文件,并以数组形式返回

      Sub t5()

        Dim f

        ChDrive "E"

        ChDir Application.Path

        'ChDir ".."

        f = Application.GetOpenFilename("Excel2003文件,*.xls,Word文件,*.doc,文本文件,*.txt", 1, MultiSelect:=True)

        MsgBox f(1)

      End Sub

GetSaveFilename

     'GetSaveAsFilename语法:

         ' GetSaveAsFilename(默认显示的文件名,筛选条件,多个筛选类型时显示第几个,标题)

         '注:该窗口也会有实质性的保存操作.只作为返回文件名的一个途径

       Sub t1()

        Dim f

        f = Application.GetSaveAsFilename("示例.xls", "excel表格,*.xls", , "保存示例")

        MsgBox f

      End Sub

改变窗口默认路径

Option Explicit

 

   'chdrive 盘符 可以改变默认驱动器

   'chdir  路径  可以改变默认路径

   

      Sub t6()

        Dim f

         ChDrive "E"

         ChDir ThisWorkbook.Path

        'ChDir ".."

        f = Application.GetOpenFilename("Excel2003文件,*.xls,Word文件,*.doc,文本文件,*.txt", 1, MultiSelect:=True)

       ' MsgBox f(1)

      End Sub

第35集:字符串的拆分、查找与转换

字符串拆与组合

Option Explicit

'字符串截取

'left,right,mid,Len

Sub z1()

  Dim sr

  sr = "Excel精英培训网"

  Debug.Print Left(sr, 5)

  Debug.Print Right(sr, 5)

  Debug.Print Mid(sr, 3, 5)

  Debug.Print Left(sr, Len(sr) - 1)

End Sub

'split

 

Sub z2()

  Dim sr, arr

  sr = "Excel的精的英的培训网"

  arr = Split(sr, "的")

  Debug.Print UBound(arr)

End Sub

'val

 Sub z3()

  Dim sr

  sr = "89.90美元"

  Debug.Print Val(sr)

 End Sub

'字符串组合

 '&

 Sub a4()

  Debug.Print "a" & "b"

 End Sub

 'join

  

 Sub a5()

  Dim sr, arr

  sr = "Excel-精英-培训网"

  arr = Split(sr, "-")

  Debug.Print Join(arr, "+")

End Sub

字符串的查找与替换

Option Explicit

'instr 从前向后查

Sub c1()

  Dim sr

  sr = "Excel精英培训"

  Debug.Print InStr(sr, "精英") > 0

End Sub

'InStrRev 从后向前

Sub c2()

  Dim sr

  sr = "Excel精英培训培训论坛"

  Debug.Print InStr(sr, "培")

End Sub

'Replace替换

Sub c5()

 Dim sr

  sr = "Excel精英培训网"

  sr = Replace(sr, "培训网", "论坛")

  Debug.Print sr

End Sub

'mid语句替换

Sub c6()

 Dim sr

  sr = "Excel精英培训网"

  Mid(sr, 8, 3) = "论坛"

  Debug.Print sr

End Sub

字符转换

Option Explicit

'LCase 转换成小写

Sub z1()

  Debug.Print LCase("ABC")

End Sub

'UCcae 转换成大写

Sub z2()

  Debug.Print UCase("Abc")

  

End Sub

'StrConv 函数

'常数 值 说明

'vbUpperCase 1 将字符串文字转成大写。

'vbLowerCase 2 将字符串文字转成小写。

'vbProperCase 3 将字符串中每个字的开头字母转成大写

Sub 转换()

  Debug.Print VBA.StrConv("wHo ARE you?", vbProperCase)

  

End Sub

Sub 转换2()

 Dim i As Long

Dim x() As Byte

x = StrConv("ABCDEFG", vbFromUnicode)    ' 转换字符串。

Debug.Print Application.Min(x)

For i = 0 To UBound(x)

    Debug.Print x(i)

Next

End Sub

'TRim删除两端空格

'Ltrim 删除左边空格

'Rtrim 删除右边空格

 Sub z3()

 Dim sr

 

 sr = " A B BC "

 Debug.Print Trim(sr)

 Debug.Print LTrim(sr)

 Debug.Print RTrim(sr)

 End Sub

 

'ASC 返回一个 Integer,代表字符串中首字母的字符代码,ANSI 字符集

'CHr 返回 String,其中包含有与指定的字符代码相关的字符

Sub z4()

  Debug.Print Asc("Z")

  Debug.Print Chr(90)

End Sub

'Space 和 string生成重复的字符

 Sub z5()

 

    Debug.Print "A" & Space(10) & "B"

    Debug.Print "C" & String(10, "a") & "D"

    

 End Sub

第36集:like运算符的使用

like对比字符串

Option Explicit

'like "对比的字符串"

'Option Compare Text

  ' 字符串1 like 字符串2

 Sub L1()

   Debug.Print "ABC" Like "ABc"

 End Sub

'通配符?

  '判断BA是不是长度为2,且第二个字符为A

 Sub L2()

   Debug.Print "BA" Like "?A"

 End Sub

'通配符*

     '判断字符串中是否包括cel

 Sub L3()

   Debug.Print "Excel精英培训" Like "*cel*"

 End Sub

'判断含通配符的字符串

  '把通配符放在[]内,就代表本身字符的对比

 Sub l4()

   'Debug.Print "QAB" Like "Q?B"

   Debug.Print "QaB" Like "Q?B"

   'Debug.Print "Q?B" Like "Q[?]B"

   'Debug.Print ""

 End Sub

'判断是指定位数数字

  '判断数字是否为两个整数构成的

 Sub l9()

    Debug.Print 5 Like "#"

 End Sub

'判断在某个区间的字符

  Sub L10()

   '[最小-最大最小2-最小3]

    'Debug.Print "q" Like "[A-Za-z]"  ' 判断q是不是字母

   ' Debug.Print "H" Like "[A-GM-Z]"  ' 判断H是不是在A-G,M-Z区间

    Debug.Print 8 Like "[!2-9]"

  End Sub

'判断非在某个区间的字符

   Sub L11()

   

     Debug.Print "A" Like "[!C-Z]"

     

   End Sub

   

'判断在列出的字符里

   Sub L12()

   

      Debug.Print "M" Like "[!ABCDEUE]"

     

   End Sub

    

'判断A~C开头,F~G结尾

  

   Sub L13()

     

     Debug.Print "AEREM" Like "[A-C]*[L-P]"

     Debug.Print "A334M" Like "[A-C]###[L-P]"

     

   End Sub

 

实例

Option Explicit

Sub 求和()

Dim x, y, k

For x = 2 To 11

  For y = 2 To 12

    If Cells(y, 1) Like Cells(x, "F") Then

       k = k + Cells(y, 2)

       Range("a" & y).Interior.ColorIndex = 3

    End If

  Next y

  Cells(x, "g") = k

  Cells(x, "f").Interior.ColorIndex = 3

  k = 0

  Stop

  Cells(x, "f").Interior.ColorIndex = xlNone

  Range("a2:a12").Interior.ColorIndex = xlNone

Next x

End Sub

序号    求和类型        对比规则

1          包含A的数量  *A*

2          以A开头的数量          A*

3          以A~D开头的数量      [A-D]*

4          以A~D开头第2位是2的数量           [A-D]2*

5          以A~D开头第2位是7-9的数量        [A-D][7-9]*

6          第2位后全是数字的数量        ?#####

7          以E-G开头,m-x结尾的数量 [E-G]*[m-x]

8          第5位是字母的数量   ????[A-Za-z]?

9          包含?号的数量和       *[?]*

10        以非A~G的字符开始  [!A-G]*

第37集:正则表达式1

一 正则表达式

   '正则表达式是处理字符串的外部工具,它可以根据设置的字符串对比规则,进行字符串的对比、替换等操作。

   

   '正则表达式的作用:

     '1、完成复杂的字符串判断

     '2、在字符串判断时,可以最大限度的避开循环,从而达到提高运行效率的目的。

   

'二 使用方法

   

   '1、引用法

   '点击VBE编辑器菜单:工具 - 引用,选取: Microsoft VBScript Regular Expressions 5.5,引用后在程序开始进行如下声明

     'Dim regex As New RegExp

     Sub t1()

       Dim reg As New RegExp

     End Sub

     

    '2、直接他建法

'     代码引用 (后期绑定)

'     Dim regex As Object

'     Set regex = CreateObject("VBScript.RegExp") '创建正则对象

     Sub t2()

       Dim reg As Object

       Set reg = CreateObject("VBScript.RegExp")

     End Sub

 '三 常用属性

    

    '1 Global属性:

       '如果值为true,则搜索全部字符

       '如果值为False,则搜索到第1个即停止

       '1 例:

       Sub t3()

         Dim reg As New RegExp

         Dim sr

         sr = "ABCEA"

         With reg

           .Global = True

           .Pattern = "A"

           Debug.Print .Replace(sr, "")

         End With

       End Sub

      

    '2 IgnoreCase 属性

       '如果搜索是区分大小写的,为False(缺省值)True不分

    

    '3 Pattern 属性

       ' 一个字符串,用来定义正则表达式。缺省值为空文本。

    '4 Multiline 属性,字符串是不是使用了多行,如果是多行,$适用于每一行的最后一个

      

       Sub t4()

         Dim reg As New RegExp

         Dim sr

         sr = "AEA" & Chr(10) & "ABCA"

         With reg

           .Global = True

           .MultiLine = True

           '.Pattern = "A$"

           .Pattern = "^A"

           Debug.Print .Replace(sr, "")

         End With

       End Sub

      

     '5  Execute 方法

         '返回一个 MatchCollection 对象,该对象包含每个成功匹配的 Match 对象,

         '返回的信息包括:

           'FirstIndex:开始位置

           'Length; 长度

           'Value:长度

       Sub t5()

         Dim reg As New RegExp

         Dim sr, matc

         sr = "A454BCEA5"

         With reg

           .Global = True

           .Pattern = "Ad+"

           Set matc = .Execute(sr)

         End With

         Stop

       End Sub

     

       Function ns(rg)

         Dim reg As New RegExp

         Dim sr, ma, s, m, x

         With reg

           .Global = True

           .Pattern = "d*.?d*"

         Set ma = .Execute(rg)

           For Each m In ma

              s = s + Val(m)

           Next m

         End With

        ns = s

       ' Stop

       End Function

      

     '6、Text方法

        '返回一个布尔值,该值指示正则表达式是否与字符串成功匹配。其实就是判断两个字符串是否匹配成功

        Sub t7()

         Dim reg As New RegExp

         Dim sr

         sr = "BCR6EA"

         With reg

           .Global = True

           .Pattern = "d+"

           If .test(sr) Then MsgBox "字符串中含有数字"

         End With

        End Sub

     入门例子

Function 提取中文(rg As String, k As Integer)

  Dim regx As New RegExp

  With regx

   .Global = True

   If k = 1 Then

   

    .Pattern = "D"

    

   ElseIf k = 2 Then

   

    .Pattern = "w"

    

   End If

   

   提取中文 = .Replace(rg, "")

  End With

End Function

       

第38集  正则表达式2

Option Explicit

 '正则表达式的核心是设置对比的规则,也就是设置Pattern属性,而组成这些规则除了字符本身以外,是具有特定含义的符号。

 '下面介绍的是正规表达式中常用符号的第一部分。

'号

  '1.放在不便书写的字符前面,如换行符(r),回车符(n),制表符(t),自身(\)

  '2.放在有特殊意义字符的前面,表示它自身,"$","^","."

  

  '3.放在可以匹配多个字符的前面

     

       'd 0~9的数字

       'w 任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

       's 包括空格、制表符、换页符等空白字符的其中任意一个

      

       '以上改为大写时,为相反的意思,如D 表示非数字类型

      

        Sub t1()

           Dim regx As New RegExp

           Dim sr

           sr = "AE45B646C"

           With regx

             .Global = True

             .Pattern = "d" '排除非数字

             Debug.Print .Replace(sr, "")

           End With

        End Sub

'.(点)

   '可以匹配除换行符以外的所有字符

'+号

   '+表示一个字符可以有任意多个重复的。

    

   Sub t11()

     Dim regx As New RegExp

     Dim sr

     sr = "A234CA7A"

     With regx

      .Global = True

      .Pattern = "Ad+"

      Debug.Print .Replace(sr, "")

     End With

     

   End Sub

'{}号

  '可以设置重复次数

    '1 {n} 重复n次

        Sub t16()

           Dim regx As New RegExp

           Dim sr

           sr = "A234CA7A67"

           With regx

            .Global = True

            .Pattern = "d{5}" '连续两个数字

            Debug.Print .Replace(sr, "")

           End With

          

         End Sub

   '2  {m,n}最小重复m次,最多重复n次

     

        Sub t22()

           Dim regx As New RegExp

           Dim sr

           sr = "A234CA7A6789"

           With regx

            .Global = True

            .Pattern = "d{4,5}" '连续两个数字或连续三个数字

            Debug.Print .Replace(sr, "")

           End With

         End Sub

    '3 {m,} 最少重复m次,相当于+

         Sub t23()

           Dim regx As New RegExp

           Dim sr

           sr = "A2348t6CA7A67"

           With regx

            .Global = True

            .Pattern = "d{2,}" '连续两个数字或连续三个数字

            Debug.Print .Replace(sr, "")

           End With

         End Sub

        

'* 可以出现0等任意次   相当于 {0,},比如:"^*b"可以匹配 "b","^^^b"...

' ?

  '1 匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

        Sub t24()

           Dim regx As New RegExp

           Dim sr

           sr = "A23.48CA7A6..7"

           With regx

            .Global = True

            .Pattern = "d+.?d+" '最多连续1个

            Debug.Print .Replace(sr, "")

           End With

         End Sub

    '2 利用+?的格式可以分段匹配

         

      Sub t87()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "<td><p>aa</p></td> <td><p>bb</p></td>"

        With regex

          .Global = True

          .Pattern = "<td>.*?</td>"

         Set mat = .Execute(sr)

          For Each m In mat

            Debug.Print m

          Next m

        End With

      End Sub

     

     Sub t88()

              

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = " aba  aca  ada "

        With regex

          .Global = True

          .Pattern = "s.+?s"

         Set mat = .Execute(sr)

          For Each m In mat

            Debug.Print m

          Next m

        End With

     End Sub

第39集:正则表达式3

其他常用符号

Option Explicit

'^符号:限制的字符在最前面,如^d表示以数字开头

 

    Sub T34()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "d234我345d43"

        With regex

          .Global = True

          .Pattern = "^d*"

            Set mat = .Execute(sr)

            For Each m In mat

              Debug.Print m

            Next m

        End With

      End Sub

'$符号:限制的字符在最后面,如 A$表示最后一个字符是A

   

    Sub T3433()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "R243r"

        With regex

          .Global = True

           .Pattern = "^D.*D$"

            Set mat = .Execute(sr)

            For Each m In mat

              Debug.Print m

            Next m

        End With

      End Sub

'b

  '空格(包含开头和结尾)

  

        Sub t26()

           Dim regx As New RegExp

           Dim sr

           sr = "A12dA56 A4"

           With regx

            .Global = True

            .Pattern = "bAd+"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

    

    Sub T272()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "ad bf cr de ee"

        With regex

          .Global = True

           .Pattern = ".+?b"

            Set mat = .Execute(sr)

            For Each m In mat

              If m <> " " Then Debug.Print m

            Next m

        End With

      End Sub

'|

 '可以设置两个条件,匹配左边或右边的

        Sub t27()

           Dim regx As New RegExp

           Dim sr

           sr = "A12DA56 A4B34D"

           With regx

            .Global = True

            .Pattern = "Ad+|Bd+"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

'un 匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。

'汉字一的编码是4e00,最后一个代码是9fa5

       Sub t2722()

           Dim regx As New RegExp

           Dim sr

           sr = "A12d我A爱56你 A4"

           With regx

            .Global = True

            .Pattern = "[u4e00-u9fa5]"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

小括号的作用

Option Explicit

'()

  '可以让括号内作为一个整体产生重复

   

        Sub t29()

           Dim regx As New RegExp

           Dim sr

           sr = "A3A3QA3A37BDFE87A8"

           With regx

            .Global = True

            .Pattern = "((A3){2})" '相当于A3A3

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

  '取匹配结果的时候,括号中的表达式可以用 数字引用

        Sub t30()

           Dim regx As New RegExp

           Dim sr

           sr = "A3A3QA3A37BDFE87A8"

           With regx

            .Global = True

            .Pattern = "((A3){2})Q1"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

          Sub t31()

           Dim regx As New RegExp

           Dim sr

           sr = "A3A3B4B4QB4B47BDFE87A8"

           With regx

            .Global = True

            .Pattern = "((A3){2})((B4){2})Q4"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

       

'用(?=字符)可以先进行预测查找,到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。

  

  '例:截取某个字符之前的数据

      Sub t343()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "100元8000元57元"

        With regex

          .Global = True

           .Pattern = "d+(?=元)" '查找任意多数字后的元,查找到后从元以前开始查找(因为元前的数字已被使用,

                                  '所以只能从元开始查找)匹配 ()后面的,因为后面没有设置,所以只显示前面的数字,元不再显示

            Set mat = .Execute(sr)

            For Each m In mat

              Debug.Print m

            Next m

        End With

      End Sub

   '例:验证密码,条件是4-8位,必须包含一个数字

      Sub t355()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "A8ayaa"

        With regex

          .Global = True

           .Pattern = "^(?=.*d).{4,8}$"

            Set mat = .Execute(sr)

            For Each m In mat

              Debug.Print m

            Next m

        End With

      End Sub

     

'用(?!字符)可以先进行负预测查找,到一个匹配项后,将在匹配文本之前开始搜索下一个匹配项。 不会保存匹配项以备将来之用。

     Sub t356()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "中国建筑集团公司"

        With regex

          .Global = True

           .Pattern = "^(?!中国).*"

            Set mat = .Execute(sr)

            For Each m In mat

              Debug.Print m

            Next m

        End With

      End Sub

 

'()与|一起使用可以表示or

      Sub t344()

        Dim regex As New RegExp

        Dim sr, mat, m

        sr = "100元800块7元"

        With regex

          .Global = True

           .Pattern = "d+(元|块)"

           '.Pattern = "d+(?=元|块)"

            Set mat = .Execute(sr)

            For Each m In mat

              Debug.Print m

            Next m

        End With

      End Sub

中括号的作用

Option Explicit

'[]

 '使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 不包含一系列字符,

 '则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个

 

  '1 和括号内的其中一个匹配

        Sub t29()

           Dim regx As New RegExp

           Dim sr

           sr = "ABDC"

           With regx

            .Global = True

            .Pattern = "[BC]"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

       

   '2 非括号内的字符

       

        Sub T35()

           Dim regx As New RegExp

           Dim sr

           sr = "ABCDBDC"

           With regx

            .Global = True

            .Pattern = "[^BC]"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

   '3 在一个区间

        Sub t38()

           Dim regx As New RegExp

           Dim sr

           sr = "ABCDGWDFUFE"

           With regx

            .Global = True

            .Pattern = "[a-h]"

            Debug.Print .Replace(sr, "")

           End With

          

        End Sub

        Sub t40()

           Dim regx As New RegExp

           Dim sr

           sr = "124325436789"

           With regx

            .Global = True

            .Pattern = "[1-47-9]"

            Debug.Print .Replace(sr, "")

           End With

          

        End 

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>