【源码分享】VBA中一些常用的自定义函数
▎写在前面
都说写VBA像累积木,除了核心部分的循环逻辑思路,其余都是再堆砌代码。这篇文章就罗列一下我在写VBA程序中,常用的一些自定义函数。

•列标相互转换
很多时候得到的列标是数字列标,需要把它转成英文列标的形式,比如下面的语句中col变量就是数字。
col = Cells(1, Columns.Count).End(xlToLeft).Column但是如果我们需要这个数字所对应的英文列标,这个时候就需要下面的自定义函数进行便捷转化。
自定义函数代码:
'列数转字母Function CNtoW(ByVal num As Long) As StringCNtoW = Replace(Cells(1, num).Address(False, False), "1", "")End Function'字母转列数Function CWtoN(ByVal AB As String) As LongCWtoN = Range("a1:" & AB & "1").Cells.CountEnd Function
代码使用实例:
Sub test()col = Cells(1, Columns.Count).End(xlToLeft).ColumnRange("a1:" & CNtoW(col) & 1).SelectEnd Sub

•判断文件夹是否存在
往往存储运行结果需要建文件夹的时候,需要首先判断下文件夹是否存在,如果不判断直接新建,程序会报错。
自定义函数代码:
Public Function FileFolderExists(ByVal strFullPath As String) As BooleanIf Not Dir(strFullPath, vbDirectory) = vbNullString ThenFileFolderExists = TrueElseFileFolderExists = FalseEnd IfEnd Function
如果不使用自定义函数,FSO的方式自带判断文件夹是否存在的方法
Sub 新建文件夹()PathG = "D:\folder1"Set fso = CreateObject("Scripting.FileSystemObject")If fso.FolderExists(PathG) = True Then'//删除文件夹MkDir PathG '//创建文件夹ElseMkDir PathG '//创建文件夹End IfEnd Sub

•判断文件是否存在
方法一:Dir函数法
Function IsFileExists(ByVal strFileName As String) As BooleanIf Dir(strFileName) <> Empty ThenIsFileExists = TrueElseIsFileExists = FalseEnd IfEnd FunctionSub Run()If IsFileExists("D:\vba\abc.txt") = True Then' 文件存在时的处理MsgBox "文件存在!"Else' 文件不存在时的处理MsgBox "文件不存在!"End IfEnd Sub
方法二:FSO对象方法
Function IsFileExists(ByVal strFileName As String) As BooleanDim objFileSystem As ObjectSet objFileSystem = CreateObject("Scripting.FileSystemObject")If objFileSystem.fileExists(strFileName) = True ThenIsFileExists = TrueElseIsFileExists = FalseEnd IfEnd FunctionSub Run()If IsFileExists("D:\vba\abc.txt") = True Then' 文件存在时的处理MsgBox "文件存在!"Else' 文件不存在时的处理MsgBox "文件不存在!"End IfEnd Sub

•判断WorkSheet是否存在
新建WorkSheet的时候,如果已经存在相同名字的WorkSheet,程序就会报错,一般先判断下某个WorkSheet是否存在,不存在的时候才进行新建操作。
Sub 新建sheet()If SheetExists("表一") = False ThenWorksheets.Add(After:=Worksheets(Worksheets.Count)).Name = "表一"End IfEnd SubFunction SheetExists(sname) As BooleanDim x As ObjectOn Error Resume NextSet x = ActiveWorkbook.Sheets(sname)If Err = 0 Then SheetExists = True _Else SheetExists = FalseEnd Function

•对数组进行转置
通常数组转置都是借助工作表函数transpose,但是他的限制太多。
1.数量不能超过65536
2.数组中元素的长度不能超过255
所以,如果元素过多,就是用自定义数组转置函数来解决。
Function Transpose2(arr As Variant)'转置核心代码Dim brr(), i, j, nn = NumberOfArrayDimensions(arr)If n = 1 ThenReDim brr(LBound(arr) To UBound(arr), 1 To 1)For i = LBound(arr) To UBound(arr)brr(i, 1) = arr(i)NextElseReDim brr(LBound(arr, 2) To UBound(arr, 2), LBound(arr) To UBound(arr))For i = LBound(arr) To UBound(arr)For j = LBound(arr, 2) To UBound(arr, 2)brr(j, i) = arr(i, j)NextNextEnd IfTranspose2 = brrEnd FunctionPublic Function NumberOfArrayDimensions(arr As Variant) As IntegerDim Ndx As IntegerDim Res As IntegerOn Error Resume NextDoNdx = Ndx + 1Res = UBound(arr, Ndx)Loop Until Err.Number <> 0NumberOfArrayDimensions = Ndx - 1End Function

•判断本机是否联网
Private Declare Function InternetGetConnectedState Lib "wininet.dll" _(ByRef dwFlags As Long, ByVal dwReserved As Long) As LongSub 运用VBA判断计算机是否连网()If InternetGetConnectedState(0&, 0&) ThenMsgBox "已连网"ElseMsgBox "未连网"End IfEnd Sub
【建议收藏】VBA说历史文章汇总 速码工具箱2.0发布,更强大的功能等你来体验! VBA会被Python代替吗? 代码存储美化工具测评-【VBE2019】 Excel和Word数据交互读取(生成合同)
评论
