ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求助VBA转自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-6-10 18:38 | 显示全部楼层 |阅读模式
本帖最后由 jonn 于 2018-6-10 19:28 编辑

VBA 代码已经通过测试成功,但我个人水平有限 无法编成自定义函数,请各位大神帮忙谢谢。
自定义函数的目标是从一个代码和日期 来判断数据库中 该代码的日前是否在日期1和日期2的范围内,详细请看附件。
我的思路:
1、取得代码A5在DATA表O列数据中出现次数
2、取得A5代码在DATA表O列出现第一个数字的行数
3、如果代码A5出现次数为0,则返回该表B列数值
如果出现次数不为0,则从DATA表第一个行数开始判断,判断到第一行加次数-1(16+4-1)为止,日期是否在日期1和日期2的范围内,如在范围内 则返回日期1的前1天日期,否则返回该表B列数值


测试代码如下: 代码中的MSGBOX N  理论上改为函数名称赋值即可(如 ALV = N) ,但由于里面的各个参数我没搞懂,一直没成功。

Sub ALV22()


Dim M As Variant, N As Variant, X1 As Range, X2 As Variant, X3 As Variant

M = "000018.SZ"  'A列数值赋值
N = 43133       'B列日期赋值
X2 = 17        '日期1所在列的列号
X3 = 18      '日期2所在列的列号

'判断列在 DATA数据表的O列,在下面代码中体现
'MsgBox Range("o:o").Column

Dim ii As Integer, ii1 As Integer
On Error Resume Next
ii = Application.WorksheetFunction.CountIf(Range("O:O"), M) '通过函数判断数量,如果数量为0 则退出
   If ii = 0 Then
   MsgBox N
   Exit Sub
   End If

ii1 = Application.WorksheetFunction.Match(M, Range("O:O"), 0)  '通过函数找到最接近的行数
'MsgBox ii1

If Application.WorksheetFunction.IsNumber(ii1) Then
If ii1 = 0 Then
   MsgBox N
   Exit Sub
End If

'日期范围内判断 取日期1前1天日期
For i = ii1 To ii1 + ii - 1
   If N >= Cells(i, X2) And N < Cells(i, X3) Then
     If Cells(i + 1, X3) <> Cells(i, X2) Then
       MsgBox Cells(i, X2) - 1
     Else
     MsgBox Cells(i + 1, X2) - 1
     End If
   Exit Sub
   End If
Next i

MsgBox N
End If
End Sub


'以下为自定义函数的命令框架
Function ALV(M As Variant, N As Variant, X1 As Range, X2 As Variant, X3 As Variant)
'五个参数  M为代码参数  N为日期参数  X1位代码 列数据范围   X2为数据库日期列数据范围  X3为数据库日期2 列数据范围

End Function


再次感谢各位大神出手帮助!!

自定义函数需求.rar (155.94 KB, 下载次数: 5)



TA的精华主题

TA的得分主题

发表于 2018-6-10 20:33 | 显示全部楼层
  1. Sub TEST()
  2.     Dim M As Variant, N As Variant, X1 As Range, X2 As Variant, X3 As Variant
  3.     M = "000018.SZ"  'A列数值赋值
  4.     N = 43133       'B列日期赋值
  5.     X2 = 17        '日期1所在列的列号
  6.     X3 = 18      '日期2所在列的列号
  7.     Rem  没发现X1 被用到 何处了
  8.     MsgBox ALV(M, N, X1, X2, X3)
  9. End Sub

  10. Function ALV(M As Variant, N As Variant, X1 As Range, X2 As Variant, X3 As Variant) As Variant
  11.    Rem 五个参数  M为代码参数  N为日期参数  X1位代码 列数据范围   X2为数据库日期列数据范围  X3为数据库日期2 列数据范围
  12.     Dim ii As Integer, ii1 As Integer
  13.     On Error Resume Next
  14.     ii = Application.WorksheetFunction.CountIf(Range("O:O"), M) '通过函数判断数量,如果数量为0 则退出
  15.     If ii = 0 Then
  16.         ALV = N
  17.         Exit Function
  18.     End If
  19.     ii1 = Application.WorksheetFunction.Match(M, Range("O:O"), 0)  '通过函数找到最接近的行数
  20.     If Application.WorksheetFunction.IsNumber(ii1) Then
  21.         If ii1 = 0 Then
  22.             ALV = N
  23.             Exit Function
  24.         End If

  25.         '日期范围内判断 取日期1前1天日期
  26.         For i = ii1 To ii1 + ii - 1
  27.             If N >= Cells(i, X2) And N < Cells(i, X3) Then
  28.                 If Cells(i + 1, X3) <> Cells(i, X2) Then
  29.                     ALV = Cells(i, X2) - 1
  30.                 Else
  31.                     ALV = Cells(i + 1, X2) - 1
  32.                 End If
  33.                 Exit Function
  34.             End If
  35.         Next i
  36.         ALV = N
  37.         Exit Function
  38.     End If
  39. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2018-6-10 20:34 | 显示全部楼层

TA的精华主题

TA的得分主题

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

重复内容 见下帖

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-10 20:52 | 显示全部楼层
opiona 发表于 2018-6-10 20:34
其他请参考:关于自定义函数的使用理解及函数集锦

http://club.excelhome.net/thread-1279693-1-1.html

就是 这一段代码 无法用现有工作表的N值 和参数X1 工作表中的单元格数据对比,现在的公式只是现有工作单元格数据对比。如何能取到参数中的工作表名称或index 将可以解决。
感谢opiona的帮助!!

'日期范围内判断 取日期1前1天日期
For i = ii1 To ii1 + ii - 1
'无法解决 与其他表的数值对比
   If N >= Cells(i, X2.Column) And N < Cells(i, X3.Column) Then
     If Cells(i + 1, X3.Column) <> Cells(i, X2.Column) Then
       ALV = Cells(i, X2.Column) - 1
     Else
     ALV = Cells(i + 1, X2.Column) - 1
     End If
   Exit Function
   End If
Next i

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-6-10 21:04 | 显示全部楼层
回帖审核有点慢----------

其他模块我都用函数测试 发现错误在于日期数据比较部分  现有的表达方式 只是当前工作表的数据对比,
无法实现 当前工作表的B列的值 和另外工作表DATA的值进行对比;

如果能解决获取参数中的工作表名称,那应该就可以。
感谢opiona 出手帮忙!!!!!谢谢

'日期范围内判断 取日期1前1天日期
For i = ii1 To ii1 + ii - 1
'无法解决 与其他表的数值对比
   If N >= Cells(i, X2.Column) And N < Cells(i, X3.Column) Then
     If Cells(i + 1, X3.Column) <> Cells(i, X2.Column) Then
       ALV = Cells(i, X2.Column) - 1
     Else
     ALV = Cells(i + 1, X2.Column) - 1
     End If
   Exit Function
   End If
Next i

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

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

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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