
VBA_Excel
文章平均质量分 69
宋哥
哥一个学通信工程的,阴错阳差的搞起了软件,计算机知识基本来自于自学。总结记录工作中碰到的问题及解决办法是一个良好的习惯,过去我用笔,现在用键盘并分享到网上,让更多人看到,自己也方便查找。
博客的名字“驽马十驾,才定不舍。”取自荀子的“劝学篇”,记录并分享工作中的点点滴滴,积少成多,虽然不是什么人才,但只要孜孜不倦,也能做出一点成绩。
展开
-
【VBA研究】再论“找不到工程或库“ 解决方案
这种情况如何处理呢?其实也很简单:首先是将能去掉的去掉,只留下不能去掉的,然后将.xlsm文件再另存为.xls,关闭文件再重新打开,那些去不掉的“丢失”就没有了。我用Excel-VBA做的工具(宏)经常在WPS环境下使用,导致的结果就是有问题时,将工具发回来我调试的时候用不起来,总是报"找不到工程或库"错误。在VBA编辑环境点击“工具”-“引用”,就可以看到“丢失”什么库,一般情况下,将丢失库前面的勾选去掉问题就解决了。刚看到这个报错总是莫名其妙,其实这个问题以前碰到过,就是WPS使用环境造成的。原创 2022-09-15 17:32:06 · 11068 阅读 · 1 评论 -
【VBA研究】输出PDF文件合并时出错
在做一个打印通知单的工具时(这个工具已经做过很多个,技术基本一样),输出的多个PDF文件合并时出错,单个PDF文件打开没有问题。合并其他文件没有问题,那问题只能是这些单个PDF文件。不过,显然与输出语句无关,因为我是用老工具改的,这一块没动,唯一动的就是界面布局。我尝试看看问题出在哪儿,经过不断试验,在去掉最后一个单元格的引用后,问题不再出现。......原创 2022-08-26 16:33:13 · 1559 阅读 · 0 评论 -
【VBA研究】数组的定义和使用
作者:iamlaosong数组用起来很方便,尤其是利用循环可以大大简化代码量。用数组读取工作表内容,再进行各种处理,可以大大提高程序效率。在数组使用过程中不可避免的要碰到一些令人困惑的问题,下面就讨论一下与数组相关的问题。定义(声明)数组时是要明确数组上界的,如下面语句:Dim mm(31), ww(7, 2)上面两个数组,mm的上界就是31,ww是个二维数组,上界分别是7和2,那么下界呢?VBA默认将数组的第一个成员设置为0 (下标) ,因此,数字1代表数组中的第二个成员,而数字2则代表第三个,等等。因为原创 2022-06-07 15:58:04 · 16556 阅读 · 5 评论 -
【VBA研究】重复邮件号码筛重(文件间)
作者:iamlaosong最近业务部门提出一个需求,就是筛查市县分公司上报的邮件号码(比如破损邮件)是否已经报过?具体是什么邮件工具并不关心,只要实现邮件号码筛查就可以了。原创 2022-05-23 16:54:15 · 488 阅读 · 0 评论 -
【VBA研究】操作InternetExplorer控件取数据
作者:iamlaosong因业务需要需要从SF网站上查询快件轨迹。虽然可以一次查询多个快件,但每个快件数据要逐个复制下来,还是很麻烦的。查询是需要图片验证的,我没有什么办法绕过这个验证(也许有人有办法),只能手工完成。那么如何实现手工和自动的配合呢?原创 2022-04-12 14:21:13 · 2023 阅读 · 0 评论 -
【VBA研究】打印表单时指定打印机
作者:iamlaosong我用Excel做做了一个打印拣货单标签的工具,实际上是打印邮件标签兼做拣货单,由于仓库电脑需要连接多台打印机(不同标签用纸不同,换纸还不如换打印机),所以打印标签时,经常要改变默认打印机,一旦忘了修改,就会打印出一堆废纸来。那么,不改变默认打印机,能不能将标签打印到指定的打印机上面呢?答案是肯定的。原创 2022-02-28 11:17:46 · 9481 阅读 · 0 评论 -
【VBA研究】关于工作表单元格复制粘贴的语句
作者:iamlaosong做一个工作表拆分和合并的工具,必然会用到复制粘贴语句。最简单的就是普通的直接复制粘贴,但有时也需要用到选择性粘贴,特别是原数据格式比较复杂,希望新生成的数据简单一点,比如直接复制数值。有时候格式复杂的文档完全复制粘贴后,新生成的文件还会无法打开。原创 2022-01-13 10:26:51 · 6864 阅读 · 0 评论 -
【VBA研究】关于单元格颜色值的十六进制赋值
作者:iamlaosong1、单元格颜色的设置背景颜色用属性Interior,字体颜色用属性Font。颜色的值,可以用Colorindex,这种方法只有Excel规定的56中颜色,如下图所示:也可以用RGB()函数,这样就可以设置成任何颜色。RGB()函数函数实际是返回一个颜色值,因此,也可以直接赋值,只是这个值不直观而已。其实这个值就是RGB()函数的值,用十六进制表示就非常直观了,只是最低两位表示红色,最高两位表示蓝色,中间两位表示绿色,即:&HBBGGRR如红色(Col原创 2021-09-02 16:54:48 · 10180 阅读 · 2 评论 -
【VBA研究】64位系统下无法用ScriptControl控件解析JSon数据
作者:iamlaosong我原来一个查邮件轨迹的工具,最近有人反映说是无法使用,我自己试了下发现没有问题。看他们发来的截图,发现数据查询没有问题,只是对结果解析的时候,没有分离出相关的字段内容。研究了一下发现,我们的差别是使用环境不同,他们用的是64位win10,我用的是32位win7(很土吧),调试发现,ScriptControl控件在64位系统下,无法解析JSon数据。也就是说,32位系统下的代码,在64位系统下失效了。网上找了一下,发现有64位系统下使用ScriptControl控件的方法原创 2021-07-29 10:31:23 · 4673 阅读 · 5 评论 -
【VBA研究】用全局常量定义一些极限数值
作者:iamlaosong工作中会经常碰到一些极限常量,比如Excel最大行数,编程的时候不知道大小,而这个数值程序中会用到。这种情况下,直接使用具体数值,哪怕是比较大的数值也是不对的,因为这个值一旦不合适,改的地方就会很多。好的办法是定义一个常量,就可以方便今后这个值的变更。原创 2021-06-21 10:08:47 · 705 阅读 · 0 评论 -
【VBA研究】再论取EXCEL有效行列数方法
作者:iamlaosong我有一个工具,Excel2003格式,因处理数据超过65536条,所以让用户另存为xlsm格式,结果用不了,仔细检查发现问题出在取EXCEL有效行数语句上,该语句如下:MaxRow= [A65536].End(xlUp).Row原创 2021-06-16 11:11:27 · 2722 阅读 · 0 评论 -
【VBA研究】Excel连接Oracle的几点说明
作者:iamlaosong通过VBA连接Oracle数据库查询数据,一般有两种OleDB连接驱动方法,一种是用微软的驱动,另一种用Oracle驱动,Provider需要根据实际情况修改。这儿对我使用的环境做个记录。1、Microsoft公司提供的OleDB驱动MSDAORA,据说只支持32位系统,我在32位系统下使用没有问题,其连接字符串如下: connectionString="Provider=MSDAORA;Data Source=dataSource;User Id=userid;P...原创 2021-01-07 17:29:58 · 2590 阅读 · 0 评论 -
【VBA研究】Excel条码控件生成的Code-39码不能识别问题
作者:iamlaosong在做一个回执打印工具时,业务部门要求加上条码,以便将来录入查找。生成条码用的是Excel自带的控件,以前也用过,那次生成的是128码,这次希望和邮件条码一致,采用code-39码。如下图所示:条码是生成出来了,可是打印出来却无法扫描识别。到底是什么原因呢?上网查找也没找到答案,问题就搁置住了,只好先不打印条码用着,再想办法解决。反复思考这个问题,突然灵光一闪,记得以前没有控件生成条码时,好像两头要加上“*”号,于是,将要生成条码的邮件号码两边加上“*”号,再用这原创 2020-12-10 14:29:51 · 2932 阅读 · 0 评论 -
【VBA研究】利用程序错误检测对象是否存在
作者:iamlaosong编程时为了避免错误,对对象操作前往往会进行一些判断,有些判断VBA提供了相应的函数或者方法,有些则没有提供。比如工作表如果不存在,引用就会报错,所以没有办法判断。这儿我们有一个有意思的办法。就是先引用一下对象,如果对象存在,则不会发生错误,我们则对对象进行正常操作,反之亦然。例如:假定我们要增加一个某月月份命名的工作表,如果表已经存在,则不增加,看下面代码:原创 2020-12-03 17:12:13 · 2067 阅读 · 0 评论 -
【VBA研究】数据格式转换
作者:iamlaosong将一个系统的数据导出再导入到另一个系统,虽然都是Excel文件,但格式略有不同,所以需要进行转换。功能不复杂,直接引用都可以,但是还是比较麻烦,不如写个工具,进行转换。这样导入文件干干净净,比较好。唯一要注意的是信息中有身份证号码,在赋值到单元格中时,变成了科学格式或者后面几位都变成0,所以赋值前需要将单元格格式设成文本型(直接将导入模板文件中身份证列设成文本也可以),即: Cells(row1, 2).NumberFormat = "@" '号码单元...原创 2020-08-27 15:23:19 · 3580 阅读 · 0 评论 -
【VBA研究】如何用Base64 编解码方法实现简单的加解密
作者:iamlaosongBase64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码,将数据变成字符串实现文本传输。由于编码简单,所以很容易实现,代码也是现成的。利用这个编码规则可以实现简单的加解密。编解码方法见: VB实现Base64 编解码我用VBA做了个简单的系统,其中用到用户登录,自然要保存用户名和密码。密码存放在数据库中,不想明码保存,于是就想到用这个编码方法进...原创 2019-05-20 17:10:37 · 2892 阅读 · 0 评论 -
Excel VBA条件编译语句
作者:iamlaosong我的一个工具只能在32位环境下使用,因为64位环境下API声明略有不同。为了工具的兼容性,可以采用条件编译#If…Then…#Else语句。Sub ttt() #If VBA7 Then MsgBox "VBA7" #If Win64 Then MsgBox "win64" #Else MsgBox "win32" #End If #Else原创 2020-06-15 10:37:19 · 1634 阅读 · 0 评论 -
【VBA研究】工作表筛选合并工具
作者:iamlaosong业务部门需要将各市公司收寄邮件按指定的条件筛选出来,然后合并到一张工作表中。源数据文件有16个,合并到一个工作表中,筛选条件可以自由设置。为此做了一个筛选合并工具。1、指定一个文件名。如果这个文件存在,清空内容,如果不存在,创建一个。用这个文件来保存筛选合并后结果。2、指定一个文件夹。如果这个文件夹存在,则处理这个文件夹下面的文件;如果不存在,这选择一个文件夹...原创 2020-01-19 16:35:17 · 1139 阅读 · 0 评论 -
【VBA研究】数据透视表巧算赶发率(达标率)
作者:iamlaosong根据导出的收寄信息和轨迹信息,对照发车时限,判断邮件是否及时赶发。首先根据上述信息生成一张邮件列表,其中是否及时赶发用“0”和“1”两个数值表示,“1”表示及时赶发,然后再通过这张列表生成数据透视表,对是否及时赶发这个字段计算平均值,这个平均值就是及时赶发率,这个计算方法是不是比较巧妙?如下图:数据透视表刷新语句如下:Sheets("赶发率").Piv...原创 2020-01-16 09:55:41 · 771 阅读 · 0 评论 -
【VBA研究】计算时碰到单元格值是#N/A怎么处理
作者:iamlaosongVBA合并单元格的值(tmpstr = tmpstr & " " & Cells(i, j))如果碰到#N/A就会报错,提示类型不匹配,如下图所示:实际上,不仅仅是#N/A,其它的错误标识(如#VALUE!、#DIV/O!等等)也会报同样的错误。这些符号都是由公式产生的,如果公式得不到正确的结果,就会产生这些符号。哪怕是按值复制到新的工作表,...原创 2020-01-09 14:37:06 · 8039 阅读 · 0 评论 -
【VBA研究】关于XMLHTTP的Get和Post功能抓取数据
作者:iamlaosong我前一阵子用VBA做了两个工具,用XMLHTTP的Get功能和Post功能抓取网页数据,还用这个对象的Get功能通过HTTP接口获取数据,这儿总结一下:1、Get功能抓取网页数据,参数名称和值放在链接之中,方法如下:通过不同的变量值(sn和en)构造不同的链接,获取不同的数据。hp1 = "http://api.map.baidu.com/?qt=nav&a...原创 2019-11-18 09:59:08 · 4049 阅读 · 3 评论 -
【VBA研究】用XMLHTTP的Post功能抓取数据
作者:iamlaosong我前一阵子用VBA做了个工具,用XMLHTTP的Get功能抓取城市间距离。现在我想用用XMLHTTP的Post功能抓取邮件轨迹。抓取数据是用Get还是Post,取决于网站提交参数的方法。1、通过分析(用fiddler),邮件轨迹查询网站是用post提交参数的。如下图:上图中“Entity”内容用于设置包头,点击“TextView”可以看到传输的参数内容,邮...原创 2019-11-05 14:53:29 · 6598 阅读 · 5 评论 -
【VBA研究】VBA提供的文件操作
作者:iamlaosong最近一个学习VBA的同事问我如何用VBA修改文件名,我给他说了一下方法,顺便也整理一下常用的几种操作方法。这儿说的文件操作是指操作系统级别的,不是打开文件,对文件内容操作。我们当然可以创建文件系统对象操作文件,但是,最简单的还是使用VBA提供的标准的文件操作功能。最常见的就是文件或文件夹的增、删、改。1、创建和删除文件夹(增、删): 创建:MkD...原创 2019-10-28 10:37:01 · 834 阅读 · 0 评论 -
与XMLHTTP对象相关的名称
作者:iamlaosong最近用VBA编程使用XMLHTTP对象网抓数据的时候,发现这个对象不同场合的名称有点不同。对这些名称做了一些了解,在了解过程中,还碰到一些相关的对象,这方面我了解的还不透彻,现在将对这些东西的一些理解记录于此。1、所用的XMLHTTP对象是Microsoft XML v6.0(库文件msxml6.dll),这是我看到的最高版本,当然还有低一点的版本,在引用中可以看...原创 2019-10-24 15:43:19 · 1193 阅读 · 0 评论 -
【VBA研究】用XMLHTTP的Get功能通过百度API接口抓取城市间距离
作者:iamlaosong我曾经用VB做了个工具,抓取城市间距离(参见:从网页抓取城市间的距离),现在看来,那个工具还是比较low的,用浏览器控件,模拟点击过程,再在响应中截取距离,后来还利用这个方法做了几个其它工具。在掌握了浏览器中开发人员工具和fiddler使用方法之后,通过分析这个网页查询城市之间距离可以发现,距离是通过百度接口取得的。摒弃无关的请求之后(特别是其中图形部分),只申请距离...原创 2019-10-23 17:33:58 · 1672 阅读 · 0 评论 -
【VBA研究】错误:缺少函数或变量
作者:iamlaosong我曾经写过一个简单的出算术题的程序(做着玩的),当时没有问题,最近运行的时候却报出错误:缺少函数或变量。这个错误有点莫名其妙,错误定位在给变量a赋值那一行,但显然不是代码问题,因为改成“a=1”后依然出错。代码如下:Public Sub get_expr() '读取参数:范围和数量 p_fw = Cells(1, 2) p_no = Ce...原创 2019-10-18 11:49:38 · 5209 阅读 · 0 评论 -
Excel VBA编程的常用代码(备用待查)
使用Dim语句Dim a as integer ‘声明a为整型变量Dim a ‘声明a为变体变量Dim a as string ‘声明a为字符串变量Dim a as currency ,b as currency ,c as currency ‘声明a,b,c为货币变量......声明变量可以是:Byte、Boolean、Integer、Long、Currency、Sing转载 2014-03-04 18:38:48 · 1965 阅读 · 0 评论 -
Excel中实现隔行删除
只需要加一个辅助列即可: 在某列输入公式: =MOD(ROW(),2) 然后把公式复制到相应的数据区域即可。 如果您希望删除奇数列,那么使用筛选,选取辅助列值为1,然后选中这些行,删除即可。 如果您希望删除偶数列,那么选取辅助列值为0,然后选中筛选出来的行,删除即可。 这个方法还可以用于隔多行删一行,只要把那原创 2012-03-09 11:17:25 · 10421 阅读 · 0 评论 -
Excel vba中MsgBox 函数详细说明与应用
MsgBox 函数作用:在对话框中显示消息,等待用户单击按钮,并返回一个 Integer 告诉用户单击哪一个按钮。语法:MsgBox(prompt[, buttons] [, title] [, helpfile, context])参数说明:MsgBox 函数的语法具有以下几个命名参数:Prompt-------必需的。字符串表达式,作为显示在对话框中的消息。prom转载 2012-01-13 17:57:23 · 14010 阅读 · 0 评论 -
【VBA研究】VBA从字符串中取出数据信息的函数
作者:iamlaosong一个简单的函数,从包含有数字信息的字符串中取出这个数据,利用VAL函数将字符串转换为数值,该函数或略数字字符串后面的字母和汉字信息,所以,只要把数字前面的字母和汉字信息去掉就行了。 '函数,从字符串“ABC123456.78DEF”中取出数据Function mydata(mystring As String) As Double Dim原创 2014-05-13 17:21:11 · 4402 阅读 · 0 评论 -
【VBA研究】用VBA取得EXCEL有效行列数方法比较
作者:iamlaosong我常用下面方式取得有效行数:maxrow=sheets(1).[A65536].End(xlUp).Row实际使用中发现这种方法存在2个问题:1、高低版本不兼容,2007版最大行数增加以后,就不能用65536了,而要用1048576,即maxrow = sheets(1).[A1048576].End(xlUp).Row2、当最后一行不为空时,用这原创 2014-05-13 09:46:26 · 42274 阅读 · 1 评论 -
VBA使用GetSetting函数和SaveSetting函数读写注册表设置
Windows注册表是一个数据库,用于存储与计算机不同方面相关的设置,例如用户设置、应用程序设备、硬件设置等等。VB和VBA中提供了用于读写注册表的两个函数:GetSetting和SaveSetting。利用这两个函数可以与注册表直接交互,这不仅允许我们获取其它程序和硬件的信息,而且也能够使我们选择应用程序中的重要信息并将其存储在注册表中。但是这两个函数仅能访问下面的注册表句柄键: HK转载 2014-03-04 18:30:25 · 11727 阅读 · 0 评论 -
VBA-"找不到工程或库" 解决方案
近来,越来越多的朋友被“找不到工程或库”的错误所烦恼,所以决定新开一帖来聊聊此问题!QUOTE:一般情况下,出现此错误是因为找不到引用工程,或找不到与工程语言对应的引用的对象库出现此类错误可以根据下面操作解决:QUOTE:1.在VBE窗口中选择出错的VBA工程2.在“工具”-->“引用”,打开引用对话框3.查找带勾项中含“丢失...”、“找不到...”、“MISSI转载 2013-12-27 11:19:12 · 37023 阅读 · 0 评论 -
【VBA研究】清除字符串中的回车换行符
作者:iamlaosong 如题,实际应用中,客户输入的地址中含有回车换行,导致格式转换中出错,因此需要清除掉,方法有二:1、替换,这个方法只能清除一个回车换行 '检测地址中是否有回车换行 addr = Cells(row1, 12) If InStr(1, addr, Chr(10), vbBinaryCompare) > 0 Then MsgBox addr原创 2013-11-05 16:28:55 · 28594 阅读 · 1 评论 -
【VBA研究】利用ADO实现VBA连接Oracle并执行存储过程
VBA调用Oracle存储过程完整的程序,已调试成功。原创 2013-07-12 10:26:37 · 12095 阅读 · 0 评论 -
VBA关闭工作簿和退出Excel
要用VBA来关闭工作簿,用Workbook.Close 方法即可,而要退出Excel,则用Application.Quit 方法。下面是一些代码示例: 关闭活动工作簿,如果工作簿有更改,提示是否保存: Sub CloseWorkbook() ActiveWorkbook.Close End Sub 如果要避免出现提示,可添加“SaveChanges转载 2013-07-12 10:01:54 · 44275 阅读 · 3 评论 -
【VBA研究】VBA中使用vlookup函数
作者:iamlaosong VLOOKUP函数不是VBA函数,应写成Application.WorksheetFunction.VLookup()或者Application.VLookup()Application.是引用工作表函数的方法,非VBA函数的工作表函数必须用这种方法,不能直接被VBA引用。下面是使用案例:Sub usevlookup() Cells(1原创 2013-05-15 11:02:39 · 61917 阅读 · 8 评论 -
【VBA研究】将库存总表按供应商拆分成分表
我们可以从系统中导出库存总表,需要将总表中的数据按供应商分解到相应的表中,开始用手工做,需要2个多小时,采用下面的宏,只要十几秒就解决了。Sub chaifen()'' chaifen Macro' 宏由 iamlaosong 编制,时间: 2010-12-17''Nvendor = 45num = 1Sheets(2).SelectCells(1, 4) = Time()Range("c1:c45").Select '删除原有标志Selection.ClearContents原创 2010-12-18 14:42:00 · 3833 阅读 · 3 评论 -
【VBA研究】VBA代码的存放位置
作者:iamlaosong 学习VBA一般都从录制宏开始,宏代码存放在模块中,第一次录制的时候,系统会自动插入一个模块。我在编写自己的宏时,开始代码只会放在模块中,后来,我才了解到代码还有很多地方可以保存。打开代码编辑器后,我们可以看到VBAproject下面有很多对象,除了固原创 2011-07-18 17:51:29 · 6889 阅读 · 0 评论 -
【VBA研究】进入文本框后其内容全选
作者:iamlaosong做一个扫描核对工具,扫描的条码在文本框中,表单中只有一个用于扫描的文本框是有效的,另一个文本框用于显示核对正确时显示货品数量,不过这个文本框用户是不能操作的,如下图所示:由于需要反复扫描条码,所以希望每次扫描时能覆盖上次扫描的内容,这有两种方法,一种是核对完毕后清除文本框的内容,另一种方法就是将内容全选,显然,第二种方法较好,因为核对完毕后还可以看到上次扫描的原创 2015-07-13 17:57:43 · 7131 阅读 · 0 评论