1 基础概念理解不透导致的问题1:语句不完整问题
1.1 语句不完整导致的报错
- 新手比如我在VBE里写了点东西,很多时候报错,是因为语句不完整导致的问题
- 比如写下面这些语句,点运行VBE会报错,为什么?
- Range("a1:a8")
- a
- 1+2
1.2 只有这样写才不报错,因为这样的一行都是完整的“一行语句”
- arr1= Range("a1:a8")
- Debug.print Range("a1:a8")才是完整的
1.3 为什么呢?因为对 变量,表达式,语句,语句块等概念傻傻没分清楚
- 变量,常量。比如a, 比如 range("a1:a8")
- 表达式: 比如 1+3
- 语句,一行代码的最小单位,一行代码至少得是一个语句。比如 a=1+99
- 语句块 ,多个语句
1.4 debug.print语句这种呢?这是一个操作,也是完整的语句
- debug.print
- debug.print ""
- debug.print "hello"
- DEBUG算啥?对象?模块?类? 还是特殊的
2 基础概念不牢固辨析2: VBA的基本数据类型没搞清楚
2.1 有时候为什么敲入代码,但输出的内容却不是你想要的?
比如如下
Sub test2()
Debug.Print "第1行打印="; a
Debug.Print "第2行打印="; "a"
Debug.Print "第3行打印="; 1 + 2
Debug.Print "第4行打印="; a = 3
End Sub
2.2 问题在于对VBA的基本数据类型没理解
2.2.1 基础数据类型,自身存储格式不同的数据存储类型
- 常量
- 字符串 "a" "1"
- 数字 1
- isnumeric isnumeric(1)=true isnumeric("1")=true
2.2.2 位置/存储空间/ 名字/代称------名字代表是指代的内容(指向存储的地方)
- 变量名代表变量,数组名就代表数组
- 函数名指向函数,没毛病
- 变量 a :动态变量包罗万象?可以代表不同类型的变量,默认初值不同
- array与array名
- dict 与 dictionary 名
- sub 与sub名
- function 与 function 名
- object 与 object 名
2.2.3 指代型数据类型的声明
- 必须事先声明的
- 数组,obejct等等
- 事先可先不声明的
- 变量可以不事先定义,也可以不赋初值
- 变量时不需要加引号的
- =SUM(INDIRECT(A1&"!B:B")) 相当于 sum(sheet1!b:b)
2.2.4 对比其他语言的 数据类型
- js 里 变量名 $a 字符串a
- VBA 变量名 a 字符串 "a" 数组array1=array() 函数 func1()
- python 变量名 a 字符串 "a" 数组 list=[] 函数 func1()
3 所谓数据结构,我的理解
- 我感觉比如 array dict 都是大神自己的自定义函数,加了一堆好用的方法和属性
- 所以,也就意味着某种语言和某种语言上的数据结构也是有局限性的,因为是人设计的嘛,肯定根据他当时的思路和遇到的问题是有关系的,很难普适所有情况吧。当然大神是很多的,这些语言和数据结构都很屌。
- 然后就变成了通用的标准了
- 你牛逼你也可以啊,哈哈
4 关于各种返回值
4.1 一般无返回值的,默认都返回 "" false 0
各种无返回值的 变量,表达式等,默认返回都为false ""
4.2 返回值确定为string类型的函数
- inputbox() 返回的一般都是字符串string类型 , 使用前记得要处理
- split() 返回的也是字符串,即使是数字,也是 "5" 这样的
4.3 理解概念,比如 string 字符串概念
- 不要记死的概念,比如变量和字符串
- 实际上要知道代码里 a=b1, a 这种都是变量,返回值为false ""
- 而 "a" 才是string
5 先弄清VBA的参数传递方法,然后才能明白函数参数写法
5.1 参数类型
- 必选参数
- 可选参数
5.2 传递方式
- 按位置传递参数,是有序的
- 按名称传递参数,不要求顺序,只要求 参数名正确
- 如果是混合传递,那么按名称传递的参数只能放在后面
5.3 比如最后1个参数不能是 , 省略,但是前面的参数可以省略
- arr4 = Application.Index(arr1, 3, 0)
- arr5 = Application.Index(arr1, 3)
- arr5 = Application.Index(arr1, 3,) 错误写法
- resize(3,2)
- resize(3)
- resize(3,) 错误写法
5.4 参数写法举例
Sub maomi3()
Debug.Print VBA.DateSerial(2019, 12, 31)
Debug.Print VBA.TimeSerial(9, 15, 0)
Debug.Print
Debug.Print VBA.DateSerial(Year:=2019, Month:=12, Day:=31)
Debug.Print VBA.TimeSerial(Hour:=9, Minute:=15, Second:=0)
Debug.Print
'Debug.Print VBA.DateSerial() Year:=2019, Month:=12, Day:=31
'Debug.Print VBA.TimeSerial() Hour:=9, Minute:=15, Second:=0
'Debug.Print
End Sub
6 需要搞清楚,变量的生效范围------否则不能理解变量什么时候需要独立,什么时候可以用一样的
6.1 变量的生效范围
- 一段代码里,特别注意变量要独立
- 新手喜欢一个变量,重复使用,要知道前面的代码极可能改变了变量的现在值。
- 理解
- 跨模块级变量 public
- 模块级变量 private dim
- 过程级变量 dim static
6.2 什么时候变量名尽量要独立?
- 因为过程和过程之间,变量一般不互相影响,所以除非是模块级变量,不同过程内,函数内的变量完全没必要独立
- 过程内,函数内的变量,尽量独立,否则会互相影响的可能性很大。除非不断的重置,也会很复杂把
7 有些函数,比如 工作表函数,需要把 查找单元格 加""
- range("a1:a8")
- [a1:a8]
- application.match("1", , 0)
更多推荐
【原创】VBA学习笔记(316)VBA编程基础知识扫盲,只适合纯自学新手看
发布评论