Excel精英培训网

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

[已解决]用VBA提取隔1到隔12的值

[复制链接]
发表于 2014-6-28 21:14 | 显示全部楼层 |阅读模式
本帖最后由 superle! 于 2014-6-29 15:57 编辑

J列为数据源从J2开始到J很多行,黄色背景为VBA实现的填充
以J37为准,J列最下面有值的下一行为准,下面的值可能会增加或是减少。可能会增加到5千行,所以要考虑。
从AB2的值开始填充为隔1,取J列的J2,J4,J6,J8,J10,J12,J14的值。
AC2的值开始填充为隔2的值。取J列的J5,J9,J13的值。
注意的是,一定要从J33的值为准,往上取隔1到隔12的值,然后把取到的最后一个值填充到第二行1个。
执行VBA按钮时不清除黄色左右列的数据 。

最佳答案
2014-6-29 14:04
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, brr(1 To 60000, 1 To 12)
  4. arr = Range("j2:j" & Cells(Rows.Count, "j").End(xlUp).Row)
  5. m = 0
  6. For i = 1 To 12
  7.     s = UBound(arr) + 1: n = 0
  8.     Do Until s < 1
  9.         s = s - i - 1
  10.     Loop
  11.     Do Until s > UBound(arr)
  12.         s = s + i + 1
  13.         n = n + 1
  14.         brr(n, i) = arr(s, 1)
  15.     Loop
  16.     If n > m Then m = n
  17. Next
  18. [ab2:am5000].ClearContents  
  19. Range("ab2").Resize(m, 12) = brr
  20. End Sub
复制代码

工作簿12.rar

7.84 KB, 下载次数: 14

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2014-6-29 09:08 | 显示全部楼层
说明与示意结果前后矛盾,看不出模拟结果与j33有什么关系?
回复

使用道具 举报

 楼主| 发表于 2014-6-29 09:56 | 显示全部楼层
dsmch 发表于 2014-6-29 09:08
说明与示意结果前后矛盾,看不出模拟结果与j33有什么关系?

恩。J33是无关的,我写错了,是J37为准。
回复

使用道具 举报

发表于 2014-6-29 10:41 | 显示全部楼层
猜一下…………
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, brr(1 To 60000, 1 To 12)
  4. arr = Range("j2:j" & Cells(Rows.Count, "j").End(xlUp).Row)
  5. m = 0
  6. For i = 1 To 12
  7.     s = 0: n = 0
  8.     Do Until s > UBound(arr)
  9.         s = s + i + 1
  10.         n = n + 1
  11.         brr(n, i) = arr(s, 1)
  12.     Loop
  13.     If n > m Then m = n
  14. Next
  15. Range("ab2").Resize(m, 12) = brr
  16. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-29 10:47 | 显示全部楼层
dsmch 发表于 2014-6-29 10:41
猜一下…………

不对,如果J33加个值,以以J34为准的往上找。找到最上面一个然后第二行开始填充。
11.png

点评

建议完善模拟结果与说明  发表于 2014-6-29 10:53
回复

使用道具 举报

 楼主| 发表于 2014-6-29 11:06 | 显示全部楼层
dsmch 发表于 2014-6-29 10:41
猜一下…………

J37加个值,模拟的结果就是这样的。

工作簿123.rar

11.19 KB, 下载次数: 5

回复

使用道具 举报

发表于 2014-6-29 11:22 | 显示全部楼层
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, brr(1 To 60000, 1 To 12)
  4. arr = Range("j2:j" & Cells(Rows.Count, "j").End(xlUp).Row)
  5. m = 0
  6. For i = 1 To 12
  7.     s = UBound(arr) + 1: n = 0
  8.     Do Until s < 1
  9.         s = s - i - 1
  10.     Loop
  11.     Do Until s > UBound(arr)
  12.         s = s + i + 1
  13.         n = n + 1
  14.         brr(n, i) = arr(s, 1)
  15.     Loop
  16.     If n > m Then m = n
  17. Next
  18. Range("ab2").Resize(m, 12) = brr
  19. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2014-6-29 12:16 | 显示全部楼层
dsmch 发表于 2014-6-29 11:22

结果已经对了。加一个功能,就是AB:AM列填充执行时先清除这几个列数据。

点评

[ab2:am5000].ClearContents  发表于 2014-6-29 12:38
回复

使用道具 举报

 楼主| 发表于 2014-6-29 12:48 | 显示全部楼层
dsmch 发表于 2014-6-29 11:22

这倒难倒我了。[ab2:am5000].ClearContents   放哪里?给个完整的代码吧。
回复

使用道具 举报

发表于 2014-6-29 14:04 | 显示全部楼层    本楼为最佳答案   
  1. Sub Macro1()
  2. On Error Resume Next
  3. Dim arr, brr(1 To 60000, 1 To 12)
  4. arr = Range("j2:j" & Cells(Rows.Count, "j").End(xlUp).Row)
  5. m = 0
  6. For i = 1 To 12
  7.     s = UBound(arr) + 1: n = 0
  8.     Do Until s < 1
  9.         s = s - i - 1
  10.     Loop
  11.     Do Until s > UBound(arr)
  12.         s = s + i + 1
  13.         n = n + 1
  14.         brr(n, i) = arr(s, 1)
  15.     Loop
  16.     If n > m Then m = n
  17. Next
  18. [ab2:am5000].ClearContents  
  19. Range("ab2").Resize(m, 12) = brr
  20. End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 03:11 , Processed in 0.360866 second(s), 14 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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