Excel精英培训网

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

[已解决]100多年的逐日数据求月平均和月求和

[复制链接]
发表于 2014-4-2 06:44 | 显示全部楼层 |阅读模式
如附近是我现在有1893-2013年的逐日最高和最低气温、降水数据,想把相应的逐月平均气温和逐月降水量算出来。手工算效率太低了,而且还有别的站点。请教高手如何用VBA程序来算,不胜感激!
最佳答案
2014-4-2 09:04
1. 首先需要把1900年以前的日期格式转换过来,
在E2输入以下公式,下拉到1900年以前,
复制、粘贴数值到A列对应位置;
=SUBSTITUTE(RIGHT(A2,4)&"-"&LEFT(A2,LEN(A2)-5),"/","-")
2. 1900日期格式转换(方法同上)
=YEAR(A2558)&"-"&MONTH(A2558)&"-"&DAY(A2558)
3. F列的时间格式统一起来,
在F2输入以下公式、下拉;
=1893+INT((ROW()-2)/12)&"-"&MOD((ROW()-2),12)+1
4. 在G2单元格输入以下公式,横拉、下拉;
=SUMIF($A:$A,$F2&"-*",B:B)/COUNTIF($A:$A,$F2&"-*")

Daily to monthly-San Ant.rar

490.54 KB, 下载次数: 37

发表于 2014-4-2 07:25 | 显示全部楼层
用字典可以解决,你需要在附件中更加详细地举例说明数据特点及计算要求,最好模拟一些结果。

评分

参与人数 1 +1 收起 理由
CedarRidge + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2014-4-2 09:04 | 显示全部楼层    本楼为最佳答案   
1. 首先需要把1900年以前的日期格式转换过来,
在E2输入以下公式,下拉到1900年以前,
复制、粘贴数值到A列对应位置;
=SUBSTITUTE(RIGHT(A2,4)&"-"&LEFT(A2,LEN(A2)-5),"/","-")
2. 1900日期格式转换(方法同上)
=YEAR(A2558)&"-"&MONTH(A2558)&"-"&DAY(A2558)
3. F列的时间格式统一起来,
在F2输入以下公式、下拉;
=1893+INT((ROW()-2)/12)&"-"&MOD((ROW()-2),12)+1
4. 在G2单元格输入以下公式,横拉、下拉;
=SUMIF($A:$A,$F2&"-*",B:B)/COUNTIF($A:$A,$F2&"-*")

评分

参与人数 2 +2 收起 理由
qinyuelang + 1 很给力!
CedarRidge + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-4-2 10:29 | 显示全部楼层
凑个热闹。
  1. Sub tt()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     With Sheet1
  4.         r = .Cells(.Rows.Count, 1).End(3).Row
  5.         arr = .Range("a1:d" & r)
  6.     End With
  7.     ReDim brr(1 To UBound(arr), 1 To 5)
  8.     For i = 2 To r
  9.         xyear = Year(arr(i, 1)): xmonth = Month(arr(i, 1))
  10.         xkey = xyear & "-" & xmonth
  11.         If Not d.exists(xkey) Then
  12.             k = k + 1
  13.             d(xkey) = k
  14.             brr(k, 1) = xkey
  15.         End If
  16.         p = d(xkey)
  17.         brr(p, 2) = brr(p, 2) + arr(i, 2)
  18.         brr(p, 3) = brr(p, 2) + arr(i, 3)
  19.         brr(p, 4) = brr(p, 4) + arr(i, 4)
  20.         brr(p, 5) = brr(p, 5) + 1         '当月统计天数,用于算平均数
  21.     Next
  22.     For i = 1 To k
  23.         If brr(i, 5) > 0 Then
  24.             brr(i, 2) = brr(i, 2) / brr(i, 5)
  25.             brr(i, 3) = brr(i, 3) / brr(i, 5)
  26.             brr(i, 4) = brr(i, 4) / brr(i, 5)
  27.         End If
  28.     Next
  29.     With Sheet2
  30.         .[f:j].Clear
  31.         .[f1].Resize(1, 5) = Array("Month", "Tmax(C)", "Tmin(C)", "Rainfall (cm)", "Days")
  32.         .[f2].Resize(k, 5) = brr
  33.         .Activate
  34.     End With
  35. End Sub
复制代码

评分

参与人数 1 +1 收起 理由
CedarRidge + 1 很给力!

查看全部评分

回复

使用道具 举报

发表于 2014-4-2 10:32 | 显示全部楼层
请看附件。

Daily to monthly-San Ant.rar

588.95 KB, 下载次数: 34

评分

参与人数 1 +1 收起 理由
CedarRidge + 1 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2014-4-2 10:36 | 显示全部楼层
非常感谢啊。

我把逐月降水求和的那一列的”/COUNTIF($A:$A,$F2&"-*")“去掉了,不象前面两个求平均。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 12:50 , Processed in 0.318784 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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