先实现一个功能,就是判断A1中的数字是否小于9,小于9的话,就加1,直到不小于9停止:
VBA代码:
Sub testDoWhile()
Sheets("sheet1").Select
Cells.ClearContents
Do While Range("a1").Value < 9
Range("a1").Value = Range("a1").Value + 1
Loop
End Sub
JS代码:
function testDoWhile(){
Sheets.Item("Sheet1").Activate();
Cells.ClearContents();
Range("A1").Value2=0;
while (Range("A1").Value2 < 9){
Range("A1").Value2=Range("A1").Value2+1;
}
两者的区别,暂时几点(暂时这些):
1.写法的区别:
- VBA来自于VB,所以声明过程(指sub)的时候是sub,js的函数声明的特点是function和{};
- 声明方式js可以直接赋值,JS比较要用==,while语句写法区别等;
- JS语句结束后面可以加分号或换行(详细参考),vba语句结束后面不用加符号,换行表示结束;
- JS代码太长可换行书写,(return如何有结果返回,不可把结果换行),VBA代码太长在行末写下划线_表示代码换行写(参考);
- JS用//注释,vba用’注释等;
- 转义字符的区别,JS使用\,vba用“”表示“(VB系列语言有自己的规则参考,ACSII表和常数,不同控件效果)。
2.单元格取值的方式区别:vba和js基本一致,但是value属性上,vba可以value和value2,js这边只能是value2;value和value2的区别参考;
3.工作表的激活方式: js只能使用Activate()来激活带括号注意大小写(参考WPS官方文档,使用查找功能只找到这一个方法),vba可以是select或者activate(大小写自动更正无需带括号,这个括号是语法区别); sheets(“子对象名字”),js是sheets.item(“子对象名字”);
4.对于空单元格的处理:vba可以认为空单元是0(实际获取的是empty,可以等于0,见下文分析),js认为是undefined,所以,js编码里面加一句 Range(“A1”).Value2=0; 保证后续程序正确运行;对比如下:
Sub testEmpty()
'声明后赋值空
Dim a
a = ""
MsgBox (TypeName(a)) 'string
MsgBox (a = 0) 'false
MsgBox (a = "") 'true
'MsgBox (a * 1 = 0) '类型不匹配
'声明后赋值是字符
Dim b
b = ","
MsgBox (TypeName(b)) 'string
MsgBox (b = ",") 'true
'MsgBox (b * 1 = 0) '类型不匹配
'声明后不赋值
Dim c
MsgBox (TypeName(c)) 'empty
MsgBox (c = 0) 'true
MsgBox (c = "") 'true
MsgBox (c * 1 = 0) 'true
'B1单元格输入="",对应a的情况
MsgBox (TypeName(Range("b1").Value2)) 'string
MsgBox (Range("b1").Value2 = 0) 'false
MsgBox (Range("b1").Value2 = "") 'true
'MsgBox (Range("b1").Value2 * 1=0)'类型不匹配
'B2单元格输入"",对应b的情况
MsgBox (TypeName(Range("b2").Value2)) 'string
MsgBox (Range("b2").Value2 = 0) 'false
MsgBox (Range("b2").Value2 = "") 'false
MsgBox (Range("b2").Value2 = """""") 'true,1个引号这里用4个,2个引号这里用6个。
'MsgBox (Range("b2").Value2 * 1 = 0) '类型不匹配。
'B3单元格为空,对应c的情况
MsgBox (TypeName(Range("b3").Value2)) 'empty
MsgBox (Range("b3").Value2 = 0) 'true
MsgBox (Range("b3").Value2 = "") 'true
MsgBox (Range("b3").Value2 * 1 = 0) 'true
End Sub
JS代码:
function test2()
//测试js对于不同“空”内容的处理
{
//设变量a=""
var a=""
MsgBox (typeof a) //string
MsgBox (a == 0) //true
MsgBox (a == "") //true
MsgBox (a * 1==0)//true
var b=","
MsgBox (typeof b) //string
MsgBox (b == 0) //false
MsgBox (b == ",") //true
MsgBox (b * 1==0)//fasle
var c;
MsgBox (typeof c) //undefined
MsgBox (c == 0) //false
MsgBox (c == "") //false
MsgBox (c * 1==0)//false
//B1单元格输入="",当做空等同于变量=""
MsgBox (typeof Range("b1").Value2) //string
MsgBox (Range("b1").Value2 == 0) //true
MsgBox (Range("b1").Value2 == "") //true
MsgBox (Range("b1").Value2 * 1==0)//true
MsgBox (Range("b1").Value2 * 1==a)//true
//B2单元格输入"",总体当做字符
MsgBox (typeof Range("b2").Value2) //string
MsgBox (Range("b2").Value2 == 0) //false
MsgBox (Range("b2").Value2 == "") //false
MsgBox (Range("b2").Value2 == "\"\"") //true,js可以使用转义符\。
MsgBox (Range("b3").Value2*1 == 0) //false
//B3单元格为空,总体等同于undefined
MsgBox (typeof Range("b3").Value2) //undefined
MsgBox (Range("b3").Value2 == 0) //false
MsgBox (Range("b3").Value2 == "") //false
MsgBox (Range("b3").Value2 * 1 == 0) //false
MsgBox (Range("b3").Value2 == c)//true
}
从上面可以知道:vba对于empty可以等于””空字符和0,可以数学运算为0.JS对于””空字符串可以等于0,可以数学运算。同时,在表格单元格内写函数测试,结果和vba测试一致(使用WPS测试),参见下面附件。另外,html中,获取input空值是“”空字符串。
以上测试环境如下:
1.Win10 专业版19042.662
2.WPS 11.1.0.11115-release+VBA6.5+WPS宏编辑器2.0