ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[讨论][求助]如何按条件连接字符串,并加入参数说明。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2006-3-23 16:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖已被收录到知识树中,索引项:自定义函数开发

Function LinkSamePro$(ByVal proin As Range, ByVal pro As Range, ByVal valueC As Range)
Dim rg As Range, x() As String, i As Integer
For Each rg In proin
If rg.Text = pro.Text Then
i = i + 1
ReDim Preserve x(1 To i)
x(i) = valueC(i, 1)
End If
Next
LinkSamePro = Join(x, "*")
End Function

C2=linksamepro(A$2:A$5,A2,B$2:B$5)

将B列数据复制到SHEET2,则:

C2=linksamepro(A$2:A$5,A2,Sheet2!B$2:B$5)

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-23 16:28 | 显示全部楼层
谢谢楼上的两位,下载后慢慢学习。

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-24 13:42 | 显示全部楼层

经过一夜的学习,发现如果能将pro的属性改为string(如sumif()的条件一样),但又不知道如何用VBA修改代码。这样的话应用范围就更大了,就象文本的sumif()了。

[此贴子已经被作者于2006-3-24 13:45:46编辑过]

TA的精华主题

TA的得分主题

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

Function LinkSamePro4$(ByVal proIN As Range, ByVal pro As String, ByVal proOfs As Range)
Dim rg As Range
Dim i%
i = 0
For Each rg In proIN
If rg.Text = pro Then
LinkSamePro4 = LinkSamePro4 & "*" & proOfs.Cells(1).Offset(i, 0).Text
End If
i = i + 1
Next rg
LinkSamePro4 = Mid$(LinkSamePro4, 2)
End Function

有疑问就继续吧.

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-24 14:56 | 显示全部楼层

谢谢,我还真不甘心,如果将产品换成时间,我试了一下公式好象不行。

我的用法是这样的

=linksamepro4($B$2:$B$6,">"&B5,$C$2:$C$6)

说明:将确认日期大于3/20/2006的交期字符串连起来,数据很多。 uP7XbFJA.zip (6.7 KB, 下载次数: 40) 再问,如何加上象EXCEL自带函数一样的说明,那就更棒了。
[此贴子已经被作者于2006-3-24 15:22:19编辑过]

TA的精华主题

TA的得分主题

发表于 2006-3-24 16:03 | 显示全部楼层
不仅比较方式复杂了,连数据类型也变复杂了,以后有时间再帮你补上.

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-24 16:13 | 显示全部楼层

谢谢QEE用。我已经很感激了,刚开始是想解决问题,后面的就是完善函数了,我也会继续学习,争取做一个文本的linkif(),哈哈!

TA的精华主题

TA的得分主题

发表于 2006-3-28 14:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
[LinkIf讨论稿]
Option Explicit
'****************************************************************
'* 函数名:LinkIf
'* 功能:条件连接字符串,类似于数值内置函数SumIf
'* 参数: rgCriteria 必选,计算条件的区域
'* Criteria 必选,连接条件
'* rgLink 可选,需要连接字符串所在区域,默认为rgCriteria
'* lnkString 可选,连接符,默认为直接连接
'* 错误: 计算出错时返回#N/A
'*****************************************************************
Function LinkIf$(ByVal rgCriteria As Range, ByVal Criteria As String, Optional ByVal rgLink As Range = Nothing, Optional ByVal lnkString As String = "")
On Error GoTo Errs
Dim i%, blLink As Boolean, rg As Range, hdo$, Crt As Variant
If rgLink Is Nothing Then Set rgLink = rgCriteria
If Criteria Like "=*" Then
hdo = "="
Criteria = Mid$(Criteria, 2)
ElseIf Criteria Like "<>*" Then
hdo = "<>"
Criteria = Mid$(Criteria, 3)
ElseIf Criteria Like "<=*" Then
hdo = "<="
Criteria = Mid$(Criteria, 3)
ElseIf Criteria Like ">=*" Then
hdo = ">="
Criteria = Mid$(Criteria, 3)
ElseIf Criteria Like ">*" Then
hdo = ">"
Criteria = Mid$(Criteria, 2)
ElseIf Criteria Like "<*" Then
hdo = "<"
Criteria = Mid$(Criteria, 2)
Else
hdo = "="
End If
i = 0
For Each rg In rgCriteria
If (IsNumeric(rg) Or IsDate(rg)) And IsNumeric(Crt) And TypeName(rg.Value) <> "String" Then
Crt = Val(Criteria)
Else
Crt = Criteria
End If
Select Case hdo
Case "="
blLink = (rg = Crt)
Case "<>"
blLink = (rg <> Crt)
Case ">="
blLink = (rg >= Crt)
Case "<="
blLink = (rg <= Crt)
Case ">"
blLink = (rg > Crt)
Case "<"
blLink = (rg < Crt)
End Select
If blLink Then LinkIf = LinkIf & lnkString & rgLink.Cells(1).Offset(i, 0).Text
i = i + 1
Next rg
LinkIf = Mid$(LinkIf, Len(lnkString) + 1)
Exit Function
Errs:
Err.Clear
LinkIf = "#N/A"
End Function

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-29 13:37 | 显示全部楼层

很好,我想再加一句:if rgCriteria.Rows.Count>1做一个判断就更好。

这样就可以按行和列引用了。 Function LinkIf$(ByVal rgCriteria As Range, ByVal Criteria As String, Optional ByVal rgLink As Range = Nothing, Optional ByVal lnkString As String = "") On Error GoTo Errs Dim I%, blLink As Boolean, rg As Range, hdo$, Crt As Variant If rgLink Is Nothing Then Set rgLink = rgCriteria If Criteria Like "=*" Then hdo = "=" Criteria = Mid$(Criteria, 2) ElseIf Criteria Like "<>*" Then hdo = "<>" Criteria = Mid$(Criteria, 3) ElseIf Criteria Like "<=*" Then hdo = "<=" Criteria = Mid$(Criteria, 3) ElseIf Criteria Like ">=*" Then hdo = ">=" Criteria = Mid$(Criteria, 3) ElseIf Criteria Like ">*" Then hdo = ">" Criteria = Mid$(Criteria, 2) ElseIf Criteria Like "<*" Then hdo = "<" Criteria = Mid$(Criteria, 2) Else hdo = "=" End If I = 0 If rgCriteria.Rows.Count > 1 Then For Each rg In rgCriteria If (IsNumeric(rg) Or IsDate(rg)) And IsNumeric(Crt) And TypeName(rg.Value) <> "String" Then Crt = Val(Criteria) Else Crt = Criteria End If Select Case hdo Case "=" blLink = (rg = Crt) Case "<>" blLink = (rg <> Crt) Case ">=" blLink = (rg >= Crt) Case "<=" blLink = (rg <= Crt) Case ">" blLink = (rg > Crt) Case "<" blLink = (rg < Crt) End Select If blLink Then LinkIf = LinkIf & lnkString & rgLink.Cells(1).Offset(I, 0).Text I = I + 1 Next rg Else For Each rg In rgCriteria If (IsNumeric(rg) Or IsDate(rg)) And IsNumeric(Crt) And TypeName(rg.Value) <> "String" Then Crt = Val(Criteria) Else Crt = Criteria End If Select Case hdo Case "=" blLink = (rg = Crt) Case "<>" blLink = (rg <> Crt) Case ">=" blLink = (rg >= Crt) Case "<=" blLink = (rg <= Crt) Case ">" blLink = (rg > Crt) Case "<" blLink = (rg < Crt) End Select If blLink Then LinkIf = LinkIf & lnkString & rgLink.Cells(1).Offset(0, I).Text I = I + 1 Next rg End If LinkIf = Mid$(LinkIf, Len(lnkString) + 1) Exit Function Errs: Err.Clear LinkIf = "#N/A" End Function

[此贴子已经被作者于2006-3-30 13:06:43编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-3-30 17:02 | 显示全部楼层
我还从其它资料中,找到了给自定义函数增加参数说明的方法与大家共享,请参考附件。 3xOUNNec.zip (13.34 KB, 下载次数: 149)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-24 15:18 , Processed in 0.037818 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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