Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2271|回复: 8

[已解决]按条件查询临界值并进行计算

[复制链接]
发表于 2015-1-13 11:28 | 显示全部楼层 |阅读模式
本帖最后由 sure 于 2015-1-13 15:10 编辑

各位老师,我这有几组数据,要做如下操作:
1、在sheet1里面有10组数据值,第一行是数据编号1~10,共300行,首先要做的是在每组编号对应列的数据里面查找第一个满足i行的值>=50,i+1行的值<50且i>=13的行数 i 的值;
2、在找到这个 i 值之后,在sheet2里面找到对应编号所在列的第 i 行,m=(sheet2.cells(i,列号)+sheet2.cells(i+1,列号))/2,然后再把m值输出到sheet2.cells(303,列号);
3、sheet3就是sheet2的每组数据的每行减去对应列所在的303行的m值;
4、如果没有满足i>=50,i+1<50且i>=13的行数 i 的值,那么就让此行的m值等于前一列数据的m值,譬如编号为3的数据就没有符合条件的 i 值,那么在sheet2里面.cells(303,3)=.cells(303.2), sheet3里第3列就用sheet2的第3列减去这个m值。

附件里的sheet3的第一列数据是个样本,可以参照一下,了解我的程序的运算过程,谢谢!
最佳答案
2015-1-13 14:23
  1. Sub tt()
  2.     arr = Sheet1.[a1].CurrentRegion
  3.     brr = Sheet2.[a1].CurrentRegion
  4.     For j = 1 To UBound(arr, 2)
  5.         Debug.Print j
  6.         For i = 2 To UBound(arr) - 1
  7.              If arr(i, j) >= 50 And arr(i + 1, j) < 50 And i >= 13 Then Exit For
  8.         Next
  9.         If i < UBound(arr) Then m = (brr(i, j) + brr(i + 1, j)) / 2
  10.         For i = 2 To UBound(brr)
  11.             brr(i, j) = brr(i, j) - m
  12.         Next
  13.     Next
  14.     Sheet3.[a1].Resize(UBound(brr), UBound(brr, 2)) = brr
  15. End Sub
复制代码

data.rar

68.04 KB, 下载次数: 6

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2015-1-13 13:34 | 显示全部楼层
回复

使用道具 举报

发表于 2015-1-13 14:06 | 显示全部楼层
查找第一个满足i>=50,i+1<50且i>=13的行数 i 的值?
这个条件有点怪,看不懂
回复

使用道具 举报

发表于 2015-1-13 14:08 | 显示全部楼层
是不是这个意思,i是单元格的值,要找到第一个(i>=50)or(i<49 AND i>=13)所对应的行数 K 的值?
回复

使用道具 举报

 楼主| 发表于 2015-1-13 14:11 | 显示全部楼层
这样说吧,我只是想知道怎么去表述当for 循环查找完了仍没有找到对应的 i 值后,怎样去进行下一步的赋值操作:
For j = 1 To Lcol
    .Cells(1, j ).Value = Brr(1, j )
   
       For i = 2 To rnum
          If Arr(i, j) >= 50 And Arr(i + 1, j) < 50 And i >= 13 Then

            m = (Brr(i , j ) + Brr(i +1, j )) / 2
                        
            .Cells(2, j ).Resize(UBound(Brr) , 1).FormulaR1C1 = "=Time!RC-" & m
            .Cells(2, j ).Resize(UBound(Brr) , 1) = .Cells(2, j ).Resize(UBound(Brr) , 1).Value

            BaseWks2.Cells(rnum, j ).Value = m
            Exit For
                End If
            Next i         
    Next j
回复

使用道具 举报

 楼主| 发表于 2015-1-13 14:20 | 显示全部楼层
grf1973 发表于 2015-1-13 14:08
是不是这个意思,i是单元格的值,要找到第一个(i>=50)or(i=13)所对应的行数 K 的值?

是这个意思,就是第 i 行的值大于等于50,i+1行的值小于50,并且i 的行数必须大于13,我写错了,我编辑
回复

使用道具 举报

发表于 2015-1-13 14:23 | 显示全部楼层    本楼为最佳答案   
  1. Sub tt()
  2.     arr = Sheet1.[a1].CurrentRegion
  3.     brr = Sheet2.[a1].CurrentRegion
  4.     For j = 1 To UBound(arr, 2)
  5.         Debug.Print j
  6.         For i = 2 To UBound(arr) - 1
  7.              If arr(i, j) >= 50 And arr(i + 1, j) < 50 And i >= 13 Then Exit For
  8.         Next
  9.         If i < UBound(arr) Then m = (brr(i, j) + brr(i + 1, j)) / 2
  10.         For i = 2 To UBound(brr)
  11.             brr(i, j) = brr(i, j) - m
  12.         Next
  13.     Next
  14.     Sheet3.[a1].Resize(UBound(brr), UBound(brr, 2)) = brr
  15. End Sub
复制代码
回复

使用道具 举报

发表于 2015-1-13 14:26 | 显示全部楼层
看第9句,i < UBound(arr)表示找到符合条件的单元格,m取新值,否则m保持不变(上一列得出的m值)
回复

使用道具 举报

发表于 2015-1-13 14:28 | 显示全部楼层
可以少一个条件,i直接从13开始
  1. Sub tt()
  2.     arr = Sheet1.[a1].CurrentRegion
  3.     brr = Sheet2.[a1].CurrentRegion
  4.     For j = 1 To UBound(arr, 2)
  5.         For i = 13 To UBound(arr) - 1
  6.              If arr(i, j) >= 50 And arr(i + 1, j) < 50 Then Exit For
  7.         Next
  8.         If i < UBound(arr) Then m = (brr(i, j) + brr(i + 1, j)) / 2
  9.         For i = 2 To UBound(brr)
  10.             brr(i, j) = brr(i, j) - m
  11.         Next
  12.     Next
  13.     Sheet3.[a1].Resize(UBound(brr), UBound(brr, 2)) = brr
  14. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 05:47 , Processed in 0.446280 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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