Excel精英培训网

 找回密码
 注册
查看: 4315|回复: 13

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

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

根据习题一的结果,你们都太强了,于是有了习题一的升级版.

继续拼时间{:3912:}

热身题之格式转换-升级版.zip

29.76 KB, 下载次数: 291

评分

参与人数 2 +21 收起 理由
CheryBTL + 18 学委,赶紧开贴吧 ^_^
Sellby + 3 很给力!

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2013-10-17 12:23 | 显示全部楼层
本帖最后由 gdw831001 于 2013-10-18 07:45 编辑

占个位置等结果,我只是占个位置了,何况您的题目上也没有说不能,可不能~~~~~~

点评

不提交答案的话,你会很惨的^_^  发表于 2013-10-17 13:03
回复

使用道具 举报

发表于 2013-10-17 14:09 | 显示全部楼层
  1. Sub test()
  2.     Dim i As Long, j As Long, k As Long, t As Single
  3.     Dim arr, brr(1 To 1000, 1 To 10) As String, crr(1 To 3) As Long
  4.     t = Timer
  5.     On Error Resume Next
  6.     arr = Sheet12.Range("a2:g449")
  7.     k = 1
  8.     For i = 1 To UBound(arr)
  9.         If i = 1 Or arr(i, 1) <> arr(i - 1, 1) Then
  10.             brr(k, 1) = arr(i, 1)
  11.             brr(k, 2) = arr(i, 2)
  12.             brr(k, 3) = "CAP前"
  13.             brr(k + 1, 3) = "CAP后"
  14.             brr(k + 2, 3) = "完成品"
  15.             k = k + 3
  16.             Erase crr
  17.         End If
  18.         For j = 5 To 7
  19.             If arr(i, j) > 0 Then
  20.                 crr(j - 4) = crr(j - 4) + 1
  21.                 brr(k + j - 8, crr(j - 4) + 3) = arr(i, 3)
  22.             End If
  23.         Next
  24.     Next
  25.     With Sheet4
  26.         .Range("a2:j65536").ClearContents
  27.         .Range("a2").Resize(k - 1, 10) = brr
  28.     End With
  29.     MsgBox Timer - t
  30. End Sub
复制代码

点评

0.015秒  发表于 2013-10-21 19:15
回复

使用道具 举报

发表于 2013-10-17 14:18 | 显示全部楼层
本帖最后由 CheryBTL 于 2013-10-18 10:18 编辑

先凑一个了,如果学委能提前给出时间要求最好了:
  1. Sub CheryBTL()
  2.     Dim i As Integer, m As Integer
  3.     Dim n1 As Integer, n2 As Integer, n3 As Integer
  4.     Dim ar, Re() As String
  5.     Dim t As Single
  6.     t = Timer
  7.     ar = Sheets("数据源").Range("A1").CurrentRegion
  8.     ReDim Re(1 To (UBound(ar) / 7) * 3, 1 To 10) As String
  9.     For i = 2 To UBound(ar)
  10.         If i Mod 7 = 2 Then n1 = 0: n2 = 0: n3 = 0:m=(i-2)/7*3+1
  11.         Re(m, 3) = "CAP前"
  12.         Re(m + 1, 3) = "CAP后"
  13.         Re(m + 2, 3) = "完成品"
  14.         If i Mod 7 = 2 Then Re(m, 1) = ar(i, 1): Re(m, 2) = ar(i, 2)
  15.         If ar(i, 5) <> "" Then n1 = n1 + 1: Re(m, 3 + n1) = ar(i, 3)
  16.         If ar(i, 6) <> "" Then n2 = n2 + 1: Re(m + 1, 3 + n2) = ar(i, 3)
  17.         If ar(i, 7) <> "" Then n3 = n3 + 1: Re(m + 2, 3 + n3) = ar(i, 3)
  18.     Next i
  19.     With Sheets("结果")
  20.         .Range("A2").CurrentRegion.ClearContents
  21.         .Range("A2").Resize(UBound(Re), 10) = Re
  22.     End With
  23.     MsgBox Timer - t
  24. End Sub
复制代码
再改下,把VBA函数MOD和INT完全省略掉,也有出现0的,哈哈:
  1. Sub CheryBTL2()
  2.     Dim i As Integer, m As Integer, j As Integer
  3.     Dim n1 As Integer, n2 As Integer, n3 As Integer
  4.     Dim ar, Re() As String
  5.     Dim t As Single
  6.     t = Timer
  7.     With Sheets("数据源")
  8.         ar = .Range("A1").CurrentRegion
  9.     End With
  10.     ReDim Re(1 To UBound(ar) / 7 * 3, 1 To 10) As String
  11.     j = 2
  12.     m = -2
  13.     For i = 2 To UBound(ar)
  14.         If i = j Then
  15.             j = j + 7
  16.             m = m + 3
  17.             Re(m, 1) = ar(i, 1): Re(m, 2) = ar(i, 2)
  18.             n1 = 3: n2 = 3: n3 = 3
  19.         End If
  20.         Re(m, 3) = "CAP前"
  21.         Re(m + 1, 3) = "CAP后"
  22.         Re(m + 2, 3) = "完成品"
  23.         If ar(i, 5) <> "" Then n1 = n1 + 1: Re(m, n1) = ar(i, 3)
  24.         If ar(i, 6) <> "" Then n2 = n2 + 1: Re(m + 1, n2) = ar(i, 3)
  25.         If ar(i, 7) <> "" Then n3 = n3 + 1: Re(m + 2, n3) = ar(i, 3)
  26.     Next i
  27.     With Sheets("结果")
  28.         .Range("A2").CurrentRegion.ClearContents
  29.         .Range("A2").Resize(UBound(Re), 10) = Re
  30.     End With
  31.     MsgBox Timer - t
  32. End Sub
复制代码
再次减少循环的次数:
  1. Sub CheryBTL3() '再减少参数
  2.     Dim i As Integer, j As Integer
  3.     Dim n1 As Integer, n2 As Integer, n3 As Integer
  4.     Dim ar, Re() As String
  5.     Dim t As Single
  6.     t = Timer
  7.     With Sheets("数据源")
  8.         ar = .Range("A1").CurrentRegion
  9.     End With
  10.     ReDim Re(1 To UBound(ar) / 7 * 3, 1 To 10) As String
  11.     m = -2
  12.     For i = 2 To UBound(ar) Step 7
  13.         m = m + 3
  14.         Re(m, 1) = ar(i, 1): Re(m, 2) = ar(i, 2)
  15.         n1 = 3: n2 = 3: n3 = 3
  16.         Re(m, 3) = "CAP前"
  17.         Re(m + 1, 3) = "CAP后"
  18.         Re(m + 2, 3) = "完成品"
  19.         For j = 0 To 6
  20.             If ar(i + j, 5) <> "" Then n1 = n1 + 1: Re(m, n1) = ar(i, 3)
  21.             If ar(i + j, 6) <> "" Then n2 = n2 + 1: Re(m + 1, n2) = ar(i, 3)
  22.             If ar(i + j, 7) <> "" Then n3 = n3 + 1: Re(m + 2, n3) = ar(i, 3)
  23.         Next j
  24.     Next i
  25.     With Sheets("结果")
  26.         .Range("A2").CurrentRegion.ClearContents
  27.         .Range("A2").Resize(UBound(Re), 10) = Re
  28.     End With
  29.     MsgBox Timer - t
  30. End Sub
复制代码

点评

0.015秒  发表于 2013-10-21 19:16
回复

使用道具 举报

发表于 2013-10-17 22:23 | 显示全部楼层
  1. Sub sellby()
  2.     Dim arr, brr(1 To 600, 1 To 20)
  3.     Dim d As New Dictionary
  4.     Dim i%, n%, x As Byte, y As Byte, z As Byte, m As Byte
  5.     Dim str$, t
  6.     t = Timer
  7.     arr = Sheets("数据源").Cells(1, 1).CurrentRegion
  8.     n = -2
  9.     For i = 2 To UBound(arr)
  10.         str = arr(i, 1) & "/" & arr(i, 2)
  11.         If Not d.Exists(str) Then
  12.             n = n + 3
  13.             d.Add str, n
  14.             brr(n, 1) = arr(i, 1)
  15.             brr(n, 2) = arr(i, 2)
  16.             brr(n, 3) = arr(1, 5)
  17.             brr(n + 1, 3) = arr(1, 6)
  18.             brr(n + 2, 3) = arr(1, 7)
  19.             x = 3: y = 3: z = 3
  20.             If arr(i, 5) > 0 Then x = x + 1: brr(n, x) = arr(i, 3)
  21.             If arr(i, 6) > 0 Then y = y + 1: brr(n + 1, y) = arr(i, 3)
  22.             If arr(i, 7) > 0 Then z = z + 1: brr(n + 2, z) = arr(i, 3)
  23.         Else
  24.             If arr(i, 5) > 0 Then x = x + 1: brr(n, x) = arr(i, 3)
  25.             If arr(i, 6) > 0 Then y = y + 1: brr(n + 1, y) = arr(i, 3)
  26.             If arr(i, 7) > 0 Then z = z + 1: brr(n + 2, z) = arr(i, 3)
  27.         End If
  28.         m = Application.Max(m, x, y, z)
  29.     Next i
  30. '    Stop
  31.     With Sheets("结果")
  32.         .Cells.ClearContents
  33.         .Cells(2, 1).Resize(d.Count * 3, m) = brr
  34.     End With
  35.     Set d = Nothing
  36.     MsgBox Timer - t
  37. End Sub
复制代码

点评

错了,不支持乱序,那这样用字典就多此一举了.  发表于 2013-10-24 10:06
支持乱序,对列号有限定,不错.  发表于 2013-10-24 10:05
0.031  发表于 2013-10-21 19:18
回复

使用道具 举报

发表于 2013-10-18 09:16 | 显示全部楼层
  1. Sub 热身()
  2.     Dim arr, brr(1 To 192, 1 To 10)
  3.     Dim i As Integer, j As Integer, t
  4.     t = Timer
  5.     j = 1
  6.     arr = Sheets("数据源").Range("a2:g" & Sheets("数据源").Range("a65536").End(3).Row)
  7.     For i = 1 To UBound(arr) Step 7
  8.         brr(j, 1) = arr(i, 1)
  9.         brr(j, 2) = arr(i, 2)
  10.         brr(j, 3) = "CAP前"
  11.         brr(j, 4) = arr(i + 2, 3)
  12.         brr(j, 5) = arr(i + 3, 3)
  13.         brr(j, 6) = arr(i + 4, 3)
  14.         brr(j, 7) = arr(i + 5, 3)
  15.         brr(j, 8) = arr(i + 6, 3)
  16.         brr(j + 1, 3) = "CAP后"
  17.         brr(j + 1, 4) = arr(i, 3)
  18.         brr(j + 1, 5) = arr(i + 2, 3)
  19.         brr(j + 1, 6) = arr(i + 3, 3)
  20.         brr(j + 1, 7) = arr(i + 4, 3)
  21.         brr(j + 1, 8) = arr(i + 5, 3)
  22.         brr(j + 1, 9) = arr(i + 6, 3)
  23.         brr(j + 2, 3) = "完成品"
  24.         brr(j + 2, 4) = arr(i, 3)
  25.         brr(j + 2, 5) = arr(i + 1, 3)
  26.         brr(j + 2, 6) = arr(i + 2, 3)
  27.         brr(j + 2, 7) = arr(i + 3, 3)
  28.         brr(j + 2, 8) = arr(i + 4, 3)
  29.         brr(j + 2, 9) = arr(i + 5, 3)
  30.         brr(j + 2, 10) = arr(i + 6, 3)
  31.         j = j + 3
  32.     Next i
  33.     Sheet4.Range("a2").Resize(192, 10) = brr
  34.     MsgBox Timer - t
  35. End Sub
复制代码

点评

0.031秒  发表于 2013-10-21 19:20
回复

使用道具 举报

发表于 2013-10-20 20:20 | 显示全部楼层
  1. Sub hoogle()
  2. Dim t As Double
  3. t = Timer
  4. Dim arrData, i As Integer, j As Integer, icount(1 To 3)
  5. arrData = Sheets("数据源").Range("a2:g449").Value
  6. Dim arrRes(1 To 192, 1 To 10)
  7. For i = 1 To UBound(arrData) / 7 * 3 Step 3
  8.   icount(1) = 4: icount(2) = 4: icount(3) = 4
  9.   arrRes(i, 1) = arrData(i / 3 * 7, 1)
  10.   arrRes(i, 2) = arrData(i / 3 * 7, 2)
  11.   arrRes(i, 3) = "CAP前": arrRes(i + 1, 3) = "CAP后": arrRes(i + 2, 3) = "完成品"
  12.   For j = 1 To 7
  13.     If arrData((i - 1) / 3 * 7 + j, 5) <> "" Then
  14.       arrRes(i, icount(1)) = arrData((i - 1) / 3 * 7 + j, 3)
  15.       icount(1) = icount(1) + 1
  16.     End If
  17.     If arrData((i - 1) / 3 * 7 + j, 6) <> "" Then
  18.       arrRes(i + 1, icount(2)) = arrData((i - 1) / 3 * 7 + j, 3)
  19.       icount(2) = icount(2) + 1
  20.     End If
  21.     If arrData((i - 1) / 3 * 7 + j, 7) <> "" Then
  22.       arrRes(i + 2, icount(3)) = arrData((i - 1) / 3 * 7 + j, 3)
  23.       icount(3) = icount(3) + 1
  24.     End If
  25.   Next
  26. Next
  27. Sheets("结果").UsedRange.ClearContents
  28. Sheets("结果").Range("a2").Resize(192, 10) = arrRes
  29. MsgBox Timer - t
  30. End Sub
复制代码

点评

0.031秒  发表于 2013-10-21 19:20
回复

使用道具 举报

发表于 2013-10-20 21:47 | 显示全部楼层
热身题之格式转换-升级版.zip (43.29 KB, 下载次数: 5)

点评

0.031秒  发表于 2013-10-21 19:23
回复

使用道具 举报

发表于 2013-10-21 16:16 | 显示全部楼层
本帖最后由 fffox 于 2013-10-21 16:22 编辑

前几天写好的,今天拿出来又改了一下,发上来请老师点评
  1. Sub t()
  2.     Dim arr, t
  3.     Dim brr() As String
  4.     Dim i As Long, k As Long, k1 As Integer, k2 As Integer, k3 As Integer
  5.     Dim maxk As Integer, maxcol As Integer
  6.     t = Timer
  7.     Application.ScreenUpdating = False
  8.     With Sheets("数据源")
  9.         arr = .Range("a1:g" & .Cells(Rows.Count, "g").End(xlUp).Row)
  10.     End With
  11.     ReDim brr(1 To 1000, 1 To 10) As String
  12.     k = -2
  13.     For i = 2 To UBound(arr)
  14.         If arr(i - 1, 1) <> arr(i, 1) Then
  15.             k = k + 3: k1 = 4: k2 = 4: k3 = 4
  16.             brr(k, 1) = arr(i, 1)               '设Product Code
  17.             brr(k, 2) = arr(i, 2)               '设Product Name
  18.             brr(k, 3) = arr(1, 5)               '设CAP前
  19.             brr(k + 1, 3) = arr(1, 6)           '设CAP后
  20.             brr(k + 2, 3) = arr(1, 7)           '设完成品
  21.         End If
  22.         If arr(i, 5) <> "" Then
  23.             brr(k, k1) = arr(i, 3)          'CAP前对应的Material Code
  24.             k1 = k1 + 1
  25.         End If
  26.         If arr(i, 6) <> "" Then
  27.             brr(k + 1, k2) = arr(i, 3)      'CAP后对应的Material Code
  28.             k2 = k2 + 1
  29.         End If
  30.         If arr(i, 7) <> "" Then
  31.             brr(k + 2, k3) = arr(i, 3)       '完成品对应的Material Code
  32.             k3 = k3 + 1
  33.         End If
  34.         maxk = Application.Max(k1, k2, k3)
  35.         If maxcol < maxk Then maxcol = maxk
  36.         If maxcol > UBound(brr, 2)+1 Then ReDim Preserve brr(1 To 1000, 1 To maxcol) As String
  37.     Next
  38.     With Sheets("结果")
  39.         .Cells.ClearContents
  40.         .Range("a2").Resize(k + 2, UBound(brr, 2)) = brr
  41.     End With
  42.     Application.ScreenUpdating = True
  43.     Debug.Print Timer - t
  44. End Sub
复制代码

点评

0.046秒  发表于 2013-10-21 19:22
回复

使用道具 举报

发表于 2013-10-21 22:09 | 显示全部楼层
  1. Sub aa()
  2.     Dim arr, brr(), crr
  3.     Dim iend%, k%, m%, n%, a%, b%
  4.     Dim t: t = Timer
  5.     iend = Sheets("数据源").Range("a" & Cells.Rows.Count).End(xlUp).Row
  6.     arr = Sheets("数据源").Range("a2:g" & iend)
  7.     crr = Sheets("数据源").Range("e1:g1")
  8.     ReDim brr(1 To UBound(arr) / 7 * 3, 1 To 10)
  9.     m = 1
  10.     For k = 1 To UBound(arr) Step 7
  11.         brr(m, 1) = arr(k, 1)
  12.         brr(m, 2) = arr(k, 2)
  13.         For n = 1 To 3
  14.             b = 0
  15.             brr(m + n - 1, 3) = crr(1, n)
  16.             For a = 1 To 7
  17.                 If arr(k + a - 1, 4 + n) <> "" Then
  18.                     b = b + 1
  19.                     brr(m + n - 1, 3 + b) = arr(k + a - 1, 3)
  20.                 End If
  21.             Next a

  22.         Next n
  23.         m = m + 3
  24.     Next k
  25.     Sheets("结果").Range("l2").Resize(UBound(brr), UBound(brr, 2)) = brr
  26.     MsgBox Timer - t
  27. End Sub
复制代码
我的电脑上测是0.015625

点评

0.031秒,(0.015偶然事件)  发表于 2013-10-22 15:08

评分

参与人数 1 +10 金币 +10 收起 理由
sliang28 + 10 + 10 很给力!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 19:32 , Processed in 0.397546 second(s), 22 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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