博文

目前显示的是 十二月, 2021的博文

VBA学习笔记4:再说数组赋值

之前以为自己把数据的概念搞清楚了,在工作中多次涉及到相关知识点,但还是有一次出了问题。在给数组变量赋值时,发现直接引用单元格的方式行不通了,提示“类型不匹配”。我用了如下语句:  Dim sht() sht = Worksheets(1).Range("B4:B6") 在 《VBA学习笔记2:数组的使用》 中,我曾总结: 直接引用区域也是创建数组的办法,因为range的默认方法是value,所以直接使用arr=range("A1:B6")这样的语句就能为数组赋值了。 但是用 sht = Worksheets(1).Range("B4:B6") 却出现错误。使用Debug检查发现一些问题。 首先用 Debug.Print TypeName(Worksheets(1).Range("B4:B6")) 检查了数据类型,返回“range”,而dim sht()时,sht的默认属性是variant,是否是这个原因造成无法赋值呢? 但是当我把Worksheets(1)去掉时,这个语句居然奏效了,虽然 Debug.Print TypeName(Range("B4:B6")) 出来的还是“range”类型,但sht = Range("B4:B6")的赋值确实是有效的。 那如果我要赋值的数据不是当前工作表呢?试着把Dim sht()去掉,也就是说赋值前不声明数组变量, sht = Worksheets(1).Range("B4:B6") 居然也奏效了, Debug.Print TypeName(Worksheets(1).Range("B4:B6")) 依然返回“range“。 再试一下,如果直接声明Dim sht,或Dim sht as variant,则后面的语句无论加不加worksheets都能生效。 这让人感觉有点混乱,稍微一个不小心就会出错。在微软官方文档并没有找到相关说明。 总结了一下引用区域对数组赋值的两个规则: 1.range对象可以为未声明变量或variant变量(Dim x)赋值,其值会转换为variant类型。 2.声明数组变量后再赋值,只适合当前工作表,不能引用range的父对象。

VBA学习笔记3:Inputbox的函数与方法

 问题来源:一个项目需要使用inputbox来获取用户输入值,如果用户点击了“取消”或者输入了未在备选里的值将自动退出程序。获取输入值我使用了 num = inputbox(optfm) 语句,接下来使用 If num = false Then Exit Sub 语句来退出。测试中却发现点击了“取消”程序并未退出,而是继续执行了后面的语句。搜索后发现,原来inputbox语句分“函数”和“方法”两种,其返回值不同,所以处理方式也不相同。 Inputbox函数,是VBA的内置函数,无论是在Excel、Word,任何使用VB脚本语言的程序都能使用,而Inputbox方法,完整写法是Application.Inputbox,是Excel这个App特有的,其语法与Inputbox函数稍有不同,是为Excel量身定做的。使用中,直接输入Inputbox就是函数的用法,使用“方法”的话就必须在前面加上Application.。 Inputbox函数和方法的主要区别 1.提示文字的限制不同。两个语句第一个参数均是提示文本,但是Inputbox函数的提示文本最大可以是1024个字符,而Inputbox方法最大是255个字符。两者均可在提示文本中使用Chr(10)换行符。 2.Inputbox方法多了一个Type参数,这个参数可以指定返回数据的类型,如果省略则默认返回文本。此参数在Excel很有用,如果使用参数8(range类型),则可以直接用鼠标选择对应的单元格区域。 3.此点最为重要,Inputbox函数如果 用户选择"取消  ",  函数将返回一个零长度字符串 ("");而Inputbox方法用户选择“取消”,会直接 返回  False。 引用微软的官方总结: InputBox  方法与  InputBox  函数的区别在于,前者可以对用户输入进行选择性验证,并能与 Excel 对象、错误值和公式结合使用。 回到开头的问题,可以得出结论,如果使用了 num = inputbox(optfm) 语句,则后面判断用户是否“取消”要使用 if num="" Then Exit Sub ;如果使用 num = Application.Inputbox(optfm) ,后面的判断应使用 if num=False Then Exi