Board logo

标题: [问题求助] 关于vbs的循环结构和数据类型的问题 [打印本页]

作者: sun_di    时间: 2012-11-6 09:33     标题: 关于vbs的循环结构和数据类型的问题

大家好,我刚刚接触VBS。我看了一下这个网站发的视频,我发现里面介绍的循环结构都有一个特点,四种结构都有“起始”、“终止”,然后把循环的内容夹在中间,对吧?这使得循环的内容只能固定在“起始”和“终止”之间,似乎没有“DOS批处理”中的“goto”命令简单、容易理解。嗯,比如说这段批处理:
  1. @echo off
  2. :1
  3. cls
  4. Set /p pf= 请输入X的值
  5. set x=%pf%
  6. if %x% geq 899778 (
  7. goto 3
  8. )
  9. if %x% geq 1 (
  10. goto 2
  11. )
  12. :3
  13. echo 输入值非法,请重新输入
  14. pause
  15. goto 1
  16. :2
  17. set y=0
  18. set /a y=%x%+1
  19. set /a y=%x%*%y%
  20. set /a y=%y%/2
  21. echo x!=%y%
  22. pause
  23. goto 1
复制代码
用vbs大概就是这样了:
  1. dim i
  2. i = inputbox("请输入X的值")
  3. if i >= 1 then
  4. i = 0.5*i*(i+1) : msgbox "X!=" & i
  5. else
  6. msgbox "X的值必须大于等于0"
  7. end if
复制代码
可是我不知道msgbox "X的值必须大于等于0"之后该怎么回到i = inputbox("请输入X的值")
还有这条 = inputbox("请输入X的值"),如果输入的是非数字字符,会出现数据类型错误:

我不想出现这个东西,我想让它发现输入的是非数字字符的时候跳转到我的某一段代码中去
麻烦大家帮我看看
作者: wc726842270    时间: 2012-11-6 09:56

IsNumeric(expression) '判断是否是数字
i=0+i '数值转化
跳转不了解,不过好像只是错误才能GOTO
作者: sun_di    时间: 2012-11-6 11:04

额,我去查了IsNumeric(expression),看不太懂....
作者: Demon    时间: 2012-11-6 11:54

vbs没有goto
作者: apang    时间: 2012-11-7 09:11

  1. dim i
  2. do
  3.    i = inputbox("请输入X的值")
  4.    if IsNumeric(i) then
  5.       if i >= 1 then
  6.          i = 0.5*i*(i+1)
  7.          msgbox "X!=" & i
  8.          exit do
  9.       elseif i = "" then exit do
  10.       else
  11.          msgbox "须大于等于1"
  12.       end if
  13.    elseif i = "" then msgbox "不能为空值"
  14.    else
  15.       msgbox "不能为非数字"
  16.    end if
  17. loop
复制代码

作者: sun_di    时间: 2012-11-7 19:20

回复 5# apang


    嗯,是这个效果,你的书写习惯跟我不同,差点没看懂,呵呵。
你是用“do......loop",不过,你这个方法,如果篇幅很长,或者中间夹有不循环的代码,就麻烦了吧?
作者: apang    时间: 2012-11-7 22:08

回复 6# sun_di


    你的习惯是什么样的,说来听听。

我是新手,沿用了一些BAT的写法,不是什么好习惯。我很少用goto,几乎忘了goto是何物,呵呵。。。

如果Do...Loop循环体太长,你可以想办法让它变短(比如:Call过程调用)
作者: Demon    时间: 2012-11-7 23:47

本帖最后由 Demon 于 2012-11-7 23:54 编辑
apang 发表于 2012-11-7 09:11


都IsNumeric(i)了还会i = ""?

建议把工作代码放到循环之外。
作者: apang    时间: 2012-11-7 23:59

回复 8# Demon


    这个我也不知道呃,我测试是这样:
输入框为空,按"确定"时,IsNumeric(i) = false,i = ""
输入框为空,按"取消"或红叉时,IsNumeric(i) = True,i = ""
作者: Demon    时间: 2012-11-8 00:15

回复  Demon


    这个我也不知道呃,我测试是这样:
输入框为空,按"确定"时,IsNumeric(i) = false ...
apang 发表于 2012-11-7 23:59


VBS中InputBox函数的返回值

按"取消"或红叉时返回值是Empty,IsNumeric时Empty转成0,所以True
作者: wc726842270    时间: 2012-11-8 02:39

建议把工作代码放到循环之外。
Demon 发表于 2012-11-7 23:47



    呵呵,很是同意
作者: czjt1234    时间: 2012-11-8 11:13

初学者一般认为goto比较易懂

但大型程序设计,goto会让阅读者摸不着头脑,无法明确掌握程序结构

这是世界诸多大型软件公司所公认的,你不必质疑那么多专家的看法
作者: caspar    时间: 2012-11-23 23:18

本帖最后由 caspar 于 2012-11-24 06:11 编辑

改成
  1.  IF Not isEmpty(i) and IsNumeric(i)  Then
复制代码
就行 一般inputbox都要這樣幹…

另外…除了批處理bat或cmd 要寫其它程序 最好放棄goto 是個很不好的習慣
最好是if...then… 裏頭調用sub或者function
程序按功能分塊才容易讀
但也別太多…可讀性 執行效率 和 分塊多少 可不是個正比關系…




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2