Excel精英培训网

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

[已解决]求助一个快速摄取的代码

[复制链接]
发表于 2021-3-25 19:27 | 显示全部楼层 |阅读模式
2学分
C9:G列数值是根据"开奖数据"A9:E列开始,到A列最后的非空单元格为止.
表"断断"的C9:G列是和"开奖数据"A9:E是完全一样的引用过来.
表"1"的C9:G列的最后一行是"开奖数据"A列最后非空开始,往上隔1行的数据引用过来的
表"2"的C9:G列的最后一行是"开奖数据"A列最后非空开始,往上隔2行的数据引用过来的
表"3"的C9:G列的最后一行是"开奖数据"A列最后非空开始,往上隔3行的数据引用过来的
.....
表"20"的C9:G列的最后一行是"开奖数据"A列最后非空开始,往上隔20行的数据引用过来的

以前用的是 设置的名称然后用VLOOKUP引用的.增加行数又大又麻烦.

大师看看这个能不能用数组或字典这种快速的办法返回?



最佳答案
2021-3-25 19:27
Sub test()
    Dim arrData, arrResult, arrTable, rng As Range
    Dim irow%, i%, j%, k%, n%, r%, max%
    With Sheet1
        Set rng = .Range("a:a").Find("*", , xlValues, , , xlPrevious)
        If Not rng Is Nothing Then irow = rng.Row
        If irow < 9 Then Exit Sub
        arrData = .Range("a9:e" & irow).Value
    End With
    max = UBound(arrData)
    Sheets("断断").Range("c9").Resize(max, UBound(arrData, 2)) = arrData
    For k = 1 To 3
        n = max \ (k + 1)
        If max Mod (k + 1) > 0 Then n = n + 1
        ReDim arrResult(1 To n, 1 To UBound(arrData, 2))
        For i = max To 1 Step -(k + 1)
            For j = 1 To UBound(arrData, 2)
                arrResult(n, j) = arrData(i, j)
            Next j
            n = n - 1
        Next i
        With Sheets(CStr(k))
             Range("c9:e" & Rows.Count).ClearContents
            .Range("c9").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
        End With
    Next k
End Sub


1.rar

955.63 KB, 下载次数: 5

最佳答案

查看完整内容

Sub test() Dim arrData, arrResult, arrTable, rng As Range Dim irow%, i%, j%, k%, n%, r%, max% With Sheet1 Set rng = .Range("a:a").Find("*", , xlValues, , , xlPrevious) If Not rng Is Nothing Then irow = rng.Row If irow < 9 Then Exit Sub arrData = .Range("a9:e" & irow).Value End With max = UBound(arrData) Sheets("断断").Range("c9").Re ...
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2021-3-25 19:27 | 显示全部楼层    本楼为最佳答案   
Sub test()
    Dim arrData, arrResult, arrTable, rng As Range
    Dim irow%, i%, j%, k%, n%, r%, max%
    With Sheet1
        Set rng = .Range("a:a").Find("*", , xlValues, , , xlPrevious)
        If Not rng Is Nothing Then irow = rng.Row
        If irow < 9 Then Exit Sub
        arrData = .Range("a9:e" & irow).Value
    End With
    max = UBound(arrData)
    Sheets("断断").Range("c9").Resize(max, UBound(arrData, 2)) = arrData
    For k = 1 To 3
        n = max \ (k + 1)
        If max Mod (k + 1) > 0 Then n = n + 1
        ReDim arrResult(1 To n, 1 To UBound(arrData, 2))
        For i = max To 1 Step -(k + 1)
            For j = 1 To UBound(arrData, 2)
                arrResult(n, j) = arrData(i, j)
            Next j
            n = n - 1
        Next i
        With Sheets(CStr(k))
             Range("c9:e" & Rows.Count).ClearContents
            .Range("c9").Resize(UBound(arrResult), UBound(arrResult, 2)) = arrResult
        End With
    Next k
End Sub


1.rar

928.86 KB, 下载次数: 6

回复

使用道具 举报

 楼主| 发表于 2021-3-29 23:10 | 显示全部楼层
shuidisyy 发表于 2021-3-29 20:40
Sub test()
    Dim arrData, arrResult, arrTable, rng As Range
    Dim irow%, i%, j%, k%, n%, r%, m ...

非常感谢大师.

这个,断断先返回,然后下面清空C9:E,这样断断的也清空了.
我在Sheets("断断").Range("c9").Resize(max, UBound(arrData, 2)) = arrData这句上面加一个清空.
然后在
With Sheets(CStr(k))
             Range("c9:e" & Rows.Count).ClearContents  这句前面加个点.
这样不会影响速度吧.
回复

使用道具 举报

发表于 2021-3-30 18:57 | 显示全部楼层
不会,我把点给漏了
回复

使用道具 举报

 楼主| 发表于 2021-3-31 13:29 | 显示全部楼层
shuidisyy 发表于 2021-3-30 18:57
不会,我把点给漏了

再次感谢老师!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-6 04:14 , Processed in 0.293648 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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