ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 18281|回复: 71

[分享] 我的VBA自定义函数研习收获

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-2-22 16:38 | 显示全部楼层 |阅读模式
本帖最后由 weiyingde 于 2018-2-24 21:21 编辑

缘起:在办公过程中,总希望把复杂的事情简单解决,于是想到了VBA代码。用VBA解决一些手工办起来繁琐重复的事情,又快又准又好。真是便捷高效,进而乐此不疲。但随着使用机会的渐多和对VBA编程认识的渐进,逐渐觉得,日常接触到的许多工作虽然复杂繁琐,然很多流程中的关键步骤大同小异,如果不加分析继续编写代码,就会用新的繁琐替代旧的繁琐。这样,效率不仅无法得到质的提升,而且雷同的流程还会造成了编码的大量冗余,进而拖慢电脑的运行速度,吃力不讨好,真是一举两失。鉴于此,我想运用函数解决难题。VBA固有的函数,固然稳定好用,但面对纷繁复杂的具体工作,其灵活性和实用性便显得捉襟见肘、力不从心——想把VBA自定义函数派上用场并且给原先的代码减肥,让已有的程序更加流畅快捷高效运行的想法早已盘踞心头——只可惜,学艺不精,能力有限,时间不足,无法付诸行动。而今,机会终于来临,近一个月的寒假闲暇给了我足够的时间和充沛的精力,让我终于有机会把以往的经典代码翻出来“复习”,在吸收百度来的VBA自定义函数经典实例、积累宝贵编程经验的基础上,终于有了我自己的VBA自定义函数的收获。说是收获,却不能说原创。这些代码中有些是我以前代码的“变种”,一些是对别人程序的“整合”,有些使我自己的一点“尝试”,希望得到网友的指教、完善、补充……
另外,我想把这个帖子一直写下去,不断添加,逐渐丰富,同时,大家若有经典的实例,希望加入其中。
闲话少说,步入正题。

评分

4

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-22 16:57 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 weiyingde 于 2018-2-23 17:22 编辑

Function GetInfoHWId(Optional ByVal k As String) As String '1.1信息函数 之软硬件信息
Dim Str As String
Select Case k
       Case "计算机名" '或称"电脑用户"
            GetInfoHWId = CreateObject("Wscript.Network").ComputerName  'Environ("Computername")
       Case "系统版本"
            GetInfoHWId = Application.OperatingSystem
       Case "xl版本信息"
            GetInfoHWId = Application.CalculationVersion
       Case "本文件名称"
            GetInfoHWId = Split(ThisWorkbook.Name, ".")(0)
       Case "CPU号"
            GetInfoHWId = GetObject("winmgmts:").ExecQuery("Select ProcessorID From Win32_Processor")("Win32_Processor.DeviceID='CPU0'", 1).ProcessorId
       Case "硬盘盘号"
            GetInfoHWId = Trim(GetObject("winmgmts:").InstancesOf("Win32_PhysicalMedia")("Win32_PhysicalMedia" & ".Tag=""\\\\.\\PHYSICALDRIVE0" & """").SerialNumber)
       Case "U盘列号"
            With GetObject("winmgmts:\\.\root\cimv2")
                 Set CoIts = .ExecQuery("Select * From Win32_USBHub")
                 For Each bj In CoIts
                    If bj.DeviceID Like "*VID*" Then ids = bj.DeviceID 'ids = Split(bj.DeviceID, "\")
                 Next
                 GetInfoHWId = ids
             End With
       Case "主板列号"
            GetInfoHWId = Trim(GetObject("winmgmts:").InstancesOf("Win32_BaseBoard")("Win32_BaseBoard.Tag=""Base Board""").SerialNumber)
End Select
End Function
Public Function Get周次()
Dim rq1 As Date, rq2 As Date, rq3 As Date, rq4 As Date
Dim Y As Integer
On Error Resume Next
  If Year(Date) > Year(lunar(Format(Date, "yyyy-m-d"))) Then Y = 1
    rq1 = Format(solar(Year(Date) - Y & "-1-16"), "yyyy-m-d")  '下学期正月十六开学
    rq2 = DateSerial(Year(Date) - Y, 7, 1)                     '下学期7月1日结束
    rq3 = DateSerial(Year(Date) - Y, 9, 1)                     '上学期9月1日开学
    rq4 = Format(solar(Year(Date) - Y & "-12-15"), "yyyy-m-d") '上学期腊月十五结束
  If Date >= rq1 And Date < rq2 Then Get周次 = Excel.Application.WorksheetFunction.RoundUp(DateDiff("d", rq1, Date) / 7, 0)
  If Date >= rq2 And Date < rq3 Then Get周次 = "暑假"
  If Date >= rq3 And Date < rq4 Then Get周次 = Excel.Application.WorksheetFunction.RoundUp(DateDiff("d", rq3, Date) / 7, 0) + 1
  If Date >= rq4 And Date < rq1 Then Get周次 = "暑假"
End Function
'与今天今年(阴公历)、今天、星期、周次相关时间函数            '1.2信息函数 之时间信息
Public Function GetDT(ByVal CS As String) 'Public Function
Application.Volatile
isr = "初一,初二,初三,初四,初五,初六,初七,初八,初九,初十,十一,十二,十三,十四,十五,十六,十七,十八,十九,二十,廿一,廿二,廿三,廿四,廿五,廿六,廿七,廿八,廿九,三十 "
arr = Array("yxxw", "yqxj", "yqxs", "yxxn", "ydxn", "yxxy", "ydxy", "yxxr", "ydxr", "yqxn1", "yqxn2", "yxxw", "nqxj", "nqxs", "nxxn", "ndxn", "nsxn", "nxxy", "ndxy", "nxxr", "ndxr", "nqxn1", "nqxn2", "ntgdz", "jd", "xq", "zhc")
  With Excel.Application.WorksheetFunction
     Ysr1 = .Text(Now(), "公历:yyyy年m月d日")                                                                                         '阳小写文_"yxxw"
     Ysrj = .Text(Now(), "yyyy-mm-dd")                                                                                               '阳全写简_"yqxj"
     Ysrs = .Text(Now(), "yyyymmdd")                                                                                                 '阳全写缩_"yqxs"
     Ysr2 = Mid(Ysr1, 4, 4) * 1                                                                                                      '阳小写年_"yxxn"
     Ysr3 = .Text(Ysr2, "[dbnum1]d")                                                                                                 '阳大写年_"ydxn"
     Ysr4 = Mid(Ysr1, 9, .Find("月", Ysr1) - 9) * 1                                                                                  '阳小写月_"yxxy"
     Ysr5 = .Text(Ysr4, "[dbnum1]d")                                                                                                 '阳大写月_"ydxy"
     Ysr6 = Mid(Ysr1, .Find("月", Ysr1) + 1, Len(Ysr1) - .Find("月", Ysr1) - 1) * 1                                                  '阳小写日_"yxxr"
     Ysr7 = .Text(Ysr2, "[dbnum1]0")                                                                                                 '阳大写日_"ydxr"
     Ysrq1 = .Text(Year(Date), "[dbnum1]0") & .Text(Ysr4, "[dbnum1]0") & .Text(Ysr6, "[dbnum1]0") '"[DBnum2]d"  取前面数             '阳全写年1_"yqxn1"
     Ysrq2 = .Text(Ysr2, "[dbnum1]0") & "年" & .Text(Ysr4, "[dbnum1]0") & "月" & .Text(Ysr6, "[dbnum1]0") & "日"                     '阳全写年2_"yqxn2"
     Nsr1 = .Text(lunar(.Text(Now(), "yyyy-mm-dd")), "农历:yyyy年m月d日")                                                            '农小写文_"yxxw"
     Nsrj = lunar(.Text(Now(), "yyyy-mm-dd"))                                                                                        '农全写简_"nqxj"
     Nsrs = .Text(Nsrj, "yyyymmdd")                                                                                                  '农全写缩_"nqxs"
     Nsr2 = Mid(Nsr1, 4, 4) * 1                                                                                                      '农小写年_"nxxn"
     Nsr3 = .Text(Nsr2, "[dbnum1]0")                                                                                                 '农大写年_"ndxn"
     Nsr4 = Choose(Nsr2 Mod 12 + 1, "猴", "鸡", "狗", "猪", "鼠", "牛", "虎", "兔", "龙", "蛇", "马", "羊")                           '农属相年_"nsxn"
     Nsr5 = Mid(Nsr1, 9, .Find("月", Nsr1) - 9) * 1                                                                                  '农小写月_"nxxy"
     Nsr6 = Choose(Nsr5, "正", "二", "三", "四", "五", "六", "七", "八", "九", "十", "冬", "腊")                                      '农大写月_"ndxy"
     Nsr7 = Mid(Nsr1, .Find("月", Nsr1) + 1, Len(Nsr1) - .Find("月", Nsr1) - 1) * 1                                                  '农小写日_"nxxr"
     Nsr8 = IIf(.And(Nsr7 >= 1, Nsr7 <= 9), "初" & .Text(Nsr7, "[dbnum1]d"), .Text(Nsr7, "[dbnum1]d")) '或 Split(isr, ",")(Nsr7 - 1) '农大写日_"ndxr"
     Nsrq1 = .Text(Nsr2, "[dbnum1]0") & Nsr6 & Nsr8                                                                                  '农全写年1_"nqxn1"
     Nsrq2 = .Text(Nsr2, "[dbnum1]0") & "年" & Nsr6 & "月" & Nsr8 & "日"                                                             '农全写年2_"nqxn2"
     Nsxgz = GetYLDate(.Text(Date, "yyyy-mm-dd"), "sx")                                                                              '农属相干支年_"ntgdz"
     Jsr = Int((month(Date) + 2) / 3)                                                                                                '季度_"jd"
     Xsr = Weekday(Date, 2)                                                                                                          '星期_"xq"
     Zsr = IIf(Get周次 = 0, "放假中", Get周次)                                                                                        '周次_"zhc"
For i = 0 To UBound(arr)
  If CS = arr(i) Then GetDT = Choose(i + 1, Ysr1, Ysrj, Ysrs, Ysr2, Ysr3, Ysr4, Ysr5, Ysr6, Ysr7, Ysrq1, Ysrq2, Nsr1, Nsrj, Nsrs, Nsr2, Nsr3, Nsr4, Nsr5, Nsr6, Nsr7, Nsr8, Nsrq1, Nsrq2, Nsxgz, Jsr, Xsr, Zsr)
Next
End With
End Function

1、信息函数(1.1 GetInfoHWId 1.2 GetDT).rar

74.84 KB, 下载次数: 128

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-22 18:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 weiyingde 于 2018-2-22 21:22 编辑

2、统计函数
    对考试成绩进行分类统计。
Public Function FLTJ(rng As Range, qs As Byte, ge As Byte, bj As String, rg As Range, opt As String) '2.分类统计
n = 0: j = 0: sm = 0: g = 0
Arr = rng
Brr = rg
For i = 1 To UBound(Arr)
    If Mid(Arr(i, 1), qs, ge) = bj Then
       n = n + 1
       sm = sm + Brr(i, 1)
       Select Case opt
              Case "jg", "jgl"
                 If Brr(i, 1) >= 72 Then
                     j = j + 1
                 End If
              Case "gf", "gfl"
                 If Brr(i, 1) >= 96 Then
                     g = g + 1
                 End If
       End Select
    End If
Next
Select Case opt
       Case "rj"
            FLTJ = Application.Round(sm / n, 1)
       Case "jg"
            FLTJ = j
       Case "jgl"
            FLTJ = Format(Application.Round(j / n, 3), "0.0%")
       Case "gf"
            FLTJ = g
       Case "gfl"
            FLTJ = Format(Application.Round(g / n, 3), "0.0%")
End Select
End Function

也可以在vba中运用自定义函数批量生成数据。
如下
Sub 调用函数批量生成统计数据()
Dim rng As Range, rg As Range, qs As Byte, ge As Byte, bj As String, opt As String
Set rng = ActiveSheet.Range("A12:A136")
arr = Array("rj", "gf", "gfl", "jg", "jgl")
qs = 6
ge = 1
bj = 1
For x = 1 To 2
  bj = x
  For i = 1 To 3
    Set rg = ActiveSheet.Range("C12:C136").Offset(0, i - 1)
    For j = 0 To UBound(arr)
       opt = arr(j)
       ActiveSheet.Cells(6 * x + 5 + j, 8 + i) = FLTJ(rng, qs, ge, bj, rg, opt)
    Next
    Set rg = Nothing
  Next
Next

With ActiveSheet
    .Range("H10") = "一班情况统计"
    .Range("H16") = "二班情况统计"
    .Range("H10:K10").Merge
    .Range("H16:K16").Merge
  With Union(.Range("H10").MergeArea, .Range("H16").MergeArea)
      .HorizontalAlignment = xlCenter
      .VerticalAlignment = xlCenter
      .Font.ColorIndex = IIf(Int(Rnd * 10 + 1) = 2, 10, Int(Rnd * 10 + 1))
      .Font.Size = 16
      .Font.Name = Choose(Int(Rnd * 4) + 1, "黑体", "楷体", "华文新魏", "华文楷体")
      .Font.Bold = True
  End With
  With .Range("h10").Resize(12, 4)
       .Borders.LineStyle = xlContinuous
       .Borders.Weight = xlHairline
       .Borders.ColorIndex = 5
       .BorderAround xlDouble, xlMedium, xlColorIndexAutomatic
  End With
End With

End Sub


2、自定义函数之 统计函数.rar

36.12 KB, 下载次数: 100

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-2-23 21:53 | 显示全部楼层
Public Function GetSJmz(ByVal 姓氏 As String, ByVal 名字 As String, ByVal 性别 As String) '3.1随机函数,随机姓名,生成姓名(单复姓、单复名,分男女)
Dim sr As String, sr1 As String, sr2 As String, sr3 As String, I As Integer, ard, arf, arB1, arB2, arG1, arG2
dxg = "王,李,张,刘,陈,杨,黄,吴,赵,周,徐,孙,马,朱,胡,林,郭,何,高,罗,郑,梁,谢,宋,唐,许,邓,冯,韩,曹,曾,彭,萧,蔡,潘,田,董,袁,于,余,叶,蒋,杜,苏,魏,程," & _
      "吕,丁,沈,任,姚,卢,傅,钟,姜,崔,谭,廖,范,汪,陆,金,石,戴,贾,韦,夏,邱,方,侯,邹,熊,孟,秦,白,江,阎,薛,尹,段,雷,黎,史,龙,陶,贺,顾,毛,郝,龚,邵,万," & _
      "钱,严,赖,覃,洪,武,莫,孔,汤,向,常,温,康,施,文,牛,樊,葛,邢,安,齐,易,乔,伍,庞,颜,倪,庄,聂,章,鲁,岳,翟,殷,詹,申,欧,耿,关,兰,焦,俞,左,柳,甘,祝," & _
      "包,宁,尚,符,舒,阮,柯,纪,梅,童,凌,毕,单,季,裴,霍,涂,成,苗,谷,盛,曲,翁,冉,骆,蓝,路,游,辛,靳,管,柴,蒙,鲍,华,喻,祁,蒲,房,滕,屈,饶,解,牟,艾,尤," & _
      "阳,时,穆,农,司,卓,古,吉,缪,简,车,项,连,芦,麦,褚,娄,窦,戚,岑,景,党,宫,费,卜,冷,晏,席,卫,米,柏,宗,瞿,桂,全,佟,应,臧,闵,苟,邬,边,卞,姬,师,和," & _
      "仇,栾,隋,商,刁,沙,荣,巫,寇,桑,郎,甄,丛,仲,虞,敖,巩,明,佘,池,查,麻,苑,迟,邝,官,封,谈,匡,鞠,惠,荆,乐,冀,郁,胥,南,班,储,原,栗,燕,楚,鄢,劳,谌," & _
      "奚,皮,粟,冼,蔺,楼,盘,满,闻,位,厉,伊,仝,区,郜,海,阚,花,权,强,帅,屠,豆,朴,盖,练,廉,禹,井,祖,漆,巴,丰,支,卿,国,狄,平,计,索,宣,晋,相,初,门,云," & _
      "容,敬,来,扈,晁,芮,都,普,阙,浦,戈,伏,鹿,薄,邸,雍,辜,羊,阿,乌,母,裘,亓,修,邰,赫,杭,况,那,宿,鲜,印,逯,隆,茹,诸,战,慕,危,玉,银,亢,嵇,公,哈,湛," & _
      "宾,戎,勾,茅,利,於,呼,居,揭,干,但,尉,冶,斯,元,束,檀,衣,信,展,阴,昝,智,幸,奉,植,衡,富,尧,闭,由,暴,贝,贲,别,邴,步,苍,昌,巢,充,从,逮,东,钭,堵," & _
      "鄂,酆,凤,扶,弓,贡,广,盍,弘,红,后,滑,怀,桓,宦,汲,籍,蓟,暨,家,空,蒯,夔,历,郦,禄,糜,宓,乜,牧,能,钮,逄,蓬,濮,溥,秋,璩,却,融,山,韶,厍,慎,寿,殳," & _
      "双,水,松,通,隗,蔚,沃,毋,郗,习,咸,莘,须,荀,仰,养,羿,益,鱼,庾,越,宰,终,竺,訾" '单姓一共有486个
fxg = "欧阳,太史,端木,上官,司马,东方,独孤,南宫,万俟,闻人,夏侯,诸葛,尉迟,公羊,赫连,澹台,皇甫,宗政,濮阳,公冶,太叔,申屠,公孙,慕容," & _
      "仲孙,钟离,长孙,宇文,司徒,鲜于,司空,闾丘,子车,亓官,司寇,巫马,公西,颛孙,壤驷,公良,漆雕,乐正,宰父,谷梁,拓跋,夹谷,轩辕,令狐," & _
      "段干,百里,呼延,东郭,南门,羊舌,微生,公户,公玉,公仪,梁丘,公仲,公上,公门,公山,公坚,左丘,公伯,西门,公祖,第五,公乘,贯丘,公皙," & _
      "南荣,东里,东宫,仲长,子书,子桑,即墨,达奚,褚师,淳于,单于,徐离" '单姓一共有84个
mzB1 = "子,浩,俊,泽,博,思,海,振,宇,嘉,彦,梓,文,瑞,金,家,天,佳,清,云,立,志,宏,奕,铭,一,建,健,晨,卓,涵,哲,永,皓,润,林,昊,雨,智,景,韬,葆,保,硕,颂,琅," & _
       "恒,启,睿,玉,伟,学,圣,旭,瑾,弘,苑,骏,仁,义,礼,智,信,忠,孝,利,懿,隆,发,友,梁,维,克,士,树,泰,冠,腾,崇,扬,骁,炫,炳,宗,总,祖,璜,材,瑞,传,玲,,,,,,,"
mzB2 = "泽,宇,博,铭,浩,涵,杰,轩,瑞,峰,毅,涛,然,文,睿,清,楠,源,润,明,霖,宏,洋,哲,乐,钦,林,鑫,俊,潇,天,华,阳,皓,立,翔,贤,龙,航,旭,江,渊,瑜,君,成,锋,山,奇," & _
       "佑,涛,鹏,磊,辉,烨,煊,强,宸,超,骞,彬,诚,柏,熙,懿,彤,祺,豪,宸,瀚,远,驰,国,啸,果,岚,良,谦,刚,毅,军,东,健,世,广,海,波,贵,福,禄,胜,利,生,龙,祥,兴,兵," & _
       "斌,彬,武,翔,飞,順,昌,星,光,达,安,民,中,茂,进,坚,邦,豪,功,松,柏,善,厚,庆,磊,裕,哲,超,政,翰,鸣,朋,棟,启,伦,旭,焱,盛,琛,骏,钧,跃,捷,赏,彰,杨,骋,熙," & _
       "勋,逊,烁,烜,煜,煌,望,昶,昭,晖,晟,晔,赞,敬,翊,靖,誉,赫,颢,昱,昆,森,衡,瑱,全,锴,畅,典,鸿,能,坦,烁,帆,权,麟,帅,准,琦,榜,珅,鳌,奥,曙,裕,勤,珑,臻,,"
mzG1 = "思,佳,雪,梦,怡,雅,海,美,雨,子,钰,诗,金,嘉,涵,慧,婷,琳,若,敏,淑,凌,奕,楚,雯,清,文,梓,晨,丽,丹,佩,惠,月,玉,婉,晓,玲,倩,紫,洁,小,明,洋,婉,颖,芸,爱," & _
       "德,秀,端,桦,巧,芬,彩,春,斓,兰,蘭,爱,瑞,黛,蓓,丹,纯,毓,羽,康,艺,慈,璧,碧,锦,玫,佩,锦,诺,筱,嫣,茹,紫,婧,玥,昕,鸾,黛,冰,诗,依,嫦,涟,凝,红,醉,向,慕," & _
       "杏,含,歆,迎,觅,妍,倚,若,幽,寄,念,荷,潆,宜,伶,笑,逸,映,妙,尔,从,忆,书,孤,怀,惜,怜,,,,"
mzG2 = "涵,婷,慧,瑶,颖,清,月,雯,洁,岚,玲,丹,菲,媛,萍,琳,怡,玉,宁,娜,璇,云,珊,彤,佳,萱,雅,萌,欣,璐,琪,茹,梦,华,倩,君,茜,乐,如,秋,钰,静,敏,洋,宵,溪,云,媛," & _
       "莹,晶,芝,心,貞,蓉,英,卿,萍,娟,巧,珠,姝,翠,娥,芳,菊,凤,凰,梅,琳,莲,环,霞,香,莺,珍,莉,桂,娣,叶,璧,璐,娅,琦,琪,妍,珊,莎,姣,娴,颖,瑶,露,怡,婵,雁,蕾," & _
       "眉,媚,琴,蕊,薇,菁,苑,婕,馨,瑗,琰,聪,柔,筠,澜,悦,爽,滢,馥,凝,潇,霄,姬,影,妙,淼,婕,荣,萱,姣,娓,娉,禧,珂,琼,璇,晴,嫚,盈,袅,瑛,婧,靓,媄,昕,夏,仪,琴," & _
       "园,缘,萃,菲,莎,姿,湘,涵,汝,蔚,沁,蜜,然,茵,妹,馨,娣,姬,曦,韵,漪,绮,竹,枫,双,蝶,卉,菱,桃,蕊,芙,芍,霜,虹,琰,融,纨,蕾,霏,俐,润,烟,,,,"
srzh = "一,丞,恭,畅,丹,周,京,衷,雍,嬴,冠,诚,谊,谦,谨,博,贞,修,俊,儒,阳,陶,勤,洁,润,淳,清,淑,温,忻,怡,悦,愔,慕,慷,安,宏,容,庆,康,逊,道,寿,尊,挺,捷" & _
      "圣,坚,幸,培,壮,吉,志,哲,嘉,馨,懿,艺,芳,茂,英,荣,荟,莹,菁,著,萱,葩,蔼,薰,奖,尚,辉,赏,耀,名,君,知,和,善,屹,峰,崇,衍,得,德,彬,彰,扬,备,饶,孔" & _
      "孜,妍,妩,妙,姣,威,姝,佳,娇,娴,娟,娥,娓,婉,婷,媛,骁,骄,骋,杰,煦,熙,炫,炳,炯,烁,烜,烨,煜,煌,忠,恩,惠,慈,慧,礼,祖,祝,祥,祺,禄,福,玉,珂,珍,珊" & _
      "珠,望,琅,琼,琛,琳,瑞,瑜,瑰,璇,璜,璧,韬,本,材,盛,旭,旸,昉,景,晴,智,明,昶,昭,晏,晖,晟,晔,暄,曜,曦,曼,永,腾,贤,贺,贵,赐,赞,敏,敬,胜,朗,欢,欣" & _
      "毅,翊,靖,碧,睦,睿,盈,钦,铭,锐,锦,颖,穆,馥,皓,浩,袅,褒,葆,保,美,颂,颀,硕,颐,良,誉,赫,辰,雅,韵,瑛,斌,秉,昞,宸,锋,赋,颢,豪,昊,瑾,婧,竫,珺,丽" & _
      "靓,璘,璐,玫,媄,乾,茜,姗,舒,旺,玮,悟,禧,献,翔,昕,信,歆,瑶,尧,御,勇,庸,裕,钰,昱,朝,振,朕,箴,禛,佑,弘,竹,文,鑫"
ard = Split(dxg, ",")
arf = Split(fxg, ",")
arB1 = Split(mzB1, ",")
arB2 = Split(mzB2, ",")
arG1 = Split(mzG1, ",")
arG2 = Split(mzG2, ",")
Randomize
srd = Split(dxg, ",")(Int(Rnd * UBound(Split(dxg, ","))))
srf = Split(fxg, ",")(Int(Rnd * UBound(Split(fxg, ","))))
srB1 = Split(mzB1, ",")(Int(Rnd * UBound(Split(mzB1, ","))))
srB2 = Split(mzB2, ",")(Int(Rnd * UBound(Split(mzB2, ","))))
srG1 = Split(mzG1, ",")(Int(Rnd * UBound(Split(mzG1, ","))))
srG2 = Split(mzG2, ",")(Int(Rnd * UBound(Split(mzG2, ","))))
      Select Case 姓氏
             Case "dx"
                 sr1 = srd
             Case "fx"
                 sr1 = srf
             Case Else
                 sr1 = 姓氏
      End Select
      Select Case 名字
             Case "dm"
                  Select Case 性别
                         Case "bx": sr2 = srB2
                         Case "gx": sr2 = srG2
                         Case Else: sr2 = Split(srzh, ",")(Int(Rnd * UBound(Split(srzh, ","))))
                  End Select
              Case "fm"
                  Select Case 性别
                         Case "bx": sr2 = srB1 & srB2
                         Case "gx": sr2 = srB1 & srG2
                         Case Else
                             For I = 1 To 2
                                 sr = sr & Split(srzh, ",")(Int(Rnd * UBound(Split(srzh, ","))))
                             Next
                             sr2 = sr
                  End Select
       End Select
       GetSJmz = sr1 & sr2
End Function
Function GetSJsz(ByVal qs As Single, ByVal js As Single, ByVal ws As Byte)  '3.2随机数字(指定上限和下限)
       With Application.WorksheetFunction
       Randomize
          GetSJsz = .Round(Rnd * (js - qs) + qs, ws)
       End With
End Function
Function GetSJzf(ByVal tr As String, ByVal k As Byte)  '3.3随机字符(指定位数)

        srr6 = ""
        For I = 1 To 26
            Randomize
            srr = Chr((Int(16 + Rnd() * 38 + 160) * 256) + Int(94 * Rnd()) + 160)
            srr1 = srr1 & srr
        Next
        srr2 = "0123456789"
        srr3 = "abcdefghijklmnopqrstuvwxyz"
        srr4 = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        srr5 = srr5 & IIf(InStr(tr, "H") > 0, srr1, "")
        srr5 = srr5 & IIf(InStr(tr, "S") > 0, srr2, "")
        srr5 = srr5 & IIf(InStr(tr, "X") > 0, srr3, "")
        srr5 = srr5 & IIf(InStr(tr, "D") > 0, srr4, "")
        For I = 1 To k
            Randomize
            srr6 = srr6 & Mid(srr5, Int(Rnd * Len(srr5) + 1), 1)
        Next
            GetSJzf = srr6
End Function

3、随机函数(3.1 GetSJmz3.2 GetSJsz3.3GetSJzf).rar

93.22 KB, 下载次数: 132

TA的精华主题

TA的得分主题

发表于 2018-5-7 18:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
学习了。正好解决获得U盘序列号和盘符号
谢谢

TA的精华主题

TA的得分主题

发表于 2018-5-7 22:56 | 显示全部楼层
楼主,你好!
   根据你函数,我读取U盘物理序号,比较了仍未能实现。
   
With GetObject("winmgmts:\\.\root\cimv2")
    Set CoIts = .ExecQuery("Select * From Win32_USBHub")
    ids = Null
    For Each bj In CoIts
       If bj.DeviceID Like "*VID*" Then ids = ids & "," & bj.DeviceID 'ids = Split(bj.DeviceID, "\")
    Next
    getinfohwid = ids
End With

  上述方法只读到了U盘驱动器的物理序号,不是U盘的,我调换了U盘验证不成功

  请教该如何写?

请赐教

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-1 18:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
宝石山人 发表于 2018-5-7 22:56
楼主,你好!
   根据你函数,我读取U盘物理序号,比较了仍未能实现。
   

暂时还没有时间深究,等到放暑假了,有时间和心情,再来一看究竟。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-7 18:58 | 显示全部楼层
本帖最后由 weiyingde 于 2019-2-7 19:01 编辑
weiyingde 发表于 2018-2-22 16:57
Function GetInfoHWId(Optional ByVal k As String) As String '1.1信息函数 之软硬件信息
Dim Str As Str ...
说明:因为第二楼帖子有漏洞,本帖是对第二楼帖子的补充。
Public Function Get学期(N As Integer) '参数N为1,获取学期信息;参数为2,获取本学期周次或全年周次;参数为3,获取本学期和本学期周次的综合信息。
Dim rq1 As Date, rq2 As Date, rq3 As Date, rq4 As Date
Dim Y As Integer
Application.Volatile
On Error Resume Next
  If Year(Date) > Year(lunar(Format(Date, "yyyy-m-d"))) Then Y = 1
    rq1 = Format(solar(Year(Date) & "-1-17"), "yyyy-m-d")   '下学期正月十六开学
    rq2 = DateSerial(Year(Date) - Y, 7, 1)                     '下学期7月1日结束
    rq3 = DateSerial(Year(Date) - Y, 9, 1)                     '上学期9月1日开学
    rq4 = Format(solar(Year(Date) - Y & "-12-15"), "yyyy-m-d") '上学期腊月十五结束
  If Date >= rq1 And Date < rq2 Then
     Select Case N
            Case 1: Get学期 = "下学期"
            Case 2: Get学期 = Application.WorksheetFunction.RoundUp(DateDiff("d", rq1, Date) / 7, 0) + 1
            Case 3: Get学期 = "下学期第" & Excel.Application.WorksheetFunction.RoundUp(DateDiff("d", rq1, Date) / 7, 0) + 1 & "周(剩" & DateDiff("d", Date, rq2) & "天)"
     End Select
  End If
  If Date >= rq2 And Date < rq3 Then
     Select Case N
            Case 1: Get学期 = "暑假"
            Case 2: Get学期 = "假" & DateDiff("d", rq2, Date) & "天(剩" & DateDiff("d", Date, rq3) & "天)"
            Case 3: Get学期 = "【暑假】全年第" & Application.WorksheetFunction.WeekNum(Date) & "周"
     End Select
  End If
  If Date >= rq3 And Date < rq4 Then
     Select Case N
            Case 1: Get学期 = "上学期"
            Case 2: Get学期 = Application.WorksheetFunction.RoundUp(DateDiff("d", rq3, Date) / 7, 0) + 2
            Case 3: Get学期 = "上学期第" & Excel.Application.WorksheetFunction.RoundUp(DateDiff("d", rq3, Date) / 7, 0) + 2 & "周"
     End Select
  End If
  If Year(Date) > Year(lunar(Format(Date, "yyyy-m-d"))) Then
    If Date >= rq4 And Date < rq1 Then
     Select Case N
            Case 1: Get学期 = "寒假"
            Case 2: Get学期 = "假" & DateDiff("d", Format(solar(Year(Date) - 1 & "-12-15"), "yyyy-m-d"), Date) & "天(剩" & DateDiff("d", Date, rq1) & "天)"
            Case 3: Get学期 = "【寒假】全年第" & Application.WorksheetFunction.WeekNum(Date) & "周"
     End Select
   End If
  End If
    If Date < rq1 Then
     Select Case N
            Case 1: Get学期 = "寒假"
            Case 2: Get学期 = "假" & DateDiff("d", Format(solar(Year(Date) - 1 & "-12-15"), "yyyy-m-d"), Date) & "天(剩" & DateDiff("d", Date, rq1) & "天)"
            Case 3: Get学期 = "【寒假】全年第" & Application.WorksheetFunction.WeekNum(Date) & "周"
     End Select
    End If
  
End Function

TA的精华主题

TA的得分主题

发表于 2019-2-7 19:21 来自手机 | 显示全部楼层
自定义函数OPION老师做的非常好。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-2-7 21:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 weiyingde 于 2019-2-7 21:58 编辑
乐乐2006201505 发表于 2019-2-7 19:21
自定义函数OPION老师做的非常好。

谢谢提醒,有空学习学习。给个链接好吗?
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 12:18 , Processed in 0.046563 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表