1.

这两天后台收到的问题相对比较多的是……

SQL=SQL&"WHERE……" 为什么SQL可以等于SQL?

和这个问题相似、更常见的语句是:

K=K+1

为什么K可以等于K+1?

举个实例,比如以下VBA语句,计算A1:A10单元格范围的值等于“看见星光”的个数。

Sub MyCount()

Dim Rng As Range, K&

For Each Rng In [a1:a10]

If Rng.Value = "看见" Then K = K + 1

Next

MsgBox "禀告陛下,一共抓到:" & K & "个看见。"

End Sub

提问的朋友可能不理解,为什么K=K+1的结果,不是逻辑值FALSE或者其他,而是一个不断累加的值?这明显违背了咱们小学时就掌握了的数学常理嘛。

论证给您看……

假设K=1

那么K=K+1等于1=1+1

1=1+1计算结果肯定是FALSE

因此K=K+1结果也应为FALSE……

但实际上K=K+1的结果并不是FALSE,而是在K原值的基础上,不断累加1的数值。

所以K=K+1到底是怎么回事儿?

……

我们今天就来详细说下这事,或者说VBA编程中的变量以及变量的赋值问题。

2.

首先,明确说明一点,K=K+1并不等同于1=1+1。

这是因为,K和1并不相等,他俩不是一类人;K是变量,1是常量。

什么是变量?什么是常量?

简而言之,变量是在代码运行过程中可能改变值的量,也就是会变的量,而常量则不会发生改变。

K可能是1,可能是2,它会发生改变;但1,永远都是1,不会成为3,它不忘初心,永恒不变……。

……

重点说下变量。

变量拥有作用域,需要声明和赋值。

作用域我们先不谈,今天的问题用不上这部分知识。

所谓声明变量,也就是声明变量的类型,比如dim k as long,则是声明k是长整型的数值,如果变量未声明,则默认声明为变体(Variant)型。

除了声明,变量需要赋值,只声明未赋值的变量通常没有意义,好比理藩院的声遣。

变量的赋值有固定的格式。

……

如果是对非对象(Object)型变量赋值,也就是数据型变量,语句为:

Let 变量名称=数据

使用等号的方式,将等号右边的数据或表达式的计算结果,储存到左边的变量名。

其中Let可以省略,因此通常写成变量名称=数据,比如:

K=1

……

如果是对象型变量呢?语句为:

Set 变量名称=对象

比如:Set Rng=[A1:A10]

将单元格区域A1:A10储存到变量Rng中

其中关键字Set不可以省略(PS:这是新手常犯错的小地方)。

……

……

3.

因此K=K+1是格虾米意思呢?

将等号右边的数据赋值给等号左边的变量名,也就是先计算等号右边的表达式,然后将表达式的计算结果赋值给等号左边的变量。

因此,K作为长整型数据,未赋值时默认为0,则……

K=K+1等于K=0+1

则K=1

……

而当K=1时……

K=K+1等于K=1+1

则K=2

……

当K=2时……

……

以此类推

……

4.

又及……

有朋友问:

为什么K=K+1不能写成K+1=K?

凡事总要问个为什么,毕竟咱不是随便的人呐。

因为……

K=K+1是在给变量赋值,它是一个赋值语句。

K+1=K则是一个判断表达式,它在判断K+1和K是否相等,毕竟等号左边的K+1,包含变量,但整体已不是变量。

同理,1=1+1,由于1是常量,不是变量,因此它也是一个判断表达式,它在判断1和1+1是否相等。

……

再又及……

有朋友问:

为什么K=K+1,先计算等号右边的表达式K+1,而不是先计算K=K?

凡事总要问个为什么,毕竟咱真不是随便的人呐。

容老夫抹下眼泪先……

前面讲过,变量赋值的过程,是将等号右边的数据、对象或表达式的计算结果,赋值给等号左边的变量名;因此自然要先算等号右边的表达式K+1啊。

即便是从数学的角度讲,+-*/&=这些运算符里,等号的优先权都是最末的,因此也要先算加法,对8?……

……

……

握爪,致安,记得关注俺们,下次再见。