Excel精英培训网

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

[通知] Excel 2015VBA初级2班第4课A组作业上交贴(已开贴)

[复制链接]
发表于 2015-11-12 13:17 | 显示全部楼层 |阅读模式
本帖最后由 雪舞子 于 2015-11-15 16:58 编辑

作业说明及要求:

1、根据第四课所讲的内容,按老师布置的作业,编写一段自认为精练的代码;
2、提交作业请注明论坛ID及学号。如:A01-麻花_;
3、作业请以代码方式提交,标清题号并所有题贴到一个代码标签中,无需提交附件。 不会使用标签可移步帖子:http://www.excelpx.com/thread-322284-1-1.html
4、代码题要求强制声明变量,关键语句标明注释,代码缩进;不会缩进可使用缩进小工具:http://www.excelpx.com/thread-366281-1-1.html
5、跟帖不要重复占楼,有问题直接在原帖编辑;
6、本次课程安排紧凑,时间紧任务重,同学们加油!
7、作业截止时间:第5课上课日之18:00时

评分

参与人数 1 +15 收起 理由
air05 + 15 赞一个!

查看全部评分

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2015-11-12 15:47 | 显示全部楼层
A02-guofei0344_
<div class="blockcode"><blockquote>
  1. Sub 练习3()
  2. Dim i As Integer, j As Integer, a As Integer
  3. Dim arr, arr1, arr3(1 To 10, 1 To 8)
  4.     arr = Range("A1:A" & Range("a" & Range("a:a").Rows.Count).End(xlUp).Row)
  5.     arr1 = Range("A1:A" & Range("a1").End(xlDown).Row)
  6.     For i = 1 To UBound(arr1)
  7.         arr1(i, 1) = Left(arr1(i, 1), Application.Find(":", arr1(i, 1)) - 1)
  8.     Next
  9.     Range("C1").Resize(1, UBound(arr1)) = Application.Transpose(arr1)
  10.     For i = 1 To UBound(arr)
  11.         If arr(i, 1) <> "" Then
  12.             For j = 1 To UBound(arr1)
  13.                 arr3(a + 1, j) = Mid(arr(i + j - 1, 1), Len(arr1(j, 1)) + 2, 30)
  14.             Next
  15.             a = a + 1
  16.             i = i + j
  17.         End If
  18.     Next
  19.     Range("C2").Resize(10, 8) = arr3
  20. End Sub
复制代码
</blockquote></div><br />
  1. Sub 表2()
  2. Dim j As Integer, i As Integer
  3. Dim arr, arr1(1 To 100)
  4. On Error GoTo 100
  5.     arr = Range("c4:c" & Range("c" & Range("c:c").Rows.Count).End(xlUp).Row)
  6.     arr1(1) = Format(arr(1, 1), "yyyy年mm月")
  7.     For i = 1 To UBound(arr)
  8.         j = j + 1
  9.         If Format(arr(i, 1), "yyyymm") = Format(arr(i + 1, 1), "yyyymm") Then
  10.             arr1(j + 1) = arr(i, 1)
  11.         Else
  12.             arr1(j + 1) = arr(i, 1)
  13.             j = j + 1
  14.             arr1(j + 1) = Format(arr(i + 1, 1), "yyyy年mm月")
  15.         End If
  16.     Next
  17. 100:
  18.     arr1(j + 1) = arr(i, 1)
  19. Sheets("表1").Range("m2").Resize(UBound(arr1), 1) = Application.Transpose(arr1)
  20. End Sub
复制代码

点评

第一题利用工作表find函数先找出文本,剩下就是所要数据,很巧妙。第二题之所以使用了onerror是因为跟下一行比较时数组不够用而溢出,如果跟上一行比较就可以省略这句。逻辑关系上还可以再简化。很棒!  发表于 2015-11-15 15:10

评分

参与人数 1 +20 金币 +20 收起 理由
qh8600 + 20 + 20 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-11-12 21:42 | 显示全部楼层
A06:建峰
练习三:
  1. Option Explicit
  2. Option Base 1
  3. '练习三
  4. Sub 整理数据()
  5.     '第一步,定义变量,把数据装入数组
  6.     Dim lrows As Long, arr
  7.     lrows = Range("a1048576").End(xlUp).Row
  8.     arr = Range("a1:a" & lrows)
  9.     Range("c1:j1") = [{"财付通","佣金","QQ号码","旺旺小号","旺旺星级","下单金额","订单编号","QT编号"}]
  10.     '第二步,在数组中进行计算
  11.     Dim brr(1 To 1000000, 1 To 8) As Long, i As Byte, j As Long, x As Long
  12.     j = 1
  13.     x = 1
  14.     For lrows = 1 To UBound(arr)
  15.         If Left(arr(lrows, 1), 3) = "财付通" Then
  16.             For i = 0 To 7
  17.                 brr(x, j + i) = --Right(arr(lrows + i, 1), Len(arr(lrows + i, 1)) - Application.WorksheetFunction.Find(":", arr(lrows + i, 1)))
  18.             Next
  19.             x = x + 1
  20.             lrows = lrows + i
  21.         End If
  22.     Next
  23.     '第三步,将数组中的数据写入单元格
  24.     Range("c2:j" & x) = brr
  25. End Sub
复制代码
表1表2
  1. Option Explicit
  2. Option Base 1


  3. Sub 添加月份()
  4.      '第一步,定义变量,把数据装入数组
  5.     Dim lrows As Long, arr
  6.     lrows = Range("c1048576").End(xlUp).Row
  7.     arr = Range("c4:c" & lrows)
  8.    
  9.      '第二步,在数组中进行计算
  10.     Dim brr(1 To 1048576, 1 To 1), i As Long, j As Long
  11.     brr(1, 1) = Format(Year(arr(1, 1)) & "-" & Month(arr(1, 1)), "yyyy年m月")
  12.     brr(2, 1) = arr(1, 1)
  13.     j = 2
  14.     For i = 2 To UBound(arr)
  15.         If Month(arr(i, 1)) = Month(arr(i - 1, 1)) Then
  16.             j = j + 1
  17.             brr(j, 1) = arr(i, 1)
  18.         Else
  19.             j = j + 1
  20.             brr(j, 1) = Format(Year(arr(i, 1)) & "-" & Month(arr(i, 1)), "yyyy年m月")
  21.             j = j + 1
  22.             brr(j, 1) = arr(i, 1)
  23.         End If
  24.     Next
  25.      
  26.      '第三步,将数组中的数据写入单元格
  27.     Sheets("表1").[m1] = "日期"
  28.     Sheets("表1").Range("m2:m" & j + 1) = brr

  29. End Sub
复制代码
回答完毕!

点评

第一题的brr定义类型为long不是很科学,其他字段类型很可能是文本;第二题13及22句直接= Format(arr(), "yyyy年m月")可能会更简洁,此题逻辑关系可再斟酌一下。  发表于 2015-11-15 15:35

评分

参与人数 1 +18 金币 +18 收起 理由
qh8600 + 18 + 18 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 10:39 | 显示全部楼层
  1. Sub 练习3A()    'A03:开心妙妙
  2.     Dim Arr, iRow&, i&, j&, x&, n&
  3.     Application.ScreenUpdating = False

  4.     '区域赋值给数组
  5.     With Sheet4
  6.         iRow = .Range("A" & Rows.Count).End(xlUp).Row
  7.         Arr = .Range("A1:A" & iRow)
  8.     End With
  9.     '重置目标数组的大小,行数按原区域行除8,固定为8列大小
  10.     ReDim Brr(1 To iRow / 8 + 1, 1 To 8)
  11.     n = 1    '目标数值行初始变量
  12.     For i = 1 To iRow   '原数据循环
  13.         If Arr(i, 1) <> "" Then   '如果数据不为空,就+1
  14.             j = j + 1
  15.             x = InStr(1, Arr(i, 1), ":", 1)  '查找":"在字符中的位置
  16.             If VBA.Left(Arr(i, 1), x - 1) = "财付通" Then
  17.                 '如果前面的3个字符=财付通的时候,行+1,列从1开始
  18.                 n = n + 1: j = 1
  19.             End If
  20.             If i < 9 Then
  21.                 '判断原值行小于9的时候,即一条数据,第一行赋值标题,第二行赋值数据
  22.                 Brr(1, j) = VBA.Left(Arr(i, 1), x - 1)
  23.                 Brr(2, j) = VBA.Mid(Arr(i, 1), x + 1, 9)
  24.             Else
  25.                 '否则 , 直接赋值数据
  26.                 Brr(n, j) = VBA.Mid(Arr(i, 1), x + 1, 9)
  27.             End If
  28.         End If
  29.     Next
  30.     '二维数组,赋值给区域
  31.     Sheet4.Range("C1").Resize(UBound(Brr, 1), UBound(Brr, 2)) = Brr
  32.     Application.ScreenUpdating = True
  33. End Sub
  34. Sub 练习3()    'A03:开心妙妙
  35.     Dim Arr, RowC&, ArrB, Brr(), i&, j&, j1&, n&
  36.     Application.ScreenUpdating = False
  37.     With Sheet4
  38.         RowC = .Range("A" & Rows.Count).End(xlUp).Row
  39.         Arr = .Range("A1:A" & RowC)
  40.     End With
  41.     n = 1
  42.     For i = 1 To RowC
  43.         If Arr(i, 1) <> "" Then
  44.             j = j + 1
  45.             j1 = j Mod 8  '求余数最得列号
  46.             ArrB = VBA.Split(Arr(i, 1), ":")  '用Split分割成数据
  47.             If ArrB(0) = "财付通" Then
  48.                 '判断如果数组的第一元素=财付通,行数+1,保留原值,重赋数组
  49.                 'Preserve 只有最后一维可以用变量,所以将行置成列,将列置成行
  50.                 n = n + 1
  51.                 ReDim Preserve Brr(1 To 8, 1 To n)
  52.             End If
  53.             '求余数8的时候,余数是0,要作个判断,余数是0的时候=8
  54.             If j1 = 0 Then j1 = 8
  55.             If j < 9 Then
  56.                 '判断如果行小于9的时候,拆分的第一个元素赋值给第一行,第二个元素赋值给第二行
  57.                 Brr(j1, 1) = ArrB(0)
  58.                 Brr(j1, n) = ArrB(1)
  59.             Else
  60.                 '否则,直接赋值
  61.                 Brr(j1, n) = ArrB(1)
  62.             End If
  63.         End If
  64.     Next
  65.     Sheet4.Range("C1").Resize(UBound(Brr, 2), UBound(Brr, 1)) = Application.WorksheetFunction.Transpose(Brr)
  66.     Application.ScreenUpdating = True
  67. End Sub

  68. Sub 日期格式整理()
  69.     Dim Arr, i&, Brr(1 To 10000), n&
  70.     Application.ScreenUpdating = False

  71.     With Sheet13  ''数据存入数组
  72.         Arr = .Range("C4:C" & .Range("C" & Rows.Count).End(xlUp).Row)
  73.     End With

  74.     Brr(1) = VBA.Format(Arr(1, 1), "YYYY年M月")    ' '数组的第一个值设置好格式后存入
  75.     n = 1  '第一个值己赋入,初始变量为1
  76.     For i = 1 To UBound(Arr)
  77.         n = n + 1   '按原值循环加1
  78.         If i >= UBound(Arr) Then
  79.             '判断I>=数组最大个数,这里避免在循环到最后一个值的时候,无法和下一个的月份对比而出错.
  80.             Brr(n) = Arr(i, 1)
  81.         Else
  82.             If VBA.Month(Arr(i, 1)) <> VBA.Month(Arr(i + 1, 1)) Then
  83.                 '如果月份不想等的时候,先赋值,然后N+1,再赋下一月份的值
  84.                 Brr(n) = Arr(i, 1)
  85.                 n = n + 1
  86.                 Brr(n) = VBA.Format(Arr(i + 1, 1), "YYYY年M月")
  87.             Else    '否则,直接赋值
  88.                 Brr(n) = Arr(i, 1)
  89.             End If
  90.         End If
  91.     Next
  92.     '生成的一维数组,赋值给区域前转置
  93.     Sheet12.Range("M2").Resize(n) = Application.WorksheetFunction.Transpose(Brr)
  94.     Application.ScreenUpdating = True
  95. End Sub
复制代码

点评

第一题用了两种方法,很细致用心,注释详尽一目了然,第二题考虑也很周到,很棒!加油!  发表于 2015-11-15 15:55

评分

参与人数 1 +20 金币 +20 收起 理由
qh8600 + 20 + 20 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 10:49 | 显示全部楼层
1、
  1. Sub 日期变月份()
  2.     Dim arr(), i As Integer, irows As Integer
  3.         irows = Range("c4").End(xlDown).Row
  4.         arr() = Range("c4:c" & irows)
  5.     ReDim Preserve arr(1 To irows - 3, 1 To 1)
  6.     Dim brr(1 To 65535, 1 To 1)
  7.         For i = 1 To UBound(arr())
  8.             brr(i, 1) = Format(arr(i, 1), "yyyy年m月")
  9.             'MsgBox brr(i, 1)
  10.         Next i
  11.     Sheets("表1").Range("m2:m" & irows) = brr
  12. End Sub
复制代码
2、
  1. Sub 数据处理()
  2. Dim i As Long, arr(), brr(), t As Single
  3. t = Timer
  4. i = Range("a" & 1048576).End(xlUp).Row 'i等于最后行号
  5. arr = Range("a1:a" & i)     'arr 等于a1到最后一个
  6. brr = Range("c1:j1")       'brr 等于c1:j1
  7. ReDim Preserve arr(1 To i, 1 To 1) '重新定义 arr的范围 但保留原来赋值
  8. Dim j As Long, crr As String, k As Integer '定义 j,k 整型变量 crr为文本型
  9.     For k = 1 To 8  'k范围从1到8
  10.         If k > 1 Then '如果k大于1 那么清除crr
  11.         crr = ""
  12.         End If
  13.         For j = 1 To i ' j范围从1到 i
  14.             If Left(arr(j, 1), Len(brr(1, k))) = brr(1, k) Then '如果冒号前面的文字 等于数组brr  那么
  15.                 crr = crr & Right(arr(j, 1), Len(arr(j, 1)) - Len(brr(1, k))) 'crr就等于arr后半段相连
  16.             End If
  17.         Next j
  18.         Dim l As String, m As Long, drr '定义l为文本 m 为长整型 drr为变体型
  19.         l = Right(crr, Len(crr) - 1) 'l =去掉crr 第一个字符
  20.         drr = Split(l, ":") '根据 冒号将 l分解成1维数组
  21.         'ReDim drr(2 * k - 2 To UBound(drr) - 2 + 2 * k, 1 To 1)
  22.         Range(Chr(k + 66) & "2:" & Chr(k + 66) & UBound(drr) + 2) = Application.Transpose(drr) '给2:4行赋值
  23.         'MsgBox Chr(k + 66)
  24.         'Set crr = Clear
  25.         'crr.Select.ClearContents
  26.     Next k '下一个k
  27.     MsgBox Format(Timer - t, "0.0000s")
  28. End Sub
复制代码

点评

第一题没理解题意哦,并不是将所有日期都改成“yyyy月m日”格式;第二题做的好复杂,既然会使用split()就不必再用len()了,语句07使用redim preserve,到底发生了什么?代码看的我好晕,没理解你的意思,结果也不对。  发表于 2015-11-15 16:14

评分

参与人数 1 +10 金币 +10 收起 理由
qh8600 + 10 + 10 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 11:44 | 显示全部楼层
A12-ZL在水一方

先交一题,另一题还没搞定
  1. Option Explicit
  2. Sub 数据整理()
  3. Dim arr As Variant, j As Long, i As Long, MaxRow As Long, iRows As Long, brr(), t As Single
  4. 't = Timer

  5. '******整理数据源,删除空行******
  6. MaxRow = Cells(Rows.Count, 1).End(xlUp).Row
  7. Application.ScreenUpdating = False
  8. For j = MaxRow To 1 Step -1
  9.     If Cells(j, 1) = "" Then
  10.         Rows(j).EntireRow.Delete
  11.     End If
  12. Next

  13. '******将单元格数据放入数组******
  14. iRows = Cells(Rows.Count, 1).End(xlUp).Row
  15. arr = Range("a1:a" & iRows)

  16. '******数组内执行语句******
  17. ReDim brr(1 To UBound(arr) / 8, 1 To 8)
  18.     For i = 1 To UBound(arr)
  19.         brr(Int((i - 1) / 8) + 1, IIf(i Mod 8 = 0, 8, i Mod 8)) = Mid(arr(i, 1), InStr(arr(i, 1), ":") + 1, 99)
  20.     Next i

  21. '******将数组返回至单元格******
  22. [c:j].ClearContents
  23. [c1].Resize(1, 8) = Array("财付通", "佣金", "QQ号码", "旺旺小号", "旺旺星级", "下单金额", "订单编号", "QT编号")
  24. [c2].Resize(UBound(arr) / 8, 8) = brr

  25. Application.ScreenUpdating = True
  26. 'MsgBox Format(Timer - t, "0.0000")
  27. End Sub
复制代码

点评

这种破坏源数据的方法是不赞成的,实际工作中也尽量少使用。如果要整理可利用数组在内存中整理,针对此题也是没必要整理的。算法很简洁,结果完全正确。另一题可参看其他同学做一下。加油!  发表于 2015-11-15 16:21

评分

参与人数 1 +15 金币 +15 收起 理由
qh8600 + 15 + 15 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 17:26 | 显示全部楼层
  1. Sub 练习三()
  2.     '步骤1
  3.     Dim arr, irows As Long
  4.     irows = Range("a1").End(xlDown).Row
  5.     arr = Range("A1:a" & irows)
  6.     '步骤2
  7.     Dim brr(1 To 8, 1 To 1), i As Integer, crr(1 To 10, 1 To 1)
  8.     For i = 1 To irows
  9.         brr(i, 1) = Split(arr(i, 1), ":")(0)
  10.         crr(i, 1) = Split(arr(i, 1), ":")(1)
  11.     Next i
  12.     '步骤3
  13.     Range("c1").Resize(1, irows) = Application.Transpose(brr)
  14.     Range("c2").Resize(1, irows) = Application.Transpose(crr)
  15.    
  16. End Sub
  17. ..只会做一组数据的。。其他没想到怎么做。。
复制代码

点评

做出了一组,其他组也是同样的方法,只需做个循环,只不过循环时各组之间的拆分动些脑筋。开贴后参考其他同学做法把两题再做一下。继续努力!  发表于 2015-11-15 16:25

评分

参与人数 1 +10 金币 +10 收起 理由
qh8600 + 10 + 10 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2015-11-13 18:47 | 显示全部楼层

姓名:A01-麻花_

第一题:
  1. 不会
复制代码
第二题:
  1. 还是不会
复制代码
第三题:
  1. 真的还是不会...
复制代码
弄了好久,总感觉卡在什么地方出不来。先占一个楼,等开贴后参考其他学员作业看看。
不管是函数,还是VBA,每每老师讲到数组的时候,那感觉就像失恋一样,无法逾越。

点评

VBA数组要比函数数组简单的多。写代码主要是个思路问题,把平时操作思路用代码表现出来就是VBA,唯有多写多练才能有所成。要加油!  发表于 2015-11-15 16:30

评分

参与人数 1 +5 金币 +5 收起 理由
qh8600 + 5 + 5 加油

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-11-15 16:36 | 显示全部楼层
本帖最后由 雪舞子 于 2015-11-15 17:13 编辑

此次作业很多同学的代码写的都非常棒,思路新颖,代码简洁,

以下是仅是我的思路供大家参考,错误之处欢迎大家指正:
  1. Sub 作业一() '利用split() 函数分列出":"前后的数据
  2.     Dim arr, brr(), i&, z&, j%, n%   'arr源数据,brr结果数据,z计数结果数组,n计数每组8行数据
  3.     arr = Range("a1:a" & [a65536].End(3).Row) 'A列数据赋值给数组
  4.     ReDim brr(UBound(arr) / 8, 1 To 8)        '重新定义结果数组,由于源数据是8条数据一组,结果数组不会超过源数组行数除8。结果数组0行给表头保留。
  5.     For i = 1 To 8
  6.         brr(0, i) = Split(arr(i, 1), ":")(0)  '表头写进结果数组(brr)0行
  7.     Next
  8.     z = 1                                     '结果数据行数从1行开始
  9.     For i = 1 To UBound(arr)                  '循环源数据行数1~最后一行
  10.         If Cells(i, 1) <> "" Then             '如果源某条数据不为空,从这条数据开始计数8行(8行一组)
  11.             n = n + 1                         '计数
  12.             brr(z, n) = Split(arr(i, 1), ":")(1)   'z为结果数组行数,n计数源数据,计到8行为止,n同时也是结果数据的列数(共8列)
  13.             If n > 7 Then n = 0: z = z + 1       '上面结果数组写满了8列(源数据也走了8行),即这里n>7,重置n为0,结果数组行数z+1
  14.         End If
  15.     Next
  16.     [c20].Resize(z, 8) = brr
  17. End Sub
  18. Sub 作业二()
  19.     Dim arr, brr(), i%, n%
  20.     arr = Range("c3:c" & [c65536].End(3).Row)  'C列数据赋值给数组
  21.     ReDim brr(1 To UBound(arr) + 12, 1 To 1)   '目测一下源数据没有超过12个月,结果数据最多也就是源数据+12
  22.     For i = 2 To UBound(arr)                   '循环源数据2行开始到结尾
  23.         If Format(arr(i - 1, 1), "m") <> Format(arr(i, 1), "m") Then  '比较上一行与本行月份是否一致,不一致插入1行"yyyy年m月"
  24.             n = n + 1                                                 '行+1
  25.             brr(n, 1) = Format(arr(i, 1), "yyyy年m月")                '插入1行"yyyy年m月"
  26.         End If
  27.         n = n + 1                                                     '计数结果数组行数,行数+1
  28.         brr(n, 1) = arr(i, 1)                                         '源数据写入结果数组
  29.     Next
  30.     [m2].Resize(n) = brr
  31. End Sub
复制代码

评分

参与人数 2 +35 金币 +20 收起 理由
air05 + 15 赞一个!
qh8600 + 20 + 20 很给力!

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2015-11-15 16:37 | 显示全部楼层
作业截止---------------------------------------------------------------------------------------------------------------
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 16:49 , Processed in 0.586422 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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