找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 31146|回复: 12

[问题求助] 关于vbs的循环结构和数据类型的问题

[复制链接]
发表于 2012-11-6 09:33:52 | 显示全部楼层 |阅读模式
大家好,我刚刚接触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的值"),如果输入的是非数字字符,会出现数据类型错误:

我不想出现这个东西,我想让它发现输入的是非数字字符的时候跳转到我的某一段代码中去
麻烦大家帮我看看
发表于 2012-11-6 09:56:07 | 显示全部楼层
IsNumeric(expression) '判断是否是数字
i=0+i '数值转化
跳转不了解,不过好像只是错误才能GOTO
 楼主| 发表于 2012-11-6 11:04:12 | 显示全部楼层
额,我去查了IsNumeric(expression),看不太懂....
发表于 2012-11-6 11:54:37 | 显示全部楼层
vbs没有goto
发表于 2012-11-7 09:11:00 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2012-11-7 19:20:51 | 显示全部楼层
回复 5# apang


    嗯,是这个效果,你的书写习惯跟我不同,差点没看懂,呵呵。
你是用“do......loop",不过,你这个方法,如果篇幅很长,或者中间夹有不循环的代码,就麻烦了吧?
发表于 2012-11-7 22:08:53 | 显示全部楼层
回复 6# sun_di


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

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

如果Do...Loop循环体太长,你可以想办法让它变短(比如:Call过程调用)
发表于 2012-11-7 23:47:35 | 显示全部楼层
本帖最后由 Demon 于 2012-11-7 23:54 编辑
apang 发表于 2012-11-7 09:11


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

建议把工作代码放到循环之外。
发表于 2012-11-7 23:59:28 | 显示全部楼层
回复 8# Demon


    这个我也不知道呃,我测试是这样:
输入框为空,按"确定"时,IsNumeric(i) = false,i = ""
输入框为空,按"取消"或红叉时,IsNumeric(i) = True,i = ""
发表于 2012-11-8 00:15:46 | 显示全部楼层
回复  Demon


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


VBS中InputBox函数的返回值

按"取消"或红叉时返回值是Empty,IsNumeric时Empty转成0,所以True

评分

参与人数 1技术 +1 收起 理由
apang + 1 学习了,谢谢!

查看全部评分

发表于 2012-11-8 02:39:33 | 显示全部楼层
建议把工作代码放到循环之外。
Demon 发表于 2012-11-7 23:47



    呵呵,很是同意
发表于 2012-11-8 11:13:12 | 显示全部楼层
初学者一般认为goto比较易懂

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

这是世界诸多大型软件公司所公认的,你不必质疑那么多专家的看法
发表于 2012-11-23 23:18:59 | 显示全部楼层
本帖最后由 caspar 于 2012-11-24 06:11 编辑

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

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

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 02:28 , Processed in 0.018927 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表