ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[接龙...]部分程序代码注释,目录更新20051222

  [复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-17 17:01 | 显示全部楼层

56、自定义函数的可选参数+多重条件模糊引用。 QJcfIRMB.rar (8.54 KB, 下载次数: 150)

代码:

Function H_Find(rng As Range, rng1 As Range, x1, Optional x2, Optional x3, Optional x4, Optional x5) As String Dim s As String '可选参数,共4个,x1是比选的 Dim i%

Application.Volatile '每次单元格改动时,都会自动更新这个自定义函数的值 With rng If rng.Count = 65536 Then H_Find = "ERROR": Exit Function '不要用整列做查找范围 For i = 1 To .Count If InStr(1, .Cells(i), x1) = 0 Then GoTo line1 '假如不包含x1这个条件的话,就直接调整到ling1行,就执行next循环

If Not IsMissing(x2) Then '假如自定义函数中使用了可选参数,则 If InStr(1, .Cells(i), x2) = 0 Then GoTo line1 '查看这个参数是否在单元格里出现,如果没有出现则跳到line1行 End If

If Not IsMissing(x3) Then '同上 If InStr(1, .Cells(i), x3) = 0 Then GoTo line1 End If

If Not IsMissing(x4) Then '同上 If InStr(1, .Cells(i), x4) = 0 Then GoTo line1 End If

If Not IsMissing(x5) Then '同上 If InStr(1, .Cells(i), x5) = 0 Then GoTo line1 End If

s = s & IIf(Len(s) = 0, "", ",") & rng1.Cells(i) '最终没有跳转就说明全部5个条件都符合,则链接到一个字符串s里面 line1: Next End With

H_Find = s '给自定义函数赋值 End Function

TA的精华主题

TA的得分主题

发表于 2005-10-17 18:37 | 显示全部楼层

太好,谢谢楼主,让我学到了不少的东西,我会常到这里看看的。

TA的精华主题

TA的得分主题

发表于 2005-10-19 10:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

两位版主辛苦了。。

再谢。

TA的精华主题

TA的得分主题

发表于 2005-10-19 20:37 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-10-19 21:35 | 显示全部楼层
以下是引用Long_III在2005-8-10 13:38:54的发言:

to hzq56,用一个集合collection得到的,看代码h.Add arr1(i), CStr(arr1(i)) '用集合得到规格的不重复数据,由于集合里不能出现重复数据,在最前面加上On Error Resume Next,这样集合里就都不重复了,然后调用了工作表函数sumif,循环求得不重复值对应的合计值

不明白了,好象是On Error Resume Next这句不起作用

[接龙...]部分程序代码注释,供一些入门选手学习!

[接龙...]部分程序代码注释,供一些入门选手学习!

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-21 09:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

57、简单的公式设置。忘了以前是否写过,但是经常看到类似的问题,主要是循环的一个起始、中止的判断。问题为“去悼一个最大值,再求平均数”。 PNhYSpo0.rar (12.71 KB, 下载次数: 134)

,代码:

Private Sub CommandButton1_Click() '按条件设置公式 Dim i%, irow%, m% Dim arr, aa Dim s As String

aa = Timer '记录开始时间 Application.ScreenUpdating = False '关闭屏幕更新 irow = [d65536].End(xlUp).Row 'd列的最后一行 arr = Range("d3:d" & irow) '简单的数组,相对可以提速一点点,也可以不用数组,直接根据单元格做 m = 3 '起始位置 For i = 3 To irow '在所有行里做一个循环 If arr(i - 2, 1) = "A" Then '假设单元格里为A的话,就设置公式 s = "e" & m & ":e" & i - 1 '可以说是一个范围,从m(起始位置)到i-1(中止位置) Cells(i, "e") = "=(sum(" & s & ")-max(" & s & "))/(count(" & s & ")-1)" '这部分就要根据公式的设置来连接了 Cells(i, "e").Copy Cells(i, "e").Resize(1, 9) '把这个公式复制到它后面的9个单元格里 m = i + 1 '判断下一次的起始位置 End If Next Application.ScreenUpdating = True '恢复系统设置 MsgBox "一次搞定!耗时:=" & Format(Timer - aa, "0.00") & "秒" '计算程序运行的总时间 End Sub

TA的精华主题

TA的得分主题

发表于 2005-10-22 13:47 | 显示全部楼层
看了这些贴,才知道自己的EXCEL用的是多么的差啊! 全部收了.建议做个合集

TA的精华主题

TA的得分主题

发表于 2005-10-26 17:05 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-10-27 13:18 | 显示全部楼层

58、字典(dictionary)的应用。搜索了论坛,关于这个的介绍也很少,先前的一个例子http://club.excelhome.net/dispbb ... p;skin=0&page=1 40楼,让我意识到了它的功能的强大,故模仿做了一个简单例子,希望大家对它的应用有点了解。 3kBKAvkc.rar (13.56 KB, 下载次数: 178)

思路是,先把原始数据放到字典里,然后对要查找的数据在字典里查找,找到之后就赋值给新数组

Sub 按钮1_单击() Dim ds As Scripting.Dictionary '需要引用microsoft scripting runtime Dim irow%, irow1%, i%, k%, s Dim arr, arr1, Xarr()

Application.ScreenUpdating = False irow = [k65536].End(xlUp).Row 'K列赋值给数组arr arr = Range("k2:k" & irow) Set ds = New Scripting.Dictionary '建立一个新的字典,功能比collection集合更强大

On Error Resume Next '防止增加到字典里的数据有重复的 For i = 1 To UBound(arr) ds.Add Sort_Number(arr(i, 1)), i '调用自定义函数Sort_Number,用排序之后的值,增加进字典 Next Err.Clear On Error GoTo 0

irow1 = [l65536].End(xlUp).Row '对L列赋值给数组arr1 arr1 = Range("l2:l" & irow1)

For i = 1 To UBound(arr1) s = Sort_Number(arr1(i, 1)) '用排序之后的值查找 temp = "" temp = ds(s) '在字典中查找这个值 If temp <> "" Then '找到后,增加到新数组里 k = k + 1 ReDim Preserve Xarr(0, 1 To k) '定义了一个动态增加的数组 Xarr(0, k) = arr1(i, 1) End If Next Range("o").ClearContents '删除o列的数据 [o2].Resize(k, 1) = Application.WorksheetFunction.Transpose(Xarr) '给单元格赋值 Application.ScreenUpdating = True End Sub

链接贴:分享Microsoft Windows Script 技术对象之Dictionary对象说解http://www.officefans.net/cdb/vi ... id=hyo6Q9#pid376197

[此贴子已经被作者于2005-11-16 13:33:38编辑过]

TA的精华主题

TA的得分主题

发表于 2005-10-27 13:31 | 显示全部楼层
关于“dictionary”,Long_iii 等 GG们 讨论得热火朝天。先学习了。[em24][em23]
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-23 15:31 , Processed in 0.039714 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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