自用Excel VBA函数整理 part1

用于二维的Dictionary:

ContractedBlock.gif ExpandedBlockStart.gif CreateOrSet2
Public Sub CreateOrSet2(mainDict As Dictionary, mainKey, subKey, value)
    
Dim subDict As Dictionary
    
If Not mainDict.Exists(mainKey) Or IsEmpty(mainDict.Item(mainKey)) Then
        
Set subDict = New Dictionary
        subDict.Item(subKey) = value
        
Set mainDict.Item(mainKey) = subDict
    
Else
        
Set subDict = mainDict.Item(mainKey)
        subDict.Item(subKey) = value
    
End If
End Sub
ContractedBlock.gif ExpandedBlockStart.gif HasValue2
Public Function HasValue2(mainDict As Dictionary, mainKey, subKey) As Boolean
    
If mainDict.Exists(mainKey) And Not IsEmpty(mainDict.Item(mainKey)) Then
        
Set subDict = mainDict.Item(mainKey)
        
If subDict.Exists(subKey) And Not IsEmpty(subDict.Item(subKey)) Then
            HasValue2 = True
        
Else
            HasValue2 = False
        
End If
    
Else
        HasValue2 = False
    
End If
End Function

 

数字-字母格式的列号互转:

ContractedBlock.gif ExpandedBlockStart.gif ColNumToStr
Public Function ColNumToStr(ByVal num) As String
    base = Asc("A"- 1
    
If num <= 0 Then
        ColNumToStr = ""
        
Exit Function
    
End If
    
If num <= 26 Then
        ColNumToStr = Chr(num + base)
        
Exit Function
    
End If
    t = 0
    
Do While num > 26
        num = num - 26
        t = t + 1
    
Loop
    ColNumToStr = Chr(t + base) & Chr(num + base)
End Function
ContractedBlock.gif ExpandedBlockStart.gif ColStrToNum
Public Function ColStrToNum(ByVal str) As Integer
    base = Asc("A"- 1
    str = UCase(str)
    
If Len(str) = 1 Then
        ColStrToNum = Asc(str) - base
        
Exit Function
    
End If
    
If Len(str) = 2 Then
        pre = Mid(str, 11)
        suf = Mid(str, 21)
        ColStrToNum = (Asc(pre) - base) * 26 + Asc(suf) - base
        
Exit Function
    
End If
    ColStrToNum = 0
End Function

 

字符串连接(类似String.Format()用{0}{1}等做占位符,实现得很土):

ContractedBlock.gif ExpandedBlockStart.gif StrFormat
Public Function StrFormat(fmt, ParamArray arg()) As String
    l = LBound(arg)
    u = UBound(arg)
    ret = CStr(fmt)
    
For i = 0 To (u - l)
        part = "{" & i & "}"
        ret = Replace(ret, part, arg(i))
    
Next i
    StrFormat = ret
End Function
ContractedBlock.gif ExpandedBlockStart.gif StrCat
Public Function StrCat(ParamArray arg()) As String
    l = LBound(arg())
    u = UBound(arg())
    ret = ""
    
For i = l To u
        ret = ret & arg(i)
    
Next i
    StrCat = ret
End Function

 

在Workbook中保存基本类型值:

ContractedBlock.gif ExpandedBlockStart.gif SetName, GetName
Public Sub SetName(nam, val, Optional visi = False)
    ThisWorkbook.Names.Add name:=nam, RefersTo:=val, visible:=visi
End Sub

Public Function GetName(nam)
    GetName = Evaluate(ThisWorkbook.Names.Item(nam).RefersTo)
End Function

Public Function DeleteName(nam)
    
On Error GoTo End_DeleteName
    ThisWorkbook.Names.Item(nam).Delete
    DeleteName = True
End_DeleteName:
    DeleteName = False
End Function

 

函数指针(用VB->Win API->VB的模拟,参考[1][2]):

另外Application.Run、CallByNameEvalEvaluate可能更实用,VB6/VBA杂就没一个像js或py那样的全能eval()函数呢。。。

ContractedBlock.gif ExpandedBlockStart.gif Fn4及例子
Public Declare Function Fn4 Lib "user32" Alias _
"CallWindowProcA" (ByVal pFn4 As Long, ByVal param1 As Long, ByVal param2 As Long, ByVal param3 As Long, ByVal param4 As LongAs Long

Public Sub Test()
    
Call InvokeHello1(AddressOf Hello1)
    Debug.Print
    
Call InvokeHello2(AddressOf Hello2)
    Debug.Print
End Sub

Private Sub InvokeHello1(ByVal addrFn4 As Long)
    target = "Ptr to Variable"
    ret = Fn4(addrFn4, VarPtr(target), 000)
    Debug.Print target
End Sub

Private Function Hello1(p1, p2, p3, p4) As Long
    Debug.Print "Hello " & p1
    p1 = "Variable Modified"
    Hello = 0
End Function

Private Sub InvokeHello2(ByVal addrFn4 As Long)
    ret = Fn4(addrFn4, VarPtr("Ptr to Static"), 000)
End Sub

Private Function Hello2(p1 As String, p2, p3, p4) As Long
    Debug.Print "Hello " & p1
    Hello = 0
    
'p1 = "Access Violation"
End Function

'缺陷: 被调函数有且只能有4个参数,返回值类型只能是Long(LRESULT)
'原理: 借用 LRESULT CallWindowProc(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, lParam lParam)

'注意: 被调函数的4个参数是地址,要用VarPtr()等转换。
'       对普通变量参数不要指定类型,见Hello1()的p1;
'       而静态变量必须指定类型,见Hello2()的p1,还要注意不能改变其值。

 

初级版ArrayList(类模块):

ExpandedBlockStart.gif Class ArrayList
Private  arr()  As  Variant
Private  size, capacity  As   Integer

Private   Sub  Class_Initialize()
    size 
=   0
    capacity 
=   10
    
ReDim  arr( 1   To  capacity)
End Sub

Public   Property   Get  Count()  As   Integer
    Count 
=  size
End Property

Public   Property   Get  Item(idx)
    Item 
=  arr(idx)
End Property

Public   Property   Let  Item(idx, vlu)
    arr(idx) 
=  vlu
End Property

Public   Property   Set  Item(idx, obj)
    
Set  arr(idx)  =  obj
End Property

Public   Sub  Add(elem)
    EnsureCapacity
    size 
=  size  +   1
    
    
If   IsObject (elem)  Then
        
Set  arr(size)  =  elem
    
Else
        arr(size) 
=  elem
    
End   If
End Sub

Private   Sub  EnsureCapacity()
    
If  (size  +   1 >  capacity  Then
        
ReDim  Preserve arr( 1   To  capacity  *   2 ' Preserve!
        capacity  =  capacity  *   2
    
End   If
End Sub

Public   Sub  Clear()
    size 
=   0
End Sub

Public   Function  IndexOf(elem)  As   Long
    idx
&   =   - 1
    elemObj 
=   IsObject (elem)
    
    
For  i  =   1   To  size
        
If  elemObj  Then
            
If   IsObject (arr(i))  Then
                
If  ObjPtr(arr(i))  =  ObjPtr(elem)  Then
                    idx 
=  i
                    
Exit   For
                
End   If
            
End   If
        
Else
            
If   Not   IsObject (arr(i))  Then
                
If  arr(i)  =  elem  Then
                    idx 
=  i
                    
Exit   For
                
End   If
            
End   If
        
End   If
    
Next  i

    IndexOf 
=  idx
End Function

Public   Sub  Delete(elem)
    idx 
=  IndexOf(elem)
    
If  idx  <>   - 1   Then
        DeleteAt idx
    
End   If
End Sub

Public   Sub  DeleteAt(idx)
    
For  i  =  idx  To  (size  -   1 )
        
If   IsObject (arr(i  +   1 ))  Then
            
Set  arr(i)  =  arr(i  +   1 )
        
Else
            arr(i) 
=  arr(i  +   1 )
        
End   If
    
Next  i
    size 
=  size  -   1
End Sub

Public   Function  GetArray()
    
Dim  ret()  As  Variant
    
ReDim  ret( 1   To  size)
    
For  i  =   1   To  size
        ret(i) 
=  arr(i)
    
Next  i
    
    GetArray 
=  ret
End Function

 

运行一个SQL查询并填充到工作表上:

ExpandedBlockStart.gif ExecuteSelect
Public   Sub  ExecuteSelect(connStr, selectTxt, destTopLeft  As  Range)
    
On   Error   GoTo  ExecuteSelect_Err
    
Set  ws  =  destTopLeft.Worksheet
    
    
Set  conn  =   CreateObject ( " ADODB.Connection " )
    conn.Open connStr
    
Set  rs  =  conn.Execute(selectTxt)
    
    
For  i  =   0   To  rs.Fields.Count  -   1
        destTopLeft.Offset(
0 , i)  =  rs.Fields(i).Name
    
Next  i
    destTopLeft.Offset(
1 0 ).CopyFromRecordset rs

ExecuteSelect_Clean:
    
If   Not   IsEmpty (rs)  Then
        rs.Close
    
End   If
    
If   Not   IsEmpty (rs)  Then
        conn.Close
    
End   If
    
Set  rs  =   Nothing
    
Set  conn  =   Nothing
    
Exit   Sub
ExecuteSelect_Err:
    
MsgBox   " Error  "   &  Err.Number  &   "  ( "   &  Err.Description  &   " ) "
    
GoTo  ExecuteSelect_Clean
End Sub

转载于:https://www.cnblogs.com/dxz/archive/2009/11/22/vba-helper-func-collection.html

目录 '1.函数作用:返回 Column 英文字........................9 '2.函数作用:查询某一值第num次出现的值................9 '3.函数作用:返回当个人工资薪金所得为2000元(起征点为850元)时的应纳个人所得税税额.............................10 '4.函数作用:从形如"123545ABCDE"的字符串中取出数字....11 '5.函数作用:从形如"ABCD12455EDF"的字符串中取出数字...11 '6.函数作用:按SplitType取得RangeName串值中的起始位置12 '7.函数作用:将金额数字转成中文大写....................13 '8.函数作用:计算某种税金..............................18 '9.函数作用:人民币大、小写转换........................19 '10.函数作用:查汉字区位码.............................20 '11.函数作用:把公元年转为农历.........................21 '12.函数作用:返回指定列数的列标.......................42 '13.函数作用:用指定字符替换某字符.....................43 '14.函数作用:从右边开始查找指定字符在字符串中的位置...43 '15.函数作用:从右边开始查找指定字符在字符串中的位置...44 '16.函数作用:计算工龄.................................44 '17.函数作用:计算日期差,除去星期六、星期日...........45 '18.函数作用:将英文字反转的自定函数...................46 '19.函数作用:计算个人所得税...........................46 '20.函数作用:一个能计算是否有重复单元的函数...........47 '21.数字金额转中文大写................................48 '22.函数作用:将数字转成英文...........................49 '23.函数作用:人民币大小写转换.........................52 '24.函数作用:获取区域颜色值...........................53 '25.函数作用:获取活动工作表名.........................53 '26.函数作用:获取最后一行行数.........................54 '27.函数作用:判断是否连接在线.........................54 '28.函数作用:币种转换.................................54 '29.函数作用:检验工作表是否有可打印内容...............55 '30.函数作用:查找一字符串(withinstr)在另一字符串中(findstr1)中某一次(startnum)出现时的位置,返回零表示没找到。..................................................57 '31.函数作用:增加文件路径最后的“\”符号..............58 '32.函数作用:计算所得税...............................58 '33.函数作用:从工作表第一行的标题文字以数字形式返回所在列号..................................................58 '34.函数作用:在多个工作表中查找一个范围内符合某个指定条件的项目对应指定范围加总求和..........................59 '35.函数作用:返回 Column 英文字.......................60 '36.函数作用:查找指定列名的列数.......................60 '37.函数作用:文字格式的时间(分:秒)转化为数字格式(秒)..61 '38.函数作用:将"hh:mm:ss"格式的时分秒数转换成秒数.....62 '39.函数作用:金额中文大写转数字.......................62 '40.函数作用:把角度转为度秒分、弧度等显示.............63 '41.函数作用:身份证号码侦测...........................64 '42.函数作用:显示公式.................................65 '43.函数作用:方便财务人员理帐查找.....................66 '44.函数作用:数值转换为字符地址.......................68 '45.函数作用:字符地址转换为数值.......................69 '46.函数作用:等待时间(以秒计算).....................69 '47.函数作用:得到字符串实际的长度(以单字节记).......70 '48.函数作用:18位身份证最后一位有效性验证............70 '49.函数作用:计算符合maturity condition的拆解金额....72 '50.函数作用:对多个用同一分隔符分隔的待查找元素,逐一在表区域首列内搜索,将返回选定单元格的值相加,............72 '51.函数作用:根据个人所得税(工资)反算工资数.........73 '52.函数作用:判断表是否存在...........................74 '53.函数作用:角度转弧.................................74 '54.函数作用:比较相同的字符串.........................75 '55.函数作用:对选定的数组进行排序.....................76 '56.函数作用:取得指定月份天数.........................77 '57.函数作用:排序工作表活页薄.........................77 '58.函数作用:统计数组中非重复数据个数.................78 '59.函数作用:摘取子字符串.............................79 '60.函数作用:计算20000余个汉字的笔画.................79 '61.函数作用:删除当前工作表中的全部超连接.............80 '62.函数作用:取得相近数据.............................81 '63.函数作用:提取定串中汉字...........................81 '64.函数作用:搜索重复数据(选定范围)...................81 '65.函数作用:字符型转数字型...........................82 '66.函数作用:小写人民币转大写人民币...................83 '67.函数作用:取得指定月份人星期天个数.................84 '68.函数作用:侦测档案是否包含宏.......................84 '69.函数作用:获取循环参照单元格.......................85 '70.函数作用:创建桌面快捷方式.........................86 '71.函数作用:自动建立多级目录.........................86 '72.函数作用:统计经筛选后符合条件的记录条数...........87 '73.函数作用:复制单元格列高与栏宽.....................87 '74.函数作用:取消隐藏工作表(包括vba Project工程保护的)88 '75.函数作用:删除单元格自定义名称.....................88 '76.函数作用:从文件路径中取得文件名...................89 '77.函数作用:取得一个文件的扩展名.....................89 '78.函数作用:取得一个文件的路径.......................90 '79.函数作用:十进制转二进制...........................90 '80.函数作用:检查一个数组是否为空.....................90 '81.函数作用:字母栏名转数字栏名.......................91 '82.函数作用:数字栏名转文字栏名.......................91 '83.函数作用:判断一件活页夹中是否还有子目录...........92 '84.函数作用:判断一个文件是否在使用中.................92 '85.函数作用:列出档案详细摘要信息.....................93 '86.函数作用:获取菜单ID编号及名称列表................93 '87.函数作用:状态列动态显示文字.......................94 '88.函数作用:取得一个文件的路径2.....................94 '89.函数作用:取得一个文件的路径3.....................95 '90.函数作用:取得Activecell的栏名....................95 '91.函数作用:取得单元格中指定字符前的字符.............95 '92.函数作用:前单元格指定字符前的字符颜色改成红色.....95 '93.函数作用:根据数字返回对应的字母列号...............96 '94.函数作用:取工作表名字.............................96 '95.函数作用:取消所有隐藏的宏表.......................97 '96.函数作用:导出VBA Project代码.....................97 '97.函数作用:导入VBA Project代码.....................97 '98.函数作用:取得汉字拼音的第一个字母.................98 '99.函数作用:获取两栏中相同的数据....................100 '100.函数作用:选取当前工作表中公式出错的单元格﹐关返回出错个数...............................................101 '101.函数作用:将工作表中最后一列作为页脚打印在每一面页尾101 '102.函数作用:获取vbproject引用项目.................102 '103.函数作用:移除Excel工作表中的外部数据连接.......103 '104.函数作用:将选择定单元格作成镜像图片.............103 '105.函数作用:反选择单元格中的数.....................105 '106.函数作用:在Excel中加入一个量度尺(以厘米为单位).106 '107.函数作用:在Excel中加入一个量度尺(以寸为单位)...109 '108.函数作用:取得一个短文件名的长文件名.............111 '109.函数作用:取得临时文件名.........................112 '110.函数作用:等用Shell调用的程序执行完成后再执行其它程序...................................................112 '111.函数作用:将Mouse显示成动画.....................113 '112.函数作用:限制Mouse移动范围.....................114 '113.函数作用:取得当前激活窗品句柄及标题.............114 '114.函数作用:取得屏幕分辨率.........................115 '115.函数作用:自动建立多级目录.......................115 '116.函数作用:将文件长度置零.........................116 '117.函数作用:读取WIN9X / Me共享文件夹密码..........116 '118.函数作用:取得预设的打印机及设置预设的打印机.....119 '119.函数作用:获得当前操作系统的打印机个数及检测打印是否存在.................................................120 '120.函数作用:枚举打印机名称清单.....................120 '121.函数作用:读取网络服务器当前时间.................122 '122.函数作用:下载文件到指定目录.....................123 '123.函数作用:自动映射网络驱动器.....................124 '124.函数作用:自动断开网络驱动器.....................125 '125.函数作用:连接选定单元格中的内容.................125 '126.函数作用:获取一个单元格中有指定字体颜色部份数据.126 '127.函数作用:对指定文件加XLS加密...................126 '128.函数作用:选择指定范围内使用了填充颜色的单元格...127 '129.函数作用:在特定的区域内查找文本,返回值是包含查找文本的单元格...........................................127 '130.函数作用:返回特定区域中最大值的地址.............128 '131.函数作用:删除表格中使用范围内的所有空白单元格...129 '132.函数作用:返回数组中有多少个指定的字符串.........129 '133.函数作用:返回当前工作表中引用了指定的单元的地址.130 '134.函数作用:获取Excel中字型列表...................131 '135.函数作用:获取一个字符串中有多少个数字字符.......131 '136.函数作用:在Excel中对多列进行填充...............131 '137.函数作用:对选定的范围进行数据填充(忽略单元格格式)132 '138.函数作用:VBA Project加密及解密.................132 '139.函数作用:列出收藏夹中的网址.....................133 '140.函数作用:计算两个日期之间相隔的年份,比如年龄,工龄等.可计算从1000年01月01日起的日期....................134 '141.函数作用:从字符串提取纯数字.....................135 '142.函数作用:将一个数组按升序排列...................136 '143.函数作用:将一个数组按降序排列...................137 '144.函数作用:删除空白列.............................137 '145.函数作用:判断工作表是否为空白...................138 '146.函数作用:将数据按类分到不同工作薄...............138 '147.函数作用:单元格内数据排序.......................139 '148.函数作用:对多栏排序.............................140 '149.函数作用:返回计算公式的值 [,值的计算公式].......140 '150.函数作用:把第一列=某个值对应的第二列的内容连在一起,并用、隔开...........................................141 '151.函数作用:取得系统使用模式.......................142 '152.函数作用:计算机注销/关机/重启...................142 '153.函数作用:更改计算机名称.........................143 '154.函数作用:从n位开始取出字符串中的汉字、英文字母、数字...................................................143 '155.函数作用:在指定列中寻找含有指定字符串的单元格,并将符合条件的单元格标为红色,并将对应的下一列单元格赋值为1。.....................................................144 '156.函数作用:清除字符串中的空格.....................145 '157.函数作用:查找合并单元格位置.....................145 '158.函数作用:阴阳历转换和阴阳历生日.................145 '159.函数作用:利用数组和Substitute来替换某字符......149 '160.函数作用:一键创建斜线表头.......................150 '161.函数作用:自动获取指定月的工作日.................151
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值