ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 求数据间隔及连续

[复制链接]

TA的精华主题

TA的得分主题

发表于 2020-6-6 18:48 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
这个贴子有点时间了,很多要慢慢理一下,问:A列有的药B列也一定有吗?B列有的药C列也一定有吗?也就是说:A、B、C列的药全等只是顺序不一致?

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-6 19:21 | 显示全部楼层
excelvlookup 发表于 2020-6-6 18:48
这个贴子有点时间了,很多要慢慢理一下,问:A列有的药B列也一定有吗?B列有的药C列也一定有吗?也就是说: ...

不一定会有。
A列有的 BC列不一定会有。
B 列有的C列也不一定会有。

TA的精华主题

TA的得分主题

发表于 2020-6-6 22:06 | 显示全部楼层
附件中为什么洛索洛芬的“最大连续服用/天”(第4个计算值)是2,这个没清楚。在答案不完全正确前,不能给你代码!

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-7 07:49 | 显示全部楼层
q563262982 发表于 2020-5-24 20:48
小刀老师,非常感谢您的代码,但我发现有错误,主要出现在(最大间隔,上次连续间隔,当前连续间隔),由于 ...

'38楼附件,分6个小问题来处理,修改起来也方便

'[s3]应该为3。另T列有3处不同,你这规则不唯一,按我的理解分3种规则来处理的

'[a:c]列为源数据,其实列数可以不限的,自己修改,,,

Option Explicit

Sub test()
  Dim arr, brr, i, j, k, dic, cnt
  Set dic = CreateObject("scripting.dictionary")
  brr = Range("a2:c" & Cells(Rows.Count, "a").End(xlUp).Row + 1).Value
  ReDim arr(UBound(brr, 1), 1 To UBound(brr, 1))
  For j = 1 To UBound(brr, 2)
    For i = 1 To UBound(brr, 1) - 1
      If Not dic.exists(brr(i, j)) Then
        cnt = cnt + 1: dic(brr(i, j)) = cnt
        arr(0, cnt) = brr(i, j): arr(i, cnt) = brr(i, j)
      End If
      For k = 1 To UBound(brr, 2)
        If brr(i, k) = arr(0, dic(brr(i, j))) Then
          arr(i, dic(brr(i, j))) = brr(i, k)
          Exit For
        End If
      Next
    Next
  Next
  ReDim brr(1 To cnt, 1 To 1 + 6)
  For j = 1 To cnt
    brr(j, 1) = arr(0, j)
    Call qu1(arr, brr, j) '最大间隔/天
    Call qu2(arr, brr, j) '上次服用间隔/天
    Call qu3(arr, brr, j) '当前间隔/天
    Call qu4(arr, brr, j) '最大连续服用/天
    Call qu5(arr, brr, j) '上次连续服用间隔/次
    Call qu6(arr, brr, j) '当前连续服用间隔/次
  Next
  [o13].Resize(UBound(brr, 1), UBound(brr, 2)) = brr '对比用,自己修改输出位置
End Sub

Sub qu1(arr, brr, col)
  Dim i, j, p, n
  p = 1
  For i = 1 To UBound(arr, 1) - 1
    If Len(arr(i, col)) > 0 Or i = UBound(arr, 1) - 1 Then
      If i = UBound(arr, 1) - 1 And Len(arr(i, col)) = 0 Then
        If i - p + 1 > n And i - p + 1 > 1 Then n = i - p + 1
      Else
        If i - p > n And i - p > 1 Then n = i - p
        For j = i + 1 To UBound(arr, 1) - 1
          If Len(arr(j, col)) = 0 Then p = j: i = j: Exit For
        Next
      End If
    End If
  Next
  brr(col, 2) = n
End Sub

Function qu2(arr, brr, col)
  Dim i, j
  For i = UBound(arr, 1) - 1 To 1 Step -1
    If Len(arr(i, col)) Then
      For j = i - 1 To 1 Step -1
        If Len(arr(j, col)) Then
          If i - j > 1 Then brr(col, 3) = i - j - 1
          i = 1: Exit For
        End If
      Next
    End If
  Next
  If Len(brr(col, 3)) = 0 Then brr(col, 3) = 0
End Function

Function qu3(arr, brr, col)
  Dim i
  For i = UBound(arr, 1) - 1 To 1 Step -1
    If Len(arr(i, col)) Then brr(col, 4) = UBound(arr, 1) - i - 1: Exit For
  Next
End Function

Function qu4(arr, brr, col)
  Dim i, j, n
  For i = 1 To UBound(arr, 1)
    If Len(arr(i, col)) Then
      For j = i + 1 To UBound(arr, 1) - 1
        If Len(arr(j, col)) = 0 Then
          If j - i > 1 And j - i > n Then n = j - i
          i = j: Exit For
        End If
      Next
    End If
  Next
  If n > 0 Then brr(col, 5) = n Else brr(col, 5) = 0
End Function

Function qu5(arr, brr, col)
  Dim i, j, k, n
  For i = UBound(arr, 1) - 1 To 2 Step -1
    If Len(arr(i, col)) Then n = n + 1
    If Len(arr(i, col)) > 0 And Len(arr(i - 1, col)) Then
      n = 0
      For j = i - 1 To 1 Step -1
        If Len(arr(j + 1, col)) = 0 And Len(arr(j, col)) > 0 Then n = n + 1
        If Len(arr(j, col)) = 0 Then
          n = 0
          For k = j - 1 To 2 Step -1
            If Len(arr(k, col)) > 0 And Len(arr(k - 1, col)) > 0 Then: j = 0: i = 0: Exit For
            If Len(arr(k, col)) Then n = n + 1
          Next
          If k = 1 Then
            If Len(arr(k, col)) Then n = n + 1
            i = 0: Exit For
          End If
        End If
      Next
    End If
  Next
  If i = 1 And Len(arr(1, col)) > 0 Then n = n + 1
  brr(col, 6) = n
End Function

Function qu6(arr, brr, col)
  Dim i, j, n
  For i = UBound(arr, 1) - 1 To 2 Step -1
    If Len(arr(i, col)) > 0 And Len(arr(i - 1, col)) > 0 Then Exit For
    If Len(arr(i, col)) Then n = n + 1
  Next
  If i = 1 Then n = 0
  If n > 0 Then brr(col, 7) = n Else brr(col, 7) = 0
End Function

评分

3

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-7 08:06 | 显示全部楼层
与楼主所要求的绝大部分都一致了,按楼主给出示例,只有图示有颜色部分有出入,不知老师和楼主哪个的对。
异同处.JPG

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-7 13:04 | 显示全部楼层
一把小刀闯天下 发表于 2020-6-7 07:49
'38楼附件,分6个小问题来处理,修改起来也方便

'[s3]应该为3。另T列有3处不同,你这规则不唯一,按我 ...

经过测试,这个代码可以灵活变换运用!太厉害了太感谢了老师,

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-7 21:34 | 显示全部楼层
一把小刀闯天下 发表于 2020-6-7 07:49
'38楼附件,分6个小问题来处理,修改起来也方便

'[s3]应该为3。另T列有3处不同,你这规则不唯一,按我 ...

image.png


老师,这在模块运行,指定表后会报错,是我哪里没弄对吗?在原表里面运行正常!

TA的精华主题

TA的得分主题

发表于 2020-6-7 21:43 | 显示全部楼层
q563262982 发表于 2020-6-7 21:34
老师,这在模块运行,指定表后会报错,是我哪里没弄对吗?在原表里面运行正常!

在set dic=...  下面插入一行再试试

---------

sheets("用药收集表").select

-----------------------------------

如果再有问题可上附件,其实T列的规则到底是怎么样的倒是挺好奇的,,,

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-7 21:49 | 显示全部楼层
q563262982 发表于 2020-6-7 21:34
老师,这在模块运行,指定表后会报错,是我哪里没弄对吗?在原表里面运行正常!

对应行修改成3行更好点:

--------------------

  With Sheets("用药收集表")
    brr = .Range("a2:c" & .Cells(Rows.Count, "a").End(xlUp).Row + 1).Value
  End With

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-7 22:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一把小刀闯天下 发表于 2020-6-7 21:49
对应行修改成3行更好点:

--------------------

再次谢谢老师,T列的答案规则,经过核对,您的答案才是正确的!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-6-26 17:17 , Processed in 0.038053 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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