Excel精英培训网

 找回密码
 注册

QQ登录

只需一步,快速开始

你正在寻找更好的Excel学习教程吗?Excel技巧80集+数据透视表+函数初中高全套+VBA80集,想学的这儿全都有
查看: 172|回复: 7

[已解决] 已知计算结果,反算参与计算的需求区域

[复制链接]
发表于 2019-12-6 10:38 | 显示全部楼层 |阅读模式
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
本帖最后由 courageous 于 2019-12-6 13:30 编辑

Capture.JPG


Sum(B2:B?)=5
Sum(B3:B?)=5
Sum(B4:B?)=5
Sum(B5:B?)=5
...

求问号? 请问可不可以使用公式或者函数来解决?

我使用了VBA双重FOR循环,数据有8000多行,点击计算总是死机。
补充:附上原版8千多行的原始数据,请高手帮忙改进,点击计算不要死机。
  1. Public Sub calc()
  2.     Dim i As Integer
  3.     Dim j As Integer
  4.     Dim sum1 As Single
  5.     Dim sum2 As Single
  6.     Dim Myconst As Single
  7.    
  8.     Myconst = Range("I2").Value

  9.     For i = 2 To 21
  10.    
  11.         sum1 = 0
  12.         For j = i To 21
  13.         sum1 = sum1 + Cells(j, 2)
  14.         sum2 = sum1 + Cells(j + 1, 2)
  15.         
  16.         If sum1 < Myconst And sum2 >= Myconst Then
  17.             Cells(i, 4) = Cells(i, 1) 'ê±&#188;&#228;T1
  18.             Cells(i, 5) = Cells(j, 1) 'ê±&#188;&#228;T2
  19.             Cells(i, 6) = sum1        'T1μ&#189;T2&#214;&#174;&#188;&#228;à&#219;&#188;ó&#214;μ
  20.             Exit For
  21.         End If
  22.         
  23.         Next
  24.    
  25.     Next
  26. End Sub
复制代码



RDE_EXCEL.zip

165.23 KB, 下载次数: 0

移动平均反算.zip

13.59 KB, 下载次数: 2

发表于 2019-12-6 11:43 | 显示全部楼层
你这种提问方式毛病很多:1、很难看懂你的问题到底是什么。先看你说明:
     时间1到时间2区间的累加值为5
     时间1到(时间2+1) 累加值大于5
     求时间2

     时间1 是什么?标题?你的标题是“时间1(秒)”,标题也要有引号;
     (时间2+1)是什么?我根本就没看到;
     累计值5我也不明白,不是看不懂数字,我是说表格里面的数字都有8-9位的小数,5=4.77106142?真的是不懂;

2、你的目的不清楚。
     如果是凑数,你只要把问题说清楚,剩下的应该由写代码的人自己来设计方法;
     我看到你设计了“时间1(秒)”、“时间2(秒)”、“时间1到时间2 排放累加(g)”的区间,这些区间很容易引起误解,我会看成是你要求必须要按照这个指指定格式和数据来做统计,判断是否存在符合条件的数据。很显然应该不是,因为这个区间并不完整,d列4、5、6对应的e列没有填写数据;
     那么最终的目的是什么?我能不能理解成:找出任意个数的数据和等于5?应该也不是,因为这个问题的难度非常大,只有精通算法的人才做的了;

3、你说到DEF多少行并不确定,因此我推测DEF这个区间仍然是要求的指定格式,只能按这个区间的要求来做统计判断;
     我很疑惑的是,如果D\E都是有指定数据的,那么统计F是并不难。但这种要求很怪异,好像你知道算法只是不会写公式或代码而已;

4、你说数据有8000多行,计算会卡死,上传数据样本就要多一些,起码也不能少于两三千行记录,几十上百是看不出效率来的;

尽管我分析了很多种状况,我最后真的没搞懂你的问题。

回复

使用道具 举报

 楼主| 发表于 2019-12-6 12:38 | 显示全部楼层
hfwufanhf2006 发表于 2019-12-6 11:43
你这种提问方式毛病很多:1、很难看懂你的问题到底是什么。先看你说明:
     时间1到时间2区间的累加值为 ...

不好意思,确实是我表述不清了。

A B列是原始数据,A表示时间序列,B是某一时间对应的瞬时值

Capture.JPG

1s时对应值时0.936
2s时对应值时3.835
3s时对应值时0.936
4s时对应值时0.085
...
20s时对应值时1.211

需求:
1s 到 Xs 的累加结果靠近5,再加上后面一秒的数据就大于5,求这个X。
2s 到 Ys 的累加结果靠近5,再加上后面一秒的数据就大于5,求这个Y。
。。。


15s到17s 是可以满足要求的最后一个
16S到 ?s的累加结果满足要求。----  无解
17S到 ?s的累加结果满足要求。----  无解
18S到 ?s的累加结果满足要求。----  无解
19S到 ?s的累加结果满足要求。----  无解
20S到 ?s的累加结果满足要求。----  无解
所以D16:F16是上表的最后一行。

帖子里面其中一个附件就是几千行的数据。

不知道这样解释是否能够清楚了。




回复

使用道具 举报

发表于 2019-12-6 12:46 | 显示全部楼层
courageous 发表于 2019-12-6 12:38
不好意思,确实是我表述不清了。

A B列是原始数据,A表示时间序列,B是某一时间对应的瞬时值

还没时间仔细看,下午我抽空再看下。
回复

使用道具 举报

发表于 2019-12-6 13:03 | 显示全部楼层
网络限制,无法下载附件,根据你的数据写了个代码,你试试吧。
  1. Sub test()
  2. Dim arrOri, arrRst, i&, j&, n#
  3. arrOri = [a1].CurrentRegion
  4. ReDim arrRst(1 To UBound(arrOri) - 1, 2)
  5. For i = 2 To UBound(arrOri)
  6.   For j = i To UBound(arrOri)
  7.     If n + arrOri(j, 2) > 5 Then
  8.       arrRst(i - 1, 0) = i - 1
  9.       arrRst(i - 1, 1) = j - 2
  10.       arrRst(i - 1, 2) = n
  11.       n = 0
  12.       Exit For
  13.     Else
  14.       n = n + arrOri(j, 2)
  15.     End If
  16.   Next j
  17. Next i
  18. [d2].Resize(UBound(arrRst), 3) = arrRst
  19. End Sub
复制代码
回复

使用道具 举报

发表于 2019-12-6 13:10 | 显示全部楼层
好像末行没有处理。
  1. Sub test()
  2. Dim arrOri, arrRst, i&, j&, n#
  3. arrOri = [a1].CurrentRegion
  4. ReDim arrRst(1 To UBound(arrOri) - 1, 2)
  5. For i = 2 To UBound(arrOri)
  6.   For j = i To UBound(arrOri)
  7.     If n + arrOri(j, 2) > 5 Then
  8.       arrRst(i - 1, 0) = i - 1
  9.       arrRst(i - 1, 1) = j - 2
  10.       arrRst(i - 1, 2) = n
  11.       n = 0
  12.       Exit For
  13.     Else
  14.       n = n + arrOri(j, 2)
  15.       If j = UBound(arrOri) Then
  16.         arrRst(i - 1, 0) = i - 1
  17.         arrRst(i - 1, 1) = j - 1
  18.         arrRst(i - 1, 2) = n
  19.         n = 0
  20.       End If
  21.     End If
  22.   Next j
  23. Next i
  24. [d2].Resize(UBound(arrRst), 3) = arrRst
  25. End Sub
复制代码

评分

参与人数 1学分 +2 收起 理由
courageous + 2 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2019-12-6 13:29 | 显示全部楼层
非常感谢。

这速度和我之前的那个就是一个天上的一个地上。几千行计算秒出结果。

实现了我的需求了,谢谢。

1.JPG
回复

使用道具 举报

 楼主| 发表于 2019-12-6 13:31 | 显示全部楼层
大灰狼1976 发表于 2019-12-6 13:10
好像末行没有处理。

谢谢。很好。
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2020-1-19 16:49 , Processed in 0.078000 second(s), 10 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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