Excel精英培训网

 找回密码
 注册
查看: 4284|回复: 16

[习题] 【VBA字典数组201301班】课前热身习题一

[复制链接]
发表于 2013-10-15 18:36 | 显示全部楼层 |阅读模式
本帖最后由 sliang28 于 2013-10-17 11:09 编辑

字典班的兄弟姐妹们:
饭都吃饱了吧!
作道题帮助消化消化……
快来下载附件吧,惊喜多多{:3912:}

在我电脑上测试在0.2秒内完成的,惊喜多多……

烟花的BB发不出去,你们快来拿吧{:2312:}

Sub sliang28()
    Dim arr, brr, i%, j%, x%, n%
    t = Timer
    arr = Sheets("数据源").Range("A1:JD3977")
    ReDim brr(10 To UBound(arr), 1 To 7) As String
    n = 10
    For j = 7 To UBound(arr, 2)
        For i = n To UBound(arr)
            If i = n Then
                For x = 1 To 4
                    brr(i, x) = arr(x + 2, j)
                Next
            End If
            If Len(arr(i, j)) = 0 Then Exit For
            brr(i, 5) = arr(i, 2)
            brr(i, 6) = arr(i, 5)
            brr(i, 7) = arr(i, j)
        Next
        n = i
    Next
    With Sheets("结果")
        .Range("A1:G3977").ClearContents
        '.Range("A1:G3978") = ""
        .Range("A2").Resize(i - 10, 7) = brr
    End With
    MsgBox Timer - t
End Sub

热身题之格式转换.zip

478.03 KB, 下载次数: 238

评分

参与人数 6 +56 金币 +20 收起 理由
Sellby + 3 很给力!
培训部招生办 + 20 + 20 很给力!
木牙水 + 3 很给力!
CheryBTL + 18 很给力!
jio1ye + 3 关键是我连题意都要琢磨半天。哈

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-10-15 18:47 | 显示全部楼层
我还想挑战一下,不是这个级别人士啊。╮(╯▽╰)╭。

点评

做吧!论坛的人都是一家人  发表于 2013-10-15 18:54
回复

使用道具 举报

发表于 2013-10-15 21:15 | 显示全部楼层
先来个没有技术含量的,纯粹是一个个放进去的:
  1. Sub CheryBTL()
  2.     Dim i As Integer, j As Integer, Rnum As Integer
  3.     Dim ar, re
  4.     Rnum = Sheets("数据源").[A65536].End(3).Row
  5.     ar = Sheets("数据源").Range("A1:JD" & Rnum)
  6.     ReDim re(1 To Rnum, 1 To 7)
  7.     For j = 7 To UBound(ar, 2)
  8.         For i = 10 To UBound(ar)
  9.             If ar(i, j) = 1 Then
  10.                 If ar(i - 1, j) = 0 Then
  11.                     re(i - 8, 1) = ar(3, j): re(i - 8, 2) = ar(4, j): re(i - 8, 3) = ar(5, j): re(i - 8, 4) = ar(6, j)
  12.                 End If
  13.                 re(i - 8, 5) = ar(i, 2)
  14.                 re(i - 8, 6) = ar(i, 5)
  15.                 re(i - 8, 7) = 1
  16.             End If
  17.         Next i
  18.     Next j
  19.     Sheets("结果").[a1].Resize(Rnum, 7) = re
  20. End Sub
复制代码

点评

0.26  发表于 2013-10-16 12:08

评分

参与人数 2 +10 金币 +15 收起 理由
培训部招生办 + 5 + 5 赞一个!
sliang28 + 5 + 10 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-10-15 21:40 | 显示全部楼层
本帖最后由 CheryBTL 于 2013-10-16 07:58 编辑

对同一个表时,再增加一个变量,想着会节省时间,但运行时没发现有变化,
将数组re,redim为string型变量,时间立马就降下来了,在台式电脑上运行为0.18s左右:
  1. Sub CheryBTL1() '仅对一个源数据表
  2.     Dim i As Integer, j As Integer, Rnum As Integer, t As Single, temp As Integer
  3.     Dim ar, re
  4.     t = Timer
  5.     Rnum = Sheets("数据源").[A65536].End(3).Row
  6.     ar = Sheets("数据源").Range("A1:JD" & Rnum)
  7.     ReDim re(1 To Rnum, 1 To 7) as String
  8.     For j = 7 To UBound(ar, 2)
  9.         For i = 10 To UBound(ar)
  10.             If ar(i, j) = 1 Then
  11.                 temp = i - 8
  12.                 If ar(i - 1, j) = 0 Then
  13.                     re(temp, 1) = ar(3, j): re(temp, 2) = ar(4, j): re(temp, 3) = ar(5, j): re(temp, 4) = ar(6, j)
  14.                 End If
  15.                 re(temp, 5) = ar(i, 2)
  16.                 re(temp, 6) = ar(i, 5)
  17.                 re(temp, 7) = 1
  18.             End If
  19.         Next i
  20.     Next j
  21.     Sheets("结果").[a1].Resize(Rnum, 7) = re
  22.     MsgBox Timer - t
  23. End Sub
复制代码
多表时,增加一个工作表循环:
  1. Sub CheryBTL2_1() '对多表时
  2.     Dim i As Integer, j As Integer, Rnum As Integer, m As Long
  3.     Dim ar, re(1 To 100000, 1 To 7) as String
  4.     Dim sht As Worksheet
  5.     t = Timer
  6.     m = 1
  7.     For Each sht In Worksheets
  8.         If sht.Name <> "结果" Then
  9.             Rnum = sht.[A65536].End(3).Row
  10.             ar = sht.Range("A1:JD" & Rnum)
  11.             For j = 7 To UBound(ar, 2)
  12.                 For i = 10 To UBound(ar)
  13.                     If ar(i, j) = 1 Then
  14.                         m = m + 1
  15.                         If ar(i - 1, j) = 0 Then
  16.                             re(m, 1) = ar(3, j): re(m, 2) = ar(4, j): re(m, 3) = ar(5, j): re(m, 4) = ar(6, j)
  17.                         End If
  18.                         re(m, 5) = ar(i, 2)
  19.                         re(m, 6) = ar(i, 5)
  20.                         re(m, 7) = 1
  21.                     End If
  22.                 Next i
  23.             Next j
  24.         End If
  25.     Next
  26.     Sheets("结果").[a1].Resize(100000, 7) = re
  27.     MsgBox Timer - t
  28. End Sub
复制代码

点评

哦,原来你设置的是VARIANT的非数组变量 .定义数组就不行了.  发表于 2013-10-24 16:43
REDIM还可以设置类型?学到了.  发表于 2013-10-24 16:41
0.18  发表于 2013-10-16 12:09

评分

参与人数 2 +10 金币 +15 收起 理由
培训部招生办 + 5 + 5 赞一个!
sliang28 + 5 + 10 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-10-15 23:25 | 显示全部楼层
  1. Option Explicit

  2. Sub 转换数据()
  3.     Dim arr, brr, iend%, drr(), k%, m%, n As Boolean
  4.     Dim t: t = Timer
  5.     arr = Range("g3:jd6")
  6.     iend = Range("e" & Cells.Rows.Count).End(xlUp).Row
  7.     brr = Range("b10:jd" & iend)
  8.     ReDim drr(1 To UBound(brr), 1 To UBound(arr) + 3)
  9.     For k = 1 To UBound(brr)
  10.         If brr(k, 6 + m) = "" And n = True Then m = m + 1: n = False
  11.         If n = False Then
  12.             If brr(k, 6 + m) = 1 Then
  13.                 drr(k, 1) = arr(1, m + 1)
  14.                 drr(k, 2) = arr(2, m + 1)
  15.                 drr(k, 3) = arr(3, m + 1)
  16.                 drr(k, 4) = arr(4, m + 1)
  17.                 drr(k, 5) = brr(k, 1)
  18.                 drr(k, 6) = brr(k, 4)
  19.                 drr(k, 7) = brr(k, 6 + m)
  20.                 n = True
  21.             End If
  22.         Else
  23.             drr(k, 5) = brr(k, 1)
  24.             drr(k, 6) = brr(k, 4)
  25.             drr(k, 7) = brr(k, 6 + m)
  26.         End If
  27.     Next k
  28.     Sheets("结果").Range("i2").Resize(UBound(drr, 1), UBound(drr, 2)) = drr
  29.     MsgBox Timer - t
  30. End Sub
复制代码

点评

0.2  发表于 2013-10-16 12:09

评分

参与人数 2 +15 金币 +25 收起 理由
培训部招生办 + 5 + 5 赞一个!
sliang28 + 10 + 20 很给力!

查看全部评分

回复

使用道具 举报

发表于 2013-10-16 00:29 | 显示全部楼层
  1. Sub 热身()
  2.     Dim arr, brr(1 To 3968, 1 To 4), i As Integer, j As Integer, k As Integer, arow As Integer
  3.     Set arr = Sheet1.Range("g3:jd6")
  4.     Set d1 = CreateObject("Scripting.Dictionary")
  5.     Set d2 = CreateObject("Scripting.Dictionary")
  6.     Set d3 = CreateObject("Scripting.Dictionary")
  7.     Application.ScreenUpdating = False
  8.     arow = Sheet1.Range("a65536").End(xlUp).Row
  9.     For i = 10 To arow
  10.         d1(i) = Sheet1.Cells(i, 2).Value    '品名
  11.         d2(i) = Sheet1.Cells(i, 5).Value    '规格
  12.         d3(i) = Application.WorksheetFunction.Sum(Range(Cells(i, 7), Cells(i, 264)))
  13.     Next i
  14.     k = 0
  15.     For j = 7 To 264 Step 1
  16.         If j = 7 Then
  17.             brr(1, 1) = Sheet1.Cells(3, 7).Value
  18.             brr(1, 2) = Sheet1.Cells(4, 7).Value
  19.             brr(1, 3) = Sheet1.Cells(5, 7).Value
  20.             brr(1, 4) = Sheet1.Cells(6, 7).Value
  21.         Else
  22.          k = Application.WorksheetFunction.CountIf(Range(Cells(10, j - 1), Cells(3977, j - 1)), ">0") + k
  23.             brr(k + 1, 1) = Sheet1.Cells(3, j).Value
  24.             brr(k + 1, 2) = Sheet1.Cells(4, j).Value
  25.             brr(k + 1, 3) = Sheet1.Cells(5, j).Value
  26.             brr(k + 1, 4) = Sheet1.Cells(6, j).Value
  27.         End If
  28.     Next j
  29.     Sheet2.[e2].Resize(d1.Count, 1) = Application.Transpose(d1.items)
  30.     Sheet2.[f2].Resize(d2.Count, 1) = Application.Transpose(d2.items)
  31.     Sheet2.[g2].Resize(d3.Count, 1) = Application.Transpose(d3.items)
  32.     Sheet2.[a2].Resize(3968, 4) = brr
  33. End Sub
复制代码
做的好纠结啊!
木牙水-热身题之格式转换.rar (488.27 KB, 下载次数: 16)

点评

0.28  发表于 2013-10-16 12:10

评分

参与人数 2 +15 金币 +25 收起 理由
培训部招生办 + 5 + 5 赞一个!
sliang28 + 10 + 20 多给点,加油^_^

查看全部评分

回复

使用道具 举报

发表于 2013-10-16 11:41 | 显示全部楼层
本帖最后由 hoogle 于 2013-10-16 11:45 编辑
  1. Sub hoogle()
  2. Dim t As Long
  3. t = Timer
  4. Dim arr1, arr2, i As Integer, j As Integer, arrRes() As String, temp As Integer
  5. With Sheets("数据源")
  6.     arr1 = .Range(.Range("a10"), .Cells(Rows.Count, .Range("g8").End(xlToRight).Column).End(3)).Value
  7.     arr2 = .Range(.Range("g1"), .Range("g8").End(xlToRight)).Value
  8. End With
  9. temp = 1
  10. ReDim arrRes(1 To UBound(arr1), 1 To 7)
  11. For i = 1 To UBound(arrRes)
  12.     arrRes(i, 5) = arr1(i, 2)
  13.     arrRes(i, 6) = arr1(i, 5)
  14.     Do Until arr1(i, temp + 6) <> ""
  15.         temp = temp + 1
  16.     Loop
  17.     arrRes(i, 1) = arr2(3, temp)
  18.     arrRes(i, 2) = arr2(4, temp)
  19.     arrRes(i, 3) = arr2(5, temp)
  20.     arrRes(i, 4) = arr2(6, temp)
  21.     arrRes(i, 7) = arr1(i, temp + 6)
  22.     If arr2(3, temp) <> "" Then
  23.         arr2(3, temp) = ""
  24.         arr2(3, temp) = ""
  25.         arr2(4, temp) = ""
  26.         arr2(5, temp) = ""
  27.         arr2(6, temp) = ""
  28.     End If
  29. Next
  30. With Sheets("结果")
  31.     .UsedRange.ClearContents
  32.     .Range("a2").Resize(UBound(arrRes), UBound(arrRes, 2)) = arrRes
  33. End With
  34. Debug.Print Timer - t
  35. End Sub
复制代码

点评

忘记告诉你 t 定义的类型不对. 如果这样定义是测不出时间的  发表于 2013-10-16 16:14
0.13  发表于 2013-10-16 12:10

评分

参与人数 2 +15 金币 +25 收起 理由
培训部招生办 + 5 + 5 赞一个!
sliang28 + 10 + 20 很给力,只有这么多

查看全部评分

回复

使用道具 举报

发表于 2013-10-16 13:36 | 显示全部楼层
  1. Sub test()
  2.     Dim arr, brr, crr
  3.     Dim i As Long, j As Long, k As Long, t
  4.     t = Timer
  5.     On Error Resume Next
  6.     Application.ScreenUpdating = False
  7.     With Sheet1
  8.         arr = .Range("a10:jd3977")
  9.         brr = .Range("g3:jd6")
  10.     End With
  11.     ReDim crr(1 To UBound(arr), 1 To 7) As String
  12.     k = 7
  13.     For i = 1 To UBound(arr)
  14.         If i = 1 Or arr(i - 1, k) = 0 Then
  15.             crr(i, 1) = brr(1, k - 6)
  16.             crr(i, 2) = brr(2, k - 6)
  17.             crr(i, 3) = brr(3, k - 6)
  18.             crr(i, 4) = brr(4, k - 6)
  19.         End If
  20.         crr(i, 5) = arr(i, 2)
  21.         crr(i, 6) = arr(i, 5)
  22.         crr(i, 7) = arr(i, k)
  23.         If arr(i + 1, k) = 0 Then
  24.             k = k + 1
  25.         End If
  26.     Next
  27.     With Sheet2
  28.         .Range("a2").Resize(UBound(crr), 7).ClearContents
  29.         .Range("a2").Resize(UBound(crr), 7) = crr
  30.     End With
  31.     Application.ScreenUpdating = True
  32.     MsgBox Timer - t
  33. End Sub
复制代码

点评

0.12  发表于 2013-10-16 15:24

评分

参与人数 2 +25 金币 +30 收起 理由
培训部招生办 + 10 + 10 赞一个!
sliang28 + 15 + 20 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2013-10-16 14:37 | 显示全部楼层
  1. Sub sellby()
  2.     Dim arr, brr, crr(1 To 6000, 1 To 7)
  3.     Dim i&, j&, x&, y&, n&, t
  4.     Dim sh As Worksheet
  5. t = Timer
  6.     Set sh = ThisWorkbook.Sheets("数据源")
  7.     arr = sh.Range("g1").CurrentRegion
  8.     x = 0: y = 0: n = 9
  9.     For i = 7 To UBound(arr, 2)
  10.         x = x + 1
  11.         crr(x, 1) = arr(3, i)
  12.         crr(x, 2) = arr(4, i)
  13.         crr(x, 3) = arr(5, i)
  14.         crr(x, 4) = arr(6, i)
  15.         For j = 10 To UBound(arr)
  16.             If arr(j, i) > 0 Then
  17.                 crr(x + y, 5) = arr(j, 2)
  18.                 crr(x + y, 6) = arr(j, 5)
  19.                 crr(x + y, 7) = arr(j, i)
  20.                  y = y + 1
  21.             ElseIf arr(j, i) = 0 And j > n Then
  22.                 Exit For
  23.            End If
  24.        Next j
  25.        n = n + x + y: x = x + y - 1: y = 0
  26.     Next i
  27.     With Sheets("练习结果")
  28.         .Cells.ClearContents
  29.         .Range("a2").Resize(x, 7) = crr
  30.     End With
  31. MsgBox Timer - t
  32. End Sub
复制代码

点评

0.4s  发表于 2013-10-16 15:16

评分

参与人数 2 +10 金币 +15 收起 理由
培训部招生办 + 5 + 5 赞一个!
sliang28 + 5 + 10 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2013-10-16 15:34 | 显示全部楼层
请老师看一下,我的电脑比较破

热身题之格式转换.rar

483.78 KB, 下载次数: 8

点评

0.18s  发表于 2013-10-16 16:04

评分

参与人数 2 +15 金币 +25 收起 理由
培训部招生办 + 5 + 5 很给力!
sliang28 + 10 + 20 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-2 10:41 , Processed in 0.401584 second(s), 22 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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