简介:一份名为《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)结果是2,Round(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)结果是-9,Fix(-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 String;64位系统上有些声明还需要调整,不同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的边界在哪,需要的时候能找得到、用得上。
本文还有配套的精品资源,点击获取