
简介一份名为《VB函数大全 基本函数大全》的PDF文档是专门为VB编程学习者打造的常用函数速查手册资源包内包含1个PDF文件压缩后大小仅15KB非常轻便几乎不占存储空间可以随时打开浏览。目前已有567人浏览学习说明它在VB初学者和开发者群体中有一定实用度手册内容按功能类别组织涵盖数学、字符串、日期时间、数组、对象、错误处理等模块。数学部分介绍了求绝对值、反正切、余弦、指数、取整等常用数学运算字符串部分包括字符编码转换、取子串、大小写转换等操作日期时间部分涵盖当前日期获取、日期加减、间隔计算、日期分解等。数组方面有创建数组的函数对象方面有数据字典、文件系统、类事件访问等同时手册还讲解了赋值、逻辑、连接等运算符以及循环、过程声明、错误处理等VB语言核心语法。每个条目均配有简洁的功能说明方便读者快速检索和查阅无论是日常编码、课程设计还是项目维护这份手册都可以作为手边的常见问题参考。 老开发们的硬盘里大概率都躺着这么一份文件《VB函数大全_基本函数大全.pdf》。我手里这份从大学一直跟到现在经常是翻两页觉得“都会”真写代码时又默默把它打开。VB确实不算主流语言了但办公自动化、工控上位机、老项目维护里它依然活跃函数就是这套语言最实际的弹药库。这篇就来拆一拆这份文档背后的函数体系从分类、高频场景讲到API扩展和踩坑点给刚开始看VB函数的人一条明确的路线也给正在维护VB项目的人一些能直接用的排查经验。1. 函数学习的核心思路先分类再按需检索《VB函数大全》这类PDF最容易把人劝退的地方就是函数列表太长。实际上VB内置函数并不复杂问题在于它把不同用途的函数混在一起新手看到几十个函数名就懵了。我建议拿到资料先不要顺着翻而是做一件事把函数按用途分类建立自己的检索目录。1.1 不靠背靠归纳VB函数的六大类别VB的函数大致可以归成六类覆盖九成以上的日常场景函数类别代表函数典型用途数学与随机Abs、Int、Fix、Round、Sqr、Rnd数值计算、四舍五入、生成随机数字符串处理Len、Left、Right、Mid、InStr、Replace、Split、Join文本解析、字符串截取与替换类型转换与判断CStr、CInt、CLng、CDate、Val、IsNumeric、IsDate数据类型转换、输入合法性校验日期时间Now、DateAdd、DateDiff、DatePart、Format时间戳计算、报表周期统计输入输出与交互InputBox、MsgBox、Print、Open用户交互、调试输出、文件读写格式化与界面Format、FormatNumber、FormatCurrency、RGB数值格式化、界面颜色处理用这个框架再去看PDF相当于把一本字典变成了六个抽屉。遇到场景想不起函数时先判断属于哪一类再去那个抽屉里找效率高很多。1.2 函数与过程的区别以及函数声明的基本规则VB里有两类代码单元Function和Sub。大多数初学者会忽略两者的本质区别Function有返回值Sub没有。举个简单的例子判断字符串长度用Len函数它返回一个数字而打印一段文字用Print方法或Debug.Print它只执行动作不产出结果。在写代码时凡是“需要把计算结果拿过来继续用”的就该选Function。另外要注意函数的声明位置。内置函数直接可用但自己写的自定义函数需要在模块中先用Function关键字声明声明时指定参数类型和返回类型。如果某个函数在模块A里定义要在窗体B里调用必须在声明时写成Public Function。很多人写着写着报“函数未定义”八成是声明成了Private或者函数所在模块没有被包含在工程里。2. 高频基础函数逐个拆解参数、场景与细节PDF里函数虽多真正每日必用的就二三十个。我把最常见的几类单独拿出来逐个说清楚参数含义、使用场景和陷阱这里面的坑几乎都是我在实际项目里踩过的。2.1 数学与随机函数别小看Round和Rnd的坑数学函数这类看起来最简单但偏偏有两个容易翻车的地方。第一个是Round函数。VB的Round采用的是银行家舍入规则也就是四舍六入五成双。Round(2.5)结果是2Round(3.5)结果是4不是我们理解的“四舍五入”。在财务计算场景下这个行为很要命所以涉及精确金额时我一般用FormatNumber(数值, 小数位数, 0, 0, -1)来强制传统四舍五入只要最后一参数设为-1。第二个是Rnd随机函数。它的坑在于如果不用Randomize语句初始化随机种子每次程序启动后第一次调用Rnd得到的结果是相同的。常见写法是这样Randomize Dim dice As Integer dice Int(Rnd * 6) 1 生成1到6的随机整数Int和Fix也容易搞混。Int函数对负数会向下取整Fix函数则直接丢弃小数部分。Int(-8.4)结果是-9Fix(-8.4)结果是-8。判断一个数是否为整数时我习惯这样写If Abs(数值 - Int(数值)) 0.000001 Then 是整数 End If2.2 字符串函数最常用的一组也是最容易用错的一组字符串处理是VB的强项函数名直观但细节决定成败。Len返回长度Left和Right分别从左右截取Mid从指定位置截取这些都没什么难懂重点在几个高级一点的函数上。InStr是查找子串位置的核心函数它有两个重载写法InStr(字符, 字符串) 和 InStr(起始位置, 字符, 字符串)。我第一次用的时候没注意第二个参数顺序把原始字符串和查找内容写反结果查了半天都返回0。正确示例Dim pos As Integer pos InStr(1, Hello VB, VB) 返回7Replace函数做文本批量替换很好用但要注意它区分大小写。要做不区分大小写的替换需要结合StrComp函数的vbTextCompare参数或者先统一转成大写再替换比较省事。Split和Join是成对出现的。Split按分隔符把字符串变成数组Join把数组拼回字符串。解析CSV文件、拼SQL语句时这两个函数是神器Dim arrData() As String arrData Split(苹果,香蕉,橘子, ,) 得到三元素数组arrData(0)苹果 Dim line As String line Join(arrData, |) 得到 苹果|香蕉|橘子2.3 类型转换与判断函数写输入校验前先读这部分文本输入框拿进来的全是字符串要参与计算必须先转类型。这类函数里我最常用的是Val、CInt、CStr和IsNumeric。Val的语义是“从字符串开头解析数字”遇到非数字字符就停止。Val(12ab34)结果是12不会报错但如果用户输入的是“abc”就直接得到0可能掩盖输入错误。所以做用户输入校验时先跑IsNumeric更稳妥If IsNumeric(txtInput.Text) Then result CDbl(txtInput.Text) * 2 Else MsgBox 请输入合法数字, vbExclamation End IfCInt、CLng、CSng、CDbl是强制类型转换家族转换失败会抛出异常这就是上面先用IsNumeric兜底的原因。CInt还有一个隐藏行为它能处理的最长字符串受系统区域设置影响中文系统里如果字符串里有千位分隔符合法写法“1,000”CInt也能转换但Val却不行两者行为并不一致。这一条在PDF里不会写实战时就是靠它排查问题。2.4 日期时间函数报表和调度逻辑的地基日期函数整体逻辑一致所有间隔类型都由一个字符串参数控制yyyy表示年q表示季度m表示月d表示天ww表示周h表示小时n表示分钟s表示秒。DateAdd和DateDiff就是靠这些参数进行计算。我维护过一个报表系统每周一生成上周数据判断逻辑用DatePart(w, Now)获取本周是第几周再用DateAdd和DateDiff做周期边界计算。核心代码大概是这样Dim startDate As Date Dim endDate As Date startDate DateAdd(d, -6, Date) 最近7天起始日期 endDate Date Dim days As Long days DateDiff(d, startDate, endDate) 两个日期差多少天Format函数在输出报表时至关重要Format(Now, yyyy-MM-dd HH:mm:ss)能把时间格式对齐这个函数我在第二章第五节展开说因为它的控制字符串足够独立成节。2.5 格式化与交互函数让输出有排版让脚本能交互对于经常写小工具的人来说Format、MsgBox、InputBox这三个函数构成了程序和人交互的基本界面。Format的威力在于格式字符串。日期格式符号上面提过数字格式符号包括0必须显示一位不足补0、#有数字才显示、小数点、逗号千分位、百分号。比如Format(1234.5, #,##0.00)会输出“1,234.50”。控制台程序、导出Excel报表、生成日志文件时非常好用。百分比则用Format(0.125, 0.00%)得到“12.50%”。MsgBox和InputBox是老一辈交互控件。MsgBox注意返回值可以通过MsgBoxResult枚举判断用户点了哪个按钮Dim answer As Integer answer MsgBox(确定要删除这条记录吗, vbYesNo vbQuestion, 提示) If answer vbYes Then 执行删除逻辑 End If一个项目里如果大量使用MsgBox和InputBox说明可以开始考虑做成带表单的实际软件了。VB的窗体控件配合自定义函数封装才能构成真正可交付的工具。3. 内置函数不够用时的三条扩展路线《VB函数大全》只解决“内置函数”这一层问题。真到项目里会发现很多需求内置函数覆盖不了比如模拟键盘输入、串口通信、与组态软件联动。这里分享三条常用的扩展路线基本覆盖工控和办公自动化两大场景。3.1 调用Windows API用Declare为VB插上系统级翅膀VB的Declare语句可以声明外部DLL函数最常见的是user32.dll和kernel32.dll里的系统函数。模拟键盘输入用的SendInput就在user32.dll里它的声明大概长这样Private Type KEYBDINPUT wVk As Integer wScan As Integer dwFlags As Long time As Long dwExtraInfo As Long End Type Private Declare Function SendInput Lib user32.dll _ (ByVal nInputs As Long, pInputs As KEYBDINPUT, _ ByVal cbSize As Long) As Long声明之后就能在VB里直接调用Windows API做按键模拟或者鼠标事件。这套机制让VB突破了“只能调用自己函数”的边界但要注意两点Declare函数参数的类型必须和DLL完全一致整数用Long字符串用ByVal String64位系统上有些声明还需要调整不同Office版本对Declare的支持也不同。热词里有人搜“vb模拟键盘输入 sendinput”这类需求多半是想做自动填表、自动测试、游戏自动操作。用SendInput之前先确认有没有更合规的方案比如给程序发消息、调用UI自动化框架纯按键模拟会被安全软件拦截的概率不低。3.2 MSComm串口通信上位机场景下的标准玩法工控上位机开发里串口很常遇到。VB的MSComm控件Microsoft Comm Control是老牌串口库虽然控件比较老但胜在稳定。初始化代码大概是这样MSComm1.CommPort 1 使用COM1 MSComm1.Settings 9600,N,8,1 波特率9600,无校验,8数据位,1停止位 MSComm1.InputMode comInputModeText MSComm1.RThreshold 1 每收到一个字符触发OnComm事件 MSComm1.PortOpen True 打开串口发送数据用MSComm1.Output 命令内容 vbCrLf接收数据通过OnComm事件在处理。RThreshold设置为1表示任意一个字节到达就触发事件这种模式适合做应答式的指令通信。实际项目里串口通信刚打开时设备可能没有准备就绪打开串口之后建议加一个短延时再发第一条指令否则第一条命令经常丢。3.3 WinCC类工业软件脚本按钮跳画面的常见实现VB语法在很多工业组态软件里都被用作脚本语言WinCC的VBS就是典型。热词里那个“wincc怎么用vb单击按钮跳转到另一画面”其实就是往按钮的点击事件里写一段VBS脚本核心思路和VB里的窗体切换类似Sub OnClick(ByVal Item) Dim objScreen Set objScreen HMIRuntime.Screens(Main.pdl) objScreen.Connect End Sub不同版本的WinCC对象模型会有差异有的是Screens集合有的是ScreenTemplates写之前先查对应版本文档确认。这类脚本已经不属于内置函数范畴但如果你熟VB函数的写法和“参数、返回值”这套思维方式学起来会很快。这也是我觉得《VB函数大全》到今天还能用的原因它训练的是“查函数、看参数、整结果”的处理问题的能力这种能力放到WinCC、放到Excel VBA一样成立。4. 常见问题与排查技巧实录4.1 函数未定义与环境路径类报错同一逻辑两种表现网上很多人在别的语言环境里遇到“无法将xxx识别为cmdlet、函数、脚本文件或可运行程序的名称”这类报错和VB里的“编译错误子过程或函数未定义”本质是一个逻辑。造成这种结果的原因通常是三个层面根本没定义、定义了但不在当前作用域、定义位置存在但调用路径不对。放到VB工程里逐个排查先搜代码里有没有Function名字如果没有就是函数缺失如果有但Private声明在别的窗体改成Public或者移到标准模块如果函数在DLL里检查是否有Declare声明且Lib路径正确。很多人只排查前两步忽略第三步实际项目里第三方DLL没注册或路径写错的情况经常发生。4.2 函数名冲突、作用域和模块化建议VB工程里遇到过一个典型问题一个函数在模块A里声明为Public Function GetData在窗体B里又写了一个Private Function GetData结果调用时用的是窗体自己的版本而且如果参数签名不同还会编译报错。这种问题特别隐蔽因为代码不报错但跑起来结果不对。我的习惯是写一个专门的“功能模块”把公共函数全部放进去统一用Public声明统一加前缀。比如处理编码的用Enc开头处理数据的用Data开头。Windows API函数则单独放一个API声明模块用Private声明在模块内部只暴露需要的函数。这样能最大程度减少在窗体里写Public函数的冲动也方便后人来维护。4.3 高频错误速查表报错信息可能原因排查思路编译错误子过程或函数未定义函数未声明、声明成Private、库未引用搜索函数名检查声明范围实时错误13类型不匹配类型转换时源数据格式不对先用IsNumeric/IsDate判断再转换实时错误6溢出数值超出类型范围用Long代替Integer用CDbl代替CInt实时错误5无效的过程调用或参数函数参数不合法检查数组下标、日期格式、文件路径实时错误91对象变量未设置对象未New或未Set赋值用TypeName判断对象状态Debug.Print是我排查这类问题最常用的工具。在关键函数入口出口各加一行Debug.Print在立即窗口就能看到数据流转过程。加上Err.Description记录日志的做法也很有用On Error Resume Next Dim result As Variant result SomeFunction() If Err.Number 0 Then Debug.Print 调用失败: Err.Description End IfVB的函数调用本来就以过程式为主只要把参数和返回值盯清楚大部分问题都能快速定位。最后再分享一个《VB函数大全》的实际用法。不要把它当字典从头翻到尾按自己的项目类型把常用函数挑出来做成自己的速查清单。做串口的把串口相关放一起做报表的把Format、DateDiff这类放一起下次写代码直接对照清单。这份PDF的价值从来不是让你背下全部而是让你知道VB的边界在哪需要的时候能找得到、用得上。本文还有配套的精品资源点击获取