Excel精英培训网

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

[习题] 【201401VBA初级】第四讲作业C组上交贴(已开帖)

[复制链接]
发表于 2014-5-3 00:46 | 显示全部楼层 |阅读模式
本帖最后由 xdragon 于 2014-5-10 16:48 编辑

第四讲作业下载地址:http://www.excelpx.com/thread-324104-1-1.html
第四讲视频下载地址:http://www.excelpx.com/thread-323949-1-1.html
本次作业提交要求如下:
1、提交请用代码形式提交,无需上传附件
2、所写代码的关键步骤需要注译(一段代码的作用说明),如不写注译扣5分
3、附件文件名或帖子标题按要求格式命名:组号-论坛ID,
           如:C07-RxJc;
4、C组学员跟帖时,不要重复占楼,修改请在原楼层,本帖已设置回复仅作者可见;
5、非组学员勿跟帖,违者删帖处理;
6、作业截止时间:2014年5月6日,20:00,请准时交作业哈。
发表于 2014-5-4 14:25 | 显示全部楼层
本帖最后由 开心妙妙 于 2014-5-5 18:13 编辑

C16:开心妙妙
暂时先交这些,第二题有时间再想想
  1. Sub 第一题A()
  2.     Dim i&, i1 As Double, sum As Double, t As Single
  3.     t = Time
  4.     i = 1
  5.     Do
  6.         i1 = 1 / i  '需要累加的值
  7.         sum = sum + i1   '累加值
  8.         i = i + 2    'i为分母作为循环步长
  9.     Loop While i1 > 10 ^ -7  '当i1大于10^-7,继续循环
  10.     MsgBox "sum:" & sum & Chr(10) & "运行时间:" & Time - t
  11. End Sub
  12. Sub 第一题B()
  13.     Dim i&, i1 As Double, sum As Double, t As Single
  14.     t = Time
  15.     For i = 1 To (10 ^ 7) + 2 Step 2
  16.         '分母作为循环值,步长为2,终值用10^7,1/10^7值和10^-7是相同的
  17.         '终值+2是因为步长为2,不加2的话到99就不循环,就无法循环最小值为10^-7
  18.         sum = sum + 1 / i  '值累加
  19.     Next i
  20.     MsgBox "sum:" & sum & Chr(10) & "运行时间:" & Time - t    '显示累加值及运行时间
  21. End Sub

  22. Sub 第二题()
  23.     Dim i&, st$, n As Byte
  24. 100:
  25.     i = Val(InputBox("请输入: " & Chr(10) & "大于等于1及小于等于16384的列号", "输入框"))    '用Val将输入的数字转为数值
  26.     If Len(i) <> 0 And i > 0 And i < 16384 Then
  27.         st = Cells(1, i).Address(0, 0)     '用Address 取单第1行第I列的单元格地址
  28.         st = Replace(st, "1", "")          '用Replace将单元格地址行号1替换为""
  29.         MsgBox "列标是 : " & st, , "提示框"
  30.     Else
  31.         MsgBox "输入错误,请重新输入", 64
  32.         n = n + 1                           '计算错误次数
  33.         If n > 3 Then
  34.             MsgBox "错误输入超过三次了,退出程序!", 64
  35.             Exit Sub
  36.         End If
  37.         GoTo 100
  38.     End If
  39. End Sub
  40. Sub 第三题()
  41.     Dim x%, y%, st$, n%
  42.     Dim Arr(1 To 11, 1 To 5)                    '定义数组 Arr(1 TO 11,1 TO 5)
  43.     For x = 1 To 11                             '行循环
  44.         For y = 1 To 5                           '列循环
  45.             If x <= 6 Then                        '判断如果 x<=6, 6是三角形顶点行的行号
  46.                 If x + y - 1 = 6 Then              '如果 行+列-1=6 则等于"*"
  47.                     Arr(x, y) = "*"
  48.                 Else                           '否则等于" "
  49.                     Arr(x, y) = " "
  50.                 End If
  51.                 st = st & " " & (Arr(x, y))       'st=st & "" & (Arr(x,y)) '将数组的值连接到字符串
  52.             Else                            '如果x>6 的,用5,4,3,2,1的行号去加列号
  53.                 n = x Mod 6                     '行号 Mod 6,用余数计算行号的差值
  54.                 If x - n * 2 + y - 1 = 6 Then   '判断行号-行的差值+列号-1=6 则等于"*"
  55.                     Arr(x, y) = "*"
  56.                 Else                         '否则等于" "
  57.                     Arr(x, y) = " "
  58.                 End If
  59.                 st = st & " " & (Arr(x, y))      'st=st & "" & (Arr(x,y)) '将数组的值连接到字符串
  60.             End If
  61.         Next y
  62.         st = st & " " & "*"     '最后1列固定不变的直接连接上"*"
  63.         Debug.Print st           '立即窗口打印连接的字符串
  64.         st = ""                 '将字符串初始化
  65.     Next x
  66. End Sub
  67. Sub 第四题()
  68.     Dim i%, c%  '定义行列变量
  69.     Dim Arr(1 To 4, 1 To 4), Arr1(1 To 4, 1 To 4)  '定义原数组、目标数组大小
  70.     For i = 1 To 4   '行循环
  71.         For c = 1 To 4    '列循环
  72.             Arr(i, c) = Int((10 - 5 + 1) * Rnd() + 5)
  73.             '生成5-10的随机数赋值给数组,10表示最大值,5表示最小值
  74.         Next c
  75.     Next i
  76.     Range("A1").Resize(4, 4) = Arr
  77.     For c = 1 To 4  '列循环
  78.         For i = 1 To 4   '行循环
  79.             Arr1(c, i) = Arr(5 - i, c)
  80.         Next i
  81.     Next c
  82.     Range("F1").Resize(4, 4) = Arr1
  83. End Sub
  84. 'Arr1(c, i) = Arr(5 - i, c) 实现位置转换的关键,原来的列转换为目标数据行
  85. '赋值时行列变量互换,行列互换后,最大的行变成最小的列,用5-i去实现效果
复制代码

点评

第四题转置的结果与题目要求不一致。-2分。 每次重新打开文件,随机数产生的随机数每次都一致,-1分。  发表于 2014-5-8 00:25
第一题没有把10^-7计算在内,一个小缺陷-1分  发表于 2014-5-7 23:31

评分

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

查看全部评分

回复

使用道具 举报

发表于 2014-5-4 14:33 | 显示全部楼层
C04:eaglexs 第四次作业:
  1. Option Explicit

  2. Sub 第一题()
  3.     Dim sums As Double, k As Long
  4.     Do
  5.         sums = sums + 1 / (1 + 2 * k)   '数值累加
  6.         k = k + 1
  7.     Loop Until 1 / (1 + 2 * k) < 10 ^ -7    '当该项数值小于10^-7时退出循环
  8.     Debug.Print sums, k
  9. End Sub

  10. Sub 第二题1()   '截取单元格地址方法
  11.     Dim str As String, col As Integer
  12.     On Error Resume Next        '错误跳过,当inputbox输入不是数字时跳过
  13.     col = InputBox("请输入列数(1-16384)")
  14.     If Err.Number > 0 Then MsgBox "请输入1—16384之间的整数!": Exit Sub    '如果输入错误类型,则提示并退出
  15.     If col <= 0 Or col > 16384 Then MsgBox "请输入1—16384之间的整数!": Exit Sub   '如果输入范围错误,则提示并退出
  16.     str = Left(Cells(1, col).Address(0, 0), Len(Cells(1, col).Address(0, 0)) - 1)   '取输入值对应的列号
  17.     MsgBox col & "的列号是:" & str     '输出
  18. End Sub

  19. Sub 第二题2()       '循环方法
  20.     Dim col As Integer, x As Integer, y As Byte, str As String
  21.     On Error Resume Next
  22.     On Error Resume Next        '错误跳过,当inputbox输入不是数字时跳过
  23.     col = InputBox("请输入列数(1-16384)")
  24.     If Err.Number > 0 Then MsgBox "请输入1—16384之间的整数!": Exit Sub    '如果输入错误类型,则提示并退出
  25.     If col <= 0 Or col > 16384 Then MsgBox "请输入1—16384之间的整数!": Exit Sub   '如果输入范围错误,则提示并退出
  26.     x = col
  27.     Do
  28.         y = x Mod 26                    '取余
  29.         str = Chr(64 + y) & str         '把余数转换为对应的大写字母,并合并
  30.         x = x \ 26                      '把数值除以26后取整,并循环
  31.     Loop Until x = 0                    '如果x=0则退出循环
  32.     MsgBox col & "的列号是:" & str     '输出
  33. End Sub

  34. Sub 第三题()
  35.     Dim i As Byte
  36.     Do                  '打印上半部分,当i<6时继续循环
  37.         If i > 0 Then
  38.             Debug.Print Space(10 - 2 * i) & "*" & Space(2 * i - 1) & "*"
  39.         Else            'i=0,打印空格+一个“*”
  40.             Debug.Print Space(10) & "*"
  41.         End If
  42.         i = i + 1       '计数增加
  43.     Loop While i < 6
  44.     i = 5
  45.     Do While i > 0      '打印下半部分,当i>0时继续循环
  46.         i = i - 1       '计数减少
  47.         If i > 0 Then
  48.             Debug.Print Space(10 - 2 * i) & "*" & Space(2 * i - 1) & "*"
  49.         Else
  50.             Debug.Print Space(10) & "*"
  51.         End If
  52.     Loop
  53. End Sub
  54. Sub 第四题()
  55.     Dim i As Byte, j As Byte, su As Byte
  56.     Dim arr(1 To 4, 1 To 4) As Integer, brr(1 To 4, 1 To 4) As Integer
  57.     Randomize                       '初始化随机种子
  58.     For i = 1 To 4
  59.         For j = 1 To 4
  60.             su = Int(Rnd * 6) + 5   '取5-10之间的随机数
  61.             arr(i, j) = su          'arr数组赋值
  62.             brr(5 - j, i) = su      'brr数组实现左翻90°
  63.         Next
  64.     Next
  65.     Range("b7").Resize(4, 4) = arr  '把数组写回单元格
  66.     Range("g7").Resize(4, 4) = brr
  67.     Columns("b:j").AutoFit          '自动调整列宽
  68. End Sub
复制代码

点评

第二题方法一正确,综合下,不扣分 =、=  发表于 2014-5-4 23:14
第二题输入 26 的整数列返回错误列号。。。  发表于 2014-5-4 23:13
第三题分开2段循环略显复杂,结果都正确。 第四题考虑很周全,满分。  发表于 2014-5-4 15:02

评分

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

查看全部评分

回复

使用道具 举报

发表于 2014-5-4 16:11 | 显示全部楼层
本帖最后由 ghostcan 于 2014-5-5 08:32 编辑
  1. C01-ghostcan '多谢龙哥指点,已经全部自己检查了一下,并且把代码重新粘贴下来自己测试了,结果没有问题了,嘿嘿!你指导的简洁的写法我就不贴了...,再次感谢!
复制代码
  1. Sub 第一题()
  2.     Dim num As Double, n As Long        'num 为小数型
  3.     n = 1                               'n初始化
  4.     Do
  5.         num = num + 1 / n
  6.         n = n + 2
  7.     Loop Until 1 / n < 10 ^ -7          '循环结束条件
  8.     MsgBox num
  9. End Sub
复制代码
  1. Sub 第二题2()
  2.     Dim Inum$, n, OK As Boolean, str As String           'n 可能为整数小数
  3.     Do
  4.         Inum = InputBox("请输入一个整数", "输入提示")    'inputbox 返回值位string类型
  5.         n = Val(Inum)                                   '转换输入内容
  6.         If n < 1 Or n > 16384 Or n Mod 1 > 0 Then
  7.             MsgBox "输入错误", vbCritical, "错误提醒"    '循环确定输入的是一个符合要求的值
  8.             OK = False
  9.         Else
  10.             OK = True
  11.         End If
  12.     Loop Until OK
  13.     str = Cells(1, n).Address(0, 0)
  14.     MsgBox Left(str, Len(str) - 1) & "列"
  15. End Sub
复制代码
  1. Sub 第二题()
  2.     Dim Inum$,  n, m%, i%, ii%, arr(), OK As Boolean, str$     'n 可能为整数小数
  3.     Do
  4.         Inum = InputBox("请输入一个整数", "输入提示")    'inputbox 返回值位string类型
  5.         n = Val(Inum)                                   '转换输入内容
  6.         If n < 1 Or n > 16384 Or n Mod 1 > 0 Then
  7.             MsgBox "输入错误", vbCritical, "错误提醒"    '循环确定输入的是一个符合要求的值
  8.             OK = False
  9.         Else
  10.             OK = True
  11.         End If
  12.     Loop Until OK
  13.     Do                                                  '循环转换输入值位26进制
  14.         m = n Mod 26
  15.         If m = 0 Then
  16.             n = Int(n / 26) - 1
  17.         Else
  18.             n = Int(n / 26)
  19.         End If
  20.         i = i + 1
  21.         ReDim Preserve arr(1 To i)
  22.         arr(i) = m
  23.     Loop Until n = 0
  24.     For ii = UBound(arr) To 1 Step -1                   '把对应26进制的值转换为字母
  25.         If arr(ii) = 0 Then
  26.             arr(ii) = "Z"
  27.             str = str & arr(ii)
  28.         Else
  29.             arr(ii) = Chr(arr(ii) + 64)
  30.             str = str & arr(ii)
  31.         End If
  32.     Next
  33.     MsgBox str & "列", vbOKOnly, "对应的列标是:"          '输出
  34. End Sub
复制代码
  1. Sub 第三题()
  2.     Dim i As Byte, j As Byte                            '定义循环变量
  3.     For i = 1 To 11                                     '两层循环
  4.         For j = 1 To 11
  5.             If i <= 6 Then                              '通过图片找规律,确定条件
  6.                 If j = 11 Then
  7.                     Debug.Print "*"
  8.                 Else
  9.                     If 2 * i - 1 + j = 12 Then Debug.Print "*"; Else Debug.Print Space(1);
  10.                 End If
  11.             Else
  12.                 If j = 11 Then
  13.                     Debug.Print "*"
  14.                 Else
  15.                     If 2 * (i - 6) + 1 = j Then Debug.Print "*"; Else Debug.Print Space(1);
  16.                 End If
  17.             End If
  18.         Next
  19.     Next
  20. End Sub
复制代码
  1. Sub 第四题()
  2.     Dim arr(1 To 4, 1 To 4), brr(1 To 4, 1 To 4), i As Byte, j As Byte, m As Byte, n As Byte '定义两个4*4数组接收结果,我习惯性不定义数组类型...
  3.     For i = 1 To 4                                                                           '2维数组,2层循环
  4.         For j = 1 To 4
  5.             arr(i, j) = VBA.Int((10 - 5 + 1) * Rnd) + 5                                      '生成随机整数,[5-10]
  6.         Next
  7.     Next
  8.     For m = 1 To 4                                                                           '根据对应关系,循环得到转置结果
  9.         For n = 1 To 4
  10.             brr(m, n) = arr(n, 5 - m)
  11.         Next
  12.     Next
  13.     Sheets(2).[a1].Resize(4, 4) = arr                                                        '输出对应结果至单元格区域
  14.     Sheets(2).[f1].Resize(4, 4) = brr
  15. End Sub
复制代码

点评

第四题有个小错误,每次在打开文件时,依次生成的随机数始终是相同的。-1分,其他都正确。  发表于 2014-5-4 23:17

评分

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

查看全部评分

回复

使用道具 举报

发表于 2014-5-5 21:06 | 显示全部楼层
Sub vba1()
Dim sum As Double
Dim n As Double
n = 1
Do
sum = sum + 1 / n
n = n + 2
Loop Until 1 / n < 10 ^ -7
   MsgBox sum & Chr(13) & n
End Sub



学委 题太难了
难得我都不会

点评

可参照其他同学的答案哈。加油  发表于 2014-5-8 21:15

评分

参与人数 1 +8 金币 +8 收起 理由
xdragon + 8 + 8 加油!

查看全部评分

回复

使用道具 举报

发表于 2014-5-6 19:52 | 显示全部楼层
C07-RxJc
缺了次,感觉少了很多很多,憋到Deadline,只憋出第一题~~
  1. Sub test1()
  2.    Dim a As Long
  3.    Dim sum As Single
  4.    Dim item As Single
  5.    
  6.    a = 1
  7.    item = 1 / a
  8.    
  9.    Do While item > 0.0000001
  10.    sum = sum + item
  11.    a = a + 2
  12.    item = 1 / a
  13.    Loop
  14.    MsgBox ("最终结果:" & sum & "  最终项:" & item)
  15. End Sub
复制代码

点评

可参照其他同学的答案哈。加油  发表于 2014-5-8 21:16

评分

参与人数 1 +8 金币 +8 收起 理由
xdragon + 8 + 8 加油

查看全部评分

回复

使用道具 举报

发表于 2014-5-6 19:57 | 显示全部楼层
本帖最后由 as0810114 于 2014-5-6 21:58 编辑

Sub 第一题()
Dim i As Long, Esum As Double
Do While 1 / (2 * i + 1) > 10 ^ -7
i = i + 1
Esum = 1 / (2 * i - 1) + Esum
Loop
MsgBox Esum
End Sub
Sub 第二题()
Dim a As String
a = InputBox("请输入1至" & Columns.Count & "之间的正整数")
Select Case Val(a)
    Case 703 To Columns.Count
        MsgBox Chr((a - 703) \ 26 ^ 2 + 65) & Chr((Int((a - 1) / 26) - 1) Mod 26 + 65) & Chr((a - 1) Mod 26 + 65)
    Case 27 To 702
        MsgBox Chr(((a - 1) \ 26 + 64)) & Chr((a - 1) Mod 26 + 65)
    Case 1 To 26
        MsgBox Chr(a + 64)
End Select
End Sub
Sub 第三题()
Dim arr(1 To 11, 1 To 6), i As Integer, j As Integer
For i = 1 To 11
    For j = 1 To 6
        If j = Abs(6 - i) + 1 Or j = 6 Then
        arr(i, j) = "*"
        Else
        arr(i, j) = " "
        End If
    Next
Next
For i = 1 To 11
Debug.Print Join(Application.Index(arr, i, 0))
Next
End Sub
Sub 第四题()
Dim arr(1 To 4, 1 To 4), brr(1 To 4, 1 To 4), i As Byte, j As Byte
Randomize
For i = 1 To 4
    For j = 1 To 4
        arr(i, j) = Int(5 + 6 * Rnd())
    Next
Next
Range("A10").Resize(4, 4) = arr()
For i = 1 To UBound(arr())
    For j = 1 To UBound(arr())
        brr(i, j) = arr(j, 5 - i)
    Next
Next
Range("A15").Resize(4, 4) = brr()
End Sub

评分

参与人数 1 +20 金币 +20 收起 理由
xdragon + 20 + 20 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2014-5-6 19:58 | 显示全部楼层
没做出来
  1. Sub 累加()
  2.     Dim i As Single '定义变量为单精度
  3.     Dim n As Long '定义变量为长整型
  4.     Do While n <= 10 ^ 7
  5.     If n >= 1 And 1 = n Mod 2 Then '变量n大于等于1且为奇数时,进行下一步
  6.     i = 1 + 1 / n
  7.      Exit Do
  8.     MsgBox i
  9.     End If
  10.     Loop
  11. End Sub
复制代码

点评

可参照其他同学的答案哈。加油  发表于 2014-5-8 21:20

评分

参与人数 1 +8 金币 +8 收起 理由
xdragon + 8 + 8 加油

查看全部评分

回复

使用道具 举报

发表于 2014-5-6 20:19 | 显示全部楼层
本帖最后由 开心妙妙 于 2014-5-6 20:37 编辑

回复

使用道具 举报

发表于 2014-5-6 21:08 | 显示全部楼层

  1. 第一题
  2.     Sub t1()
  3.     Dim x As Double
  4.     Dim n As Long
  5.     x = 0
  6.     n = 1
  7.     Do While 1 / n >= 10 ^ -7
  8.         x = x + 1 / n
  9.         n = n + 2
  10.     Loop
  11.     MsgBox ("结果为:" & x)
  12. End Sub

  13. 第二题
  14. Sub t2()
  15.     Dim i As Integer
  16.     Dim s As String
  17.     i = InputBox("请输入数字:")
  18.         If i > 0 And i < 16385 Then
  19.             s = VBA.Split(Cells(1, i).Address, "$")(1)
  20.             Debug.Print (s)
  21.         Else
  22.         MsgBox "请重新输入"
  23.         End If
  24. End Sub
复制代码

点评

第一题结果与题目要求不符,语法都正确;第二题结果正确。第三、第四题做出来,加油~~  发表于 2014-5-8 21:23

评分

参与人数 1 +10 金币 +10 收起 理由
xdragon + 10 + 10 淡定

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 20:19 , Processed in 0.283211 second(s), 19 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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