欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

第3章 Excel VBA基础语法 【上】

程序员文章站 2024-03-12 12:22:26
...

概述:

这时候让我想起英语语法,太枯燥了,不过没办法,已经想玩游戏,你得知道游戏规则,才能玩的更骚。。。。

1、 语法,编程的基础

1.2、VBA中有哪些数据类型

数据类型就是根据不同数据特性,定义不同类型,例如文本、日期、数值等

VBA里的数据类型有:字节型(Byte)、整数型(Integer), 长整数型(Long), 单精度浮点型(Single), 双精度浮点型(Double),货币型(Currency)等等

第3章 Excel VBA基础语法 【上】

2、 存储数据的容器:常量和变量

2.1、常量和变量

常量就是不变的量,例如π,变量就是可以变。

2.2使用变量

语法:Dim  变量名 As 数据类型

例如:Dim Str As String  (Str就是装String类型的数据)

Dim str As String*10 (表示最多装10个字节数据)

使用变量类型声明符(简写模式)如上图所示类型标识符

Dim Str$  (这里$字符串, 原来美元就是一个字符串丫)

声明多个变量(逗号隔开

Dim str As String, num As Integer,

 相当于:

Dim str As String

Dim num As Integer

如果不指定变量类型 

Dim Str (默认是Variant类型)

什么是Variant

所有数据类型统称,它表现所有数据类型,意味它很大(一般不要声明为Variant,你计算都不知道应该给你这个变量分配多少内存,杀鸡焉用牛刀一个道理)

强制声明所有变量

方法一:在模块的第一句手动输入代码:“Option Explicit”,它会强制检查。

第3章 Excel VBA基础语法 【上】

方法二:在工具菜单栏中有设置选项,在每一次插入模块自动会添加 Option Explicit

第3章 Excel VBA基础语法 【上】

还可以声明变量的作用域(也就是变量在哪里有效)

语法一: Public 变量名 As 数据类型

语法二:Private 变量 As 数据类型

语法三:Static 变量名As 数据类型

例如:

Public str As String 

Private str As String

Static str As String

变量的作用域

第3章 Excel VBA基础语法 【上】


把数量存储到变量里

基本数据类型

语法 【Let】 变量名称 =数据   (【】表示可以省略)

简写为 变量名称=数据

Option Explicit


Sub 第一个宏()
    Dim str As String     '声明变量名为str,类型为String
    
    Let str = "一起来学VBA"  '将“一起来学VBA”赋值给str变量,那么str就代表这个字符串
    
    Range("A1").Value = str   '将字符串转换填充单元格A1
End Sub


第3章 Excel VBA基础语法 【上】

给对象变量赋值,语法

Set 变量名称 = 对象(Set不能省略)

Option Explicit


Sub 第一个宏()
   Dim rng As Range       '声明一个Range变量,可以表示单元格
   Set rng = Worksheets("Sheet2").Range("A1")  '将工作表Sheet1的A1单元格对象赋值给rng
   rng.Value = "学习VBA就是这么简单"    '这时候rng就代表A1单元格
End Sub

第3章 Excel VBA基础语法 【上】

2.3 使用常量

常量通常用来存储一些固定的不会被修改的值,如圆周率π,各种税率 (其实就是取有意义变量代替值)

所以只能赋值一次

语法: Const 变量名称 As 数据类型 = 数值

常量作用域类似变量,在过程中定义,过程内可用(本地常量),过程外定义,模块级常量, public + 过程外定义  公共常量

2.4、 使用数组

什么是数组

数组类似你买一盒饼干,分成几个格,每一个的饼都是一样的。

数组特点:

  • 数据共享同一个名称,即数组名
  • 数组有多个同种类型的变量组成
  • 数组中的元素按次序存储在数组中,通过索引号进行区分
  • 数组也是变量

语法:

Dim 数组名(a to b) As 数据类型

Dim num (1 to 50) As String (表示50个字符串打包成的数组)。

给数组赋值

num(1) = "1号" (序号为1 放入一个字符串为"1号")

num(2)="2号"   (序号为2 放入一个字符串为 “2号”)

简写 Dim arr(49)  As String  相对于 Dim arr(0 to 49) As String    (注意是从0开始的)

例子:

Option Explicit


Sub 第一个宏()
  Dim num(1 To 10) As String
  num(1) = "1号"
  num(2) = "2号"
  num(3) = "3号"
  Range("A1") = num(1)
  Range("A2") = num(2)
  Range("A3") = num(3)
End Sub

第3章 Excel VBA基础语法 【上】

以上是一维数组,就像排队买早餐

如果要在电影院确定你位置这时候需要二维数组,也就是第几排第几列

Dim 电影院 (1  to 10, 1 to 30)  As String      (表示电影院10行,每行30十个座位)

简写 Dim 电影院(9, 29) As String   (因为从0开始,所以减一)

三维数组类似: 空间坐标, x,y,z轴   

Dim 坐标  (1 to 10, 1 to 20, 1 to 2) As String  (可以认为是x轴范围1到10, y轴范围为1到20, z轴坐标1到2所组成所有点)

当然还有四维数组、五维数组等等。一般用的最多的只有一、二数组。

声明动态数组

语法: Dim 数组名称 ()                      (既然动态,表示刚开始时候不知道到底装多少元素,所以括号里什么也没有写,只知道是数组数据类型)

如果知道确定大小之后可以采用 ReDim (Re 在英语中就是再一次意思) 关键词进行定义大小

代码:

Option Explicit

Sub 统计单元格()
    Dim arr() As String
    Dim n As Long
    '统计A列有多少个非空单元格
    n = Application.WorksheetFunction.CountA(Range("A:A"))
    MsgBox ("A列所有单元格的数量:" & n)
    '重新定义数组大小
    ReDim arr(1 To n) As String
    
End Sub

效果:

第3章 Excel VBA基础语法 【上】


其他常用的创建数组的方式

方法一: 使用Array函数创建数组

语法:Array(元素1,元素2)      (注意括号和逗号都是英文,记住一点就是设计涉及软件都是英文的状态的符号,这是也是刚开始最容易犯的错误,怎么也找不到错误的位置)

Option Explicit

Sub ArrayTest()
   
   Dim arr As Variant
   
   '将1到10十个自然数赋给数组arr
   arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
   MsgBox "arr数组的第二个元素为(注意编号从0开始):" & arr(1)
    
End Sub

第3章 Excel VBA基础语法 【上】

方法二: 使用Split 函数创建数组  (Split:就是分割意思)

语法: Split("字符串", "以字符作为分割线")


Option Explicit

Sub SplitTest()
   
   Dim arr As Variant
   
   '利用split 生成数组
   arr = Split("坚持不懈,直到成功", ",")
   MsgBox "arr数组的第二个元素为(注意编号从0开始):" & arr(1)
    
End Sub

第3章 Excel VBA基础语法 【上】

方法三: 通过Range对象直接创建数组 (Range是VBA用得最多,它代表单元格范围,可以单个,也可以是多个)

Option Explicit

Sub RngArrTest()
   Dim arr As Variant    '定义变量
   
   arr = Range("A3:C11").Value  '首先将单元A3到C11存到变量arr中
   
   Range("A13:C17").Value = arr '然后将新的值写入单元格中
   
    
End Sub
第3章 Excel VBA基础语法 【上】

UBound和LBound函数 (计算索引值)

用到数组最关心的数组什么时候数组最后一个元素,所有这个用这个函数解决你疑虑

语法: UBound(arr)  (upper取第一个字母,表示大,也就是数组最后一个元素的序号是多少)

LBound(arr)  (Lower 取第一个字母,表示小, 也就是数组第一个元素的序号是多少)

那么数组中有多少个元素呢?  

UBound(arr) - LBound(arr) + 1

Option Explicit

Sub RngArrTest()
   Dim arr(10 To 50)  '定义数组,从10到50
   MsgBox "数组的最大索引号是: " & UBound(arr) & Chr(13) _
    & "数组的最小索引号是:" & LBound(arr) & Chr(13) _
    & "数组的元素个数是:" & UBound(arr) - LBound(arr) + 1
   
    
End Sub

第3章 Excel VBA基础语法 【上】


对于多维数组求索引号

Option Explicit

Sub RngArrTest()
   Dim arr(1 To 10, 1 To 100)  '定义二维数组
  
   MsgBox "第一维的最大索引号是:" & UBound(arr, 1) & Chr(13) _
    & "第二维的最小索引号是:" & LBound(arr, 2)
    
End Sub
第3章 Excel VBA基础语法 【上】

Join 函数,(这个函数和Split函数刚好相反,它将字符串连成一个字符串 )

语法: Join (数组 , "连接符")

Option Explicit

Sub JoinTest()
   Dim arr As Variant, txt As String
   
   arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
   
   txt = Join(arr, "-")
   
   MsgBox txt
    
End Sub


第3章 Excel VBA基础语法 【上】

将数组写入单元格区域

批量写入数据,利用转置(也就是行变成列,列变成行)

Option Explicit

Sub ArrToRng1()
   Dim arr As Variant
   
   arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
   
   '将数组批量写入单元格
   
   Range("A1:A9").Value = Application.WorksheetFunction.Transpose(arr)
   
   Range("B1:B9").Value = arr
   
End Sub

第3章 Excel VBA基础语法 【上】


东西太多了,见下一节