Excel精英培训网

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

[已解决]多个xlsx文件批量计算指数移动平均值

[复制链接]
发表于 2021-6-24 23:48 | 显示全部楼层 |阅读模式
3学分



请高手写个能处理多个xlsx文件计算指数移动平均值的宏,以每个文件的B列第一行开始,到这个文件
的B列的第十二行为第一个计算周期,一直计算到
B列最后一行,计算结果在C列第十二行开始显示。

我卡在了第3步 如附件中的图片


最佳答案
2021-6-24 23:48
beachum 发表于 2021-6-27 10:35
好的!
我发现问题所在,是前面的举例不准确的原因,
改为现在的附件。

Sub demo()
   Application.ScreenUpdating = False
   Path = ThisWorkbook.Path & "\"
   file = Dir(Path & "*.xlsx")
   While file <> ""
      Set wb = Workbooks.Open(Path & file)
      a = Range("a1:e" & [a1].End(4).Row)
      For i = 1 To UBound(a)
         v1 = IIf(i = 1, "B1", "C" & i - 1)
         v2 = IIf(i = 1, "B1", "D" & i - 1)
         a(i, 3) = "=2/(12+1)*B" & i & "+(1-2/(12+1))*" & v1
         a(i, 4) = "=2/(26+1)*B" & i & "+(1-2/(26+1))*" & v2
         a(i, 5) = "=C" & i & "-D" & i
      Next
      [a1].Resize(UBound(a), UBound(a, 2)) = a
      wb.Close 1
      file = Dir()
   Wend
   Application.ScreenUpdating = True
   MsgBox "ok"
End Sub

祝順心,南無阿彌陀佛!



屏幕截图 2021-06-24 231525 (2).png

新建文件夹.zip

158.6 KB, 下载次数: 8

最佳答案

查看完整内容

Sub demo() Application.ScreenUpdating = False Path = ThisWorkbook.Path & "\" file = Dir(Path & "*.xlsx") While file "" Set wb = Workbooks.Open(Path & file) a = Range("a1:e" & [a1].End(4).Row) For i = 1 To UBound(a) v1 = IIf(i = 1, "B1", "C" & i - 1) v2 = IIf(i = 1, "B1", "D" & i - 1) a(i, 3) = "=2/(12+1)*B" & i & "+(1-2/(12+1))* ...
发表于 2021-6-24 23:48 | 显示全部楼层    本楼为最佳答案   
beachum 发表于 2021-6-27 10:35
好的!
我发现问题所在,是前面的举例不准确的原因,
改为现在的附件。

Sub demo()
   Application.ScreenUpdating = False
   Path = ThisWorkbook.Path & "\"
   file = Dir(Path & "*.xlsx")
   While file <> ""
      Set wb = Workbooks.Open(Path & file)
      a = Range("a1:e" & [a1].End(4).Row)
      For i = 1 To UBound(a)
         v1 = IIf(i = 1, "B1", "C" & i - 1)
         v2 = IIf(i = 1, "B1", "D" & i - 1)
         a(i, 3) = "=2/(12+1)*B" & i & "+(1-2/(12+1))*" & v1
         a(i, 4) = "=2/(26+1)*B" & i & "+(1-2/(26+1))*" & v2
         a(i, 5) = "=C" & i & "-D" & i
      Next
      [a1].Resize(UBound(a), UBound(a, 2)) = a
      wb.Close 1
      file = Dir()
   Wend
   Application.ScreenUpdating = True
   MsgBox "ok"
End Sub

祝順心,南無阿彌陀佛!



demo.rar

14.08 KB, 下载次数: 7

评分

参与人数 1学分 +2 收起 理由
beachum + 2 学习了

查看全部评分

回复

使用道具 举报

发表于 2021-6-25 01:02 | 显示全部楼层
您好,您拿 SH#600004.xlsx 做舉例
在 C 列用公式模擬一下正確答案喔!

回复

使用道具 举报

 楼主| 发表于 2021-6-27 10:35 | 显示全部楼层
cutecpu 发表于 2021-6-25 01:02
您好,您拿 SH#600004.xlsx 做舉例
在 C 列用公式模擬一下正確答案喔!

好的!
我发现问题所在,是前面的举例不准确的原因,
改为现在的附件。




单元格C1=2/(12+1)*B1+(1-2/(12+1))*B1
单元格C2=2/(12+1)*B2+(1-2/(12+1))*C1
单元格C3=2/(12+1)*B3+(1-2/(12+1))*C2
单元格C4=2/(12+1)*B4+(1-2/(12+1))*C3
单元格C5=2/(12+1)*B5+(1-2/(12+1))*C4
单元格C2开始,就这样一直循环到B列最后
一个有数据的单元。


单元格D1=2/(26+1)*B1+(1-2/(26+1))*B1
单元格D2=2/(26+1)*B2+(1-2/(26+1))*D1
单元格D3=2/(26+1)*B3+(1-2/(26+1))*D2
单元格D4=2/(26+1)*B4+(1-2/(26+1))*D3
单元格D5=2/(26+1)*B5+(1-2/(26+1))*D4
单元格D2开始,就这样一直循环到B列最后
一个有数据的单元。


单元格E1=C1-D1
单元格E2=C2-D2
单元格E3=C3-D3
单元格E4=C4-D4
单元格E5=C5-D5
单元格E1开始,就这样一直循环到C列和D列
最后一个有数据的单元。

SH#688819.zip

17.57 KB, 下载次数: 5

回复

使用道具 举报

 楼主| 发表于 2021-6-27 15:30 | 显示全部楼层
cutecpu 发表于 2021-6-24 23:48
Sub demo()
   Application.ScreenUpdating = False
   Path = ThisWorkbook.Path & "\"

大神啊,非常感谢您的帮助!

评分

参与人数 1学分 +2 收起 理由
cutecpu + 2 不客气。祝顺心,南无阿弥陀佛!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2021-7-4 15:24 | 显示全部楼层
本帖最后由 beachum 于 2021-7-5 10:57 编辑
cutecpu 发表于 2021-6-24 23:48
Sub demo()
   Application.ScreenUpdating = False
   Path = ThisWorkbook.Path & "\"

您好!
我将您写的代码改过后,改后总有问题,
请您帮我看看,该怎么改?

单元格I1=(H1-H1)/H1*100
单元格I2=(H2-H1)/H1*100
单元格I3=(H3-H2)/H2*100
单元格I4=(H4-H3)/H3*100
单元格I5=(H5-H4)/H4*100
单元格I6=(H6-H5)/H5*100
单元格I7=(H7-H6)/H6*100
单元格I8=(H8-H7)/H7*100

单元格H2开始,就这样一直循环到H列最后
一个有数据的单元。


除去红色的代码后,计算结果都正确。

Sub demo()
   Application.ScreenUpdating = False
   Path = ThisWorkbook.Path & "\"
   file = Dir(Path & "*.xlsx")
   While file <> ""
      Set wb = Workbooks.Open(Path & file)
      a = Range("a1:i" & [a1].End(4).Row)
      For i = 1 To UBound(a)
         v1 = IIf(i = 1, "B1", "C" & i - 1)
         v2 = IIf(i = 1, "B1", "D" & i - 1)
         v3 = IIf(i = 1, "E1", "F" & i - 1)
         v4 = IIf(i = 1, "C1", "G" & i - 1)
         v5 = IIf(i = 1, "G1", "H" & i - 1)
         v6 = IIf(i = 1, "H1", "I" & i - 1)
         a(i, 3) = "=2/(12+1)*B" & i & "+(1-2/(12+1))*" & v1
         a(i, 4) = "=2/(26+1)*B" & i & "+(1-2/(26+1))*" & v2
         a(i, 5) = "=C" & i & "-D" & i
         a(i, 6) = "=2/(9+1)*E" & i & "+(1-2/(9+1))*" & v3
         a(i, 7) = "=2/(12+1)*C" & i & "+(1-2/(12+1))*" & v4
         a(i, 8) = "=2/(12+1)*G" & i & "+(1-2/(12+1))*" & v5
         a(i, 9) = "=H" & i & "-H" & i & "/H*100" & v6
      Next
      [a1].Resize(UBound(a), UBound(a, 2)) = a
      wb.Close 1
      file = Dir()
   Wend
   Application.ScreenUpdating = True
   MsgBox "ok"
End Sub

SH#688819.zip

17.36 KB, 下载次数: 1

回复

使用道具 举报

发表于 2021-7-4 17:57 | 显示全部楼层
beachum 发表于 2021-7-4 15:24
您好!
我将您写的代码改过后,改后总有问题,
请您帮我看看,该怎么改?

1. 您附件裡的 SH#688819.xlsx 只有 A 、B 兩列
2. 下次 .xlsm 也要附上喔,我可以直接開啟代碼
log.png
回复

使用道具 举报

 楼主| 发表于 2021-7-5 10:19 | 显示全部楼层
cutecpu 发表于 2021-7-4 17:57
1. 您附件裡的 SH#688819.xlsx 只有 A 、B 兩列
2. 下次 .xlsm 也要附上喔,我可以直接開啟代碼

好的!

EMA扩展.zip

112.1 KB, 下载次数: 2

回复

使用道具 举报

发表于 2021-7-5 12:49 | 显示全部楼层

您的 2 个.xlsx 都只有 A、B 两列
代码却用到 C、D、F、G、H (如图)
所以我不知道要怎么帮您
log.png
回复

使用道具 举报

 楼主| 发表于 2021-7-5 13:44 | 显示全部楼层
本帖最后由 beachum 于 2021-7-5 16:04 编辑
cutecpu 发表于 2021-7-5 12:49
您的 2 个.xlsx 都只有 A、B 两列
代码却用到 C、D、F、G、H (如图)
所以我不知道要怎么帮您

非常抱歉!
一直没理解到您需要的是,已经处理到H列的xlsx文件。

因为我刚接触Excel和VBA才一个多月,所以很多问题理解不够透彻。
谢谢您耐心的帮助!




EMA扩展.zip

853.41 KB, 下载次数: 3

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 05:24 , Processed in 0.506644 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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