harrystrumen harrystrumen
咸//yu:不务正业的vba
关注数: 10 粉丝数: 20 发帖数: 92 关注贴吧数: 22
经验分享3 for/if配合使用 分享2中,我们确立了vba的使用价值。在分享1中笔者说过:会for和if就能写东西了。今天兑现这两句话。 先写开头: sub t(byval a as string)。这个就是告诉vba写的这段宏叫t,用的时候还要传个参数字符串a作为参数。当然,也可以不传参,就是sub t()。 然后写中间的宏内容: sheet1.range("a1").value=a。sheet1笔者在分享1中说过,是引用表的一种方法,如果知道表名用sheets("表名")也是可以的或者sheets(codenumber)。range也是单元格的一种引用方法,用cells也没有问题。然后是a,就是传进来的参数。 最后一定要写end sub. 完整的就是 sub t(byval a as string) sheet1.range("a1").value=a end sub 因为这段宏含参数,因此不能从这里启动,一般开始启动的宏都不能含参数。再写一个宏去调用t。 sub mainsub() sheet1.t "hello,word!" end sub 一定要注意,把代码写在sheet1下面 有了这些基础,我们就可以往里面加for了。这里我们汇总a1:a10的数据和。 dim i as integer sum0=0 for i=1 to 10 sum0=sum0+sheet1.range("a"&i).value next 首先先声明i作为整数变量,作为列的位置。i无需初始化,for会帮你干。但sum0未声明,vb的变量无需预先声明也能用。大部分人还是坚持声明变量的,因为便于管理。忘记了开头的声明,在执行几十行后的时候,容易以为这变量没用过,一用就把这个变量改了。 进入for,无论i是多少,无论是啥类型变量,一律改成1,所以无需初始化。 最后next,会自动给i加1,不用i=i+1手动加。 然后本片文章最精髓的地方,就是if,用于筛选想加的数据。说他精髓倒不是因为难度高,而是在实践中运用很灵活。 比如 for i=1 to 10 if i mod 2 =0 then sum0=sum0+sheet1.range("a"&i).value end if next i mod 2是对i取2的余数,也就是1到10行,只加偶数列。当然加奇数列就是if i mod 2 = 1 then。if和then中间的表达式的求解结果必须是布尔值,也就是true或false。对于i mod 2来说,他的结果是整数,但是对于if语句来说,0就是false的意思,非0就是true的意思。 求和大于0的数就是 if sheet1.range("a"&i).value>0 then。如果b列是部门、姓名等数据,还可以if sheet1.range("b"&i).value ="张三" then或者if sheet1.range("b"&i).value ="销售部" then等等。for+if可以解决可以自行解决遇到的大部分问题了,剩下的就是不断思考使用什么机制来去除不要的数据,或者提取加工想要的东西。
经验分享2-是pyhon还是vba 2021年底,python拿下tiobe第一名,就连c++和java的程序员都有点不好意思说自已是第一了。了,而b语言系的vb,vb.net和vba也难以争锋。那是不是说vba没用了,不该学呢?其实笔者希望答案是不该学。让python一统江湖多好,你学一个就够了,轻松省力也好维护。学多个语言就,就要记成倍的东西。如果有的任务还需要vba和python相互调用,那就更麻烦了,还涉及到相互之间通讯和调度问题。然而,事实就是二位各有优缺点,不能相互替代。对于python来说,易上手,简单,一个map和匿名函数能达到十几甚至几十行vba代码的效果,网络上有丰富的库,导入简单,函数丰富且经常更新,使得python在统计,人工智能,大数据领域大放异彩。但问题是你要操作的office,而office的原生语言是vba,在执行效率和兼容性上来说,vba是天花板。另外,并不是哪个使用者都愿意在电脑上装python,而且代码从一台电脑迁移到另一台电脑时,还涉及到import库的问题。封装成exe后,兼容性更是谁用谁知道。而excel基本上很少这种问题,一个电脑上正常的vba,一般在另一台问题不大。笔者经常在win7+office2010和win10+office2016之间切换,几乎没有问题。因此,这里的结论是二者是互补关系,相互取长补短一起服务于你的任务才是最好选择。 那么二者可以相互配合么,答案是可以。今天就展示一个案例,就是vba使用cmd命令行控制python。首先,先利用sys库,接受命令行参数,然后用print函数打印出来,证明python正常运行并返回接受的参数,保存代码待用。然后,打开excel让vba向python发送两个参数。一个是"I come from vba",另一个是"do some thing"。具体效果见吧里与本帖同名的视频。(貌似文字和视频不能一起发) 总的来说,一般情况下,不要放弃任何语言。你不可能弃js用python写网页,而.net的项目也不可能完全转向python,python也不能取代java的特性,python更不可能取代anroid和ios。从目前看,python只是在科学计算这个领域取代了其他语言,原因也是其他语言并不是为科学计算设计的,可能唯一受伤大点的就是mathlab。在可预见的未来,无论语言江湖如何延边,一门语言统一江湖只在梦中,谁也取代不了谁。
一点vba经验分享1 首先,啥是编程。无论是vba,还是vs上的c#,vb.net,还是java,还有红的发紫的python,在笔者看来本质都是一样的,就是一串有序的预定义动作。也就是,微软已经把操作office各项套件的命令定义了出来,比如单元格的内容是cell.value,表名是sheet.name,想打开工作簿用workbooks.open,这是预定义好的,往上码直接用就是了。因此,学习vba的实质就是学这些已经设计好,定义好的东西改怎么用,怎么在满足预定义动作或函数的前提下满足自己的要求。例如你要打开一个工作簿,但是open这个动作要求路径,给一个空字符串肯定报错。因此在open前,你必须去sheet的a1单元格去取这个路径。因此就有path=sheet1.range("a1").value 然后再 workbooks.open(path)。如果path并不一定在a1,你还要想办法用for和if组合或是其他方法去找。这就是编程基本思路。这里open,workbooks ,range他们干啥,怎么干都是定义好的,你唯一的工作就是满足他们的参数需要。 第二,啥是vba?vb好理解,毕竟太经典了。a其实就是在vb基础上增加对office的动作或是属性的定义和操作。在vba语境下,一串有序动作组合就叫宏。宏里的预定义动作也是有结构的。比如open这个动作是归属于workbooks对象,而workbooks对象实际是workbook的集合,他被定义为所有已被打开的工作簿集合,因此用workbooks("文件名")可以找到对应的workbook对象。然后workbook又包含sheets对象,记录工作簿内所有工作表的集合sheets,其元素sheet又包含cells集合包含所有单元格。因此,完整的代码是workbooks("文件名").sheets("表名").cells(行号,列号).value。这就是excel vba的对象结构中的一小部分。对象包含啥属性,包含啥动作(术语叫方法),使用属性和方法需要啥参数是贯穿始终的。vba的本质就是向目标发出指令,要求目标执行。目标可以是excel,ppt,word这些office组件,也可以是音频播放器,flash,cmd,也可以是谷歌浏览器,也可以是复制黏贴删除的文件。只要了解了控制他们的方法,也就是预定义的动作都是可以的。 第三,如何学。笔者秉承实用主义,用的时候再学,没必要全学。也没必要深刻理解,能解决问题就好。但是,要解决复杂问题,就要去学习对象结构,学习参数和方法调用。比如上例,如果要打开的工作簿路径不在a1,你怎么着?那就要遍历sheet上的所有工作簿,问题复杂了。就要使用for和if组合,然后去学习。毕竟for和if录宏是录不到的。学会基础对象结构,for do....loop while循环语句.再学了if select分支语句,基本就能处理常规问题了。
1 下一页