Excel精英培训网

 找回密码
 注册
查看: 2859|回复: 8

[通知] 【VBA字典数组201301班】B组-第二讲作业上交处

[复制链接]
发表于 2013-11-12 12:38 | 显示全部楼层 |阅读模式
本帖最后由 从从容容 于 2013-11-16 15:55 编辑

本贴为B组 第二讲作业上交专用贴,其它组员勿入

本次作业的要求:
1.要求添加注释(不要求每行都添加,涉及到关键的部分必须有)
2.代码缩进
3.要求变量强制声明(在模块的顶端已添加 option explicit,不得修改),声明变量时对变量的类型不做要求。

上交作业时,直接贴代码即可,
为方便统计,请在回贴时输入 ID与编号
发表于 2013-11-12 16:20 | 显示全部楼层
本帖最后由 幽月儿 于 2013-11-13 11:58 编辑

B06:幽月儿
Option Explicit

Sub 按钮1_Click()
    Dim rgSource As Range
    Dim rgDest As Range
    Dim bGroupCount

    On Error Resume Next
    Set rgSource = Application.InputBox("请选择需要分组的单元格区域", "选择", Type:=8)
    '通过对话框选择要分组的单元格区域
    If rgSource Is Nothing Then
        MsgBox "没有选择要分组的单元格区域"
        Exit Sub
    End If


    Set rgDest = Application.InputBox("请选择分组数据写入的位置", "选择", Type:=8)
    '通过对话框选择分组后的数据需写入的单元格
    If rgDest Is Nothing Then
        MsgBox "没有选择要分组的单元格区域"
        Exit Sub
    End If

    bGroupCount = Application.InputBox("请输入要分成的行数(>=1)", "选择", Default:=2, Type:=2)
    '通过对话框输入数据要分成的行数
    If Val(bGroupCount) < 1 Then
        '检测行数的合法性
        MsgBox prompt:="输入的行数不对" & String(2, vbCrLf) & "没有点击确定", Title:="亲,出错了"
        Exit Sub
    End If

    Call DataPacket(rgSource, rgDest, Val(bGroupCount))
    '调用分组过程
End Sub

Sub DataPacket(rgSource As Range, rgDest As Range, bGroupCount As Byte)
'rgSource:源单元格
'rgdest:写入单元格
'数据分组的行数
'-----------过程的声明不得修改--------------
    Dim i As Integer, j As Integer, k As Integer
    Dim arr
    Dim rg As Range
    i = Application.WorksheetFunction.CountA(rgSource)

    If i Mod 2 Then
        i = i / bGroupCount
    Else
        i = (i + 1) / bGroupCount
    End If
    ReDim arr(1 To bGroupCount, 1 To i)
    j = 1: k = 1
    For Each rg In rgSource
        arr(j, k) = rg.Value
        k = k + 1
        If k > i Then
            j = j + 1
            k = 1
        End If
    Next
    rgDest.Resize(bGroupCount, i) = arr
End Sub

Sub 查询天气()

    Dim strDate$
    Dim strUrl$
    Dim strText$
    Dim strFind$
    Dim arr1, arr2, result(1 To 32, 1 To 6)
    Dim i As Long, j As Byte, k As Byte, m As Byte, ii As Long


    strUrl = "http://lishi.tianqi.com/wuhan/"
    '查询的网址

    strDate = Application.InputBox("请输入要查询的年月格式为YYYYMM" & vbCr & vbCr & "例如:201102" & vbCr & vbCr, , Format(DateAdd("m", -1, Now), "yyyymm"), , , , , 2)
    '查询的年月,输入格式为YYYYMM

    Dim httpRequest As Object
    Set httpRequest = CreateObject("Msxml2.XMLHTTP.3.0")
    '创建XMLHTTP对象,获取网页数据
    '网页数据存储在变量 strText 中
    With httpRequest
        .Open "GET", strUrl & strDate & ".html", False
        .send
        strText = .responseText
    End With

    strFind = "武汉" & Left(strDate, 4) & "年" & Val(Right(strDate, 2)) & "月份天气详情"
    '检测输入的日期是否合格
    i = InStr(strText, strFind)
    If i = 0 Then
        MsgBox "查询月份不对"
        Exit Sub
    End If

    '-------------------------代码需完成部分---------------------------
    '上面的代码和声明部分不得修改
    '代码完成部分所需要的变量声明均写在此行下方即可,方便学委评分


    strText = Mid(strText, i)
    i = InStr(Len(strFind) + 20, strText, "</div>")
    strText = Left(strText, i - 1)
    strText = Replace(strText, "<ul class=""t1"">", "<ul>")

    arr1 = Split(strText, "<ul>")
    arr2 = Split(arr1(1), "<li>")
    m = m + 1

    For k = LBound(arr2) + 1 To UBound(arr2)
        result(m, k) = Left(arr2(k), InStr(arr2(k), "<") - 1)
    Next

    For j = LBound(arr1) + 2 To UBound(arr1)
        arr2 = Split(arr1(j), "<li>")
        m = m + 1
        result(m, 1) = Mid(arr2(1), InStr(arr2(1), ">") + 1, 10)
        For k = LBound(arr2) + 2 To UBound(arr2)
            result(m, k) = Left(arr2(k), InStr(arr2(k), "<") - 1)
        Next
    Next
    Application.ScreenUpdating = False

    With Range("a2")
        .CurrentRegion.ClearContents
        .Resize(m, UBound(result, 2)).Value = result
        .CurrentRegion.EntireColumn.AutoFit
    End With
    Range("a1").Value = strFind
    Application.ScreenUpdating = true
    '------------------------------------------------------------------
    MsgBox "提取完成"

End Sub

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-12 22:20 | 显示全部楼层
B09:wp8680
  1. Option Explicit

  2. Sub 按钮1_Click()
  3.     Dim rgSource As Range
  4.     Dim rgDest As Range
  5.     Dim bGroupCount

  6.     On Error Resume Next
  7.     Set rgSource = Application.InputBox("请选择需要分组的单元格区域", "选择", Type:=8)
  8.     '通过对话框选择要分组的单元格区域
  9.     If rgSource Is Nothing Then
  10.         MsgBox "没有选择要分组的单元格区域"
  11.         Exit Sub
  12.     End If

  13.     Set rgDest = Application.InputBox("请选择分组数据写入的位置", "选择", Type:=8)
  14.     '通过对话框选择分组后的数据需写入的单元格
  15.     If rgDest Is Nothing Then
  16.         MsgBox "没有选择要分组的单元格区域"
  17.         Exit Sub
  18.     End If

  19.     bGroupCount = Application.InputBox("请输入要分成的行数(>=1)", "选择", Default:=2, Type:=2)
  20.     '通过对话框输入数据要分成的行数
  21.     If Val(bGroupCount) < 1 Then
  22.         '检测行数的合法性
  23.         MsgBox prompt:="输入的行数不对" & String(2, vbCrLf) & "没有点击确定", Title:="亲,出错了"
  24.         Exit Sub
  25.     End If

  26.     Call DataPacket(rgSource, rgDest, Val(bGroupCount))
  27.     '调用分组过程

  28.     '--------记录操作----------
  29.     With ActiveSheet.Range("c" & Cells.Rows.Count).End(xlUp)
  30.         .Offset(1, 0) = .Value + 1
  31.         .Offset(1, 1) = rgSource.Address(RowAbsolute:=False, columnabsolute:=False)
  32.         .Offset(1, 2) = rgDest.Address(RowAbsolute:=False, columnabsolute:=False)
  33.         .Offset(1, 3) = Val(bGroupCount)
  34.     End With
  35. End Sub

  36. Sub DataPacket(rgSource As Range, rgDest As Range, bGroupCount As Byte)
  37. 'rgSource:源单元格
  38. 'rgdest:写入单元格
  39. '数据分组的行数
  40. '-----------过程的声明不得修改--------------
  41.     Dim rg As Range, x%, m%, n%
  42.     For Each rg In rgSource    '遍历循环取出数据
  43.         m = (x Mod bGroupCount)    '为重新排组的数据进行定义行位置
  44.         n = Int(x / bGroupCount)    '为重新排组的数据进行定义列位置
  45.         rgDest.Offset(m, n).Value = rg.Value    '取出数据放进定义的行列位置上
  46.         x = x + 1    '记录数据个数
  47.     Next rg
  48. End Sub

  49. Sub 查询天气()

  50.     Dim strDate$
  51.     Dim strUrl$
  52.     Dim strText$
  53.     Dim strFind$
  54.     Dim i As Long


  55.     strUrl = "http://lishi.tianqi.com/wuhan/"
  56.     '查询的网址

  57.     strDate = Application.InputBox("请输入要查询的年月格式为YYYYMM" & vbCr & vbCr & "例如:201102" & vbCr & vbCr, , Format(DateAdd("m", -1, Now), "yyyymm"), , , , , 2)
  58.     '查询的年月,输入格式为YYYYMM

  59.     Dim httpRequest As Object
  60.     Set httpRequest = CreateObject("Msxml2.XMLHTTP.3.0")
  61.     '创建XMLHTTP对象,获取网页数据
  62.     '网页数据存储在变量 strText 中
  63.     With httpRequest
  64.         .Open "GET", strUrl & strDate & ".html", False
  65.         .send
  66.         strText = .responseText
  67.     End With

  68.     strFind = "武汉" & Left(strDate, 4) & "年" & Val(Right(strDate, 2)) & "月份天气详情"
  69.     '检测输入的日期是否合格
  70.     i = InStr(strText, strFind)
  71.     If i = 0 Then
  72.         MsgBox "查询月份不对"
  73.         Exit Sub
  74.     End If

  75.     '-------------------------代码需完成部分---------------------------
  76.     '上面的代码和声明部分不得修改
  77.     '代码完成部分所需要的变量声明均写在此行下方即可,方便学委评分
  78.     Dim st
  79.     Dim x, m, n, a
  80.     Dim arr, brr()
  81.     x = InStr(strText, "武汉" & Left(strDate, 4) & "年" & Val(Right(strDate, 2)) & "月份天气统计") - i    '查出有用数据的结束位置
  82.     st = Mid(strText, i, x)    '提出有用数据
  83.     arr = Split(st, "<li>")    '对数据进行分列,形成一维数组
  84.     For m = 1 To UBound(arr) Step 6    '对数组进行按固定循环(为下面取出数据到brr中)
  85.         n = n + 1
  86.         ReDim Preserve brr(1 To 6, 1 To n)    '重置结果存放数组的大小
  87.         brr(1, n) = Left(strDate, 4) & "-" & Val(Right(strDate, 2)) & "-" & n - 1    '取巧的方法得到日期
  88.         For a = 2 To 6
  89.             brr(a, n) = Split(arr(m + a - 1), "</li>")(0)    '依次取出再次分列后的数据的第一个值。
  90.         Next a
  91.     Next m
  92.     brr(1, 1) = "日期"    '重赋brr的第一个值为日期

  93.     Sheets("作业二结果").Range("a2").Resize(UBound(brr, 2), 6) = Application.WorksheetFunction.Transpose(brr)    '将数组写入表格
  94.     Sheets("作业二结果").Range("a1") = strFind
  95.     '------------------------------------------------------------------
  96.     MsgBox "提取完成"
  97. End Sub
复制代码

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-12 22:27 | 显示全部楼层
B03-zmnyu交第二课时作业,代码没有优化,可能方法复杂了,只帖了答题部分代码,请老师批阅!

第一题:
  1. '-----------过程的声明不得修改--------------
  2.     Dim arr(), brr(), rg
  3.     Dim k As Byte, i As Byte, j As Byte, x As Byte
  4.     If IsArray(rgSource) Then        '如果选定区域为数组

  5.         arr() = rgSource.Value             '把选定区域的值装入数组arr
  6.         k = Int(UBound(arr) * UBound(arr, 2) / bGroupCount + 0.9)    'k为每行单元格的个数
  7.     Else                                 '否则,(选定区域为一个单元格)
  8.         rgDest.Value = rgSource.Value  '直接把这个单元格值返回到要写入的单元格
  9.         Exit Sub                       '退出程序
  10.     End If
  11.     i = 1    '变量i表示结果数组brr的第一维
  12.     ReDim brr(1 To bGroupCount, 1 To k)    '指定结果数组brr的大小
  13.     For Each rg In arr                      '通过for each 循环把arr的值按照规则逐一装入brr
  14.         If j >= k Then
  15.             j = 1       '变量j表示结果数组brr的第二维
  16.             i = i + 1
  17.         Else
  18.             j = j + 1
  19.         End If
  20.         brr(i, j) = rg
  21.     Next
  22.     rgDest.Resize(UBound(brr), UBound(brr, 2)) = brr  '把结果输出到指定单元格区域
  23.     '-----------答题部分结束--------------
复制代码
第二题:
  1.     '-------------------------代码需完成部分---------------------------
  2.     '上面的代码和声明部分不得修改
  3.     '代码完成部分所需要的变量声明均写在此行下方即可,方便学委评分

  4.     Dim arr, brr()
  5.     Dim k As Integer, k1 As Integer, k2 As Integer
  6.     Dim br As Integer, bc As Integer
  7.     arr = Split(strText, "<li>")      '先用Split对strText里面存的网页源码按"<li>"进行分列,结果装入数组arr
  8.     k1 = 999                           '给变量k1指定一个较大的数值
  9.     For k = 1 To UBound(arr)            '对arr进行循环
  10.         If arr(k) Like "日期*" Then k1 = k   '如果在arr的元素里有开头为“日期”字样的,则把当前的k值记录到k1
  11.         If arr(k) Like "*</div>*" And k > k1 Then
  12.               '如果在arr的元素里有包含“</div>”字样的,且k>k1
  13.             k2 = k  '则把当前的k值记录到k1
  14.             Exit For  '取到k2值后,退出当前循环
  15.         End If
  16.     Next
  17.     ReDim brr(1 To (k2 - k1 + 1) / 6, 1 To 6)  '重新定义数组brr大小
  18.     For br = 1 To UBound(brr)
  19.         For bc = 1 To UBound(brr, 2)
  20.             If Left(arr(k1), 7) = "<a href" Then  '如果arr(k1)的前七位为 "<a href",证明其为日期列
  21.                 brr(br, bc) = Left(Split(arr(k1), ">")(1), 10)   '提取出日期并赋值给brr(br,bc)
  22.             Else                                                   '否则呢?
  23.                 brr(br, bc) = Left(arr(k1), InStr(arr(k1), "</li>") - 1)
  24.                       '提取arr(k1)的"</li>"以前的部分,并赋值给brr(br,bc)
  25.             End If
  26.             k1 = k1 + 1   '每循环一次,k1自动加一
  27.         Next
  28.     Next
  29.     With Sheets("作业二结果")              '对工作表“作业二结果”批量操作
  30.         .Range("A1:F33").ClearContents     '清除此工作表A1:F33区域内的全部内容
  31.         .Range("A2:A" & UBound(brr) + 1).NumberFormatLocal = "yyyy/m/d"
  32.                '设置存放日期的A列区域单元格格式为短日期型
  33.         .Range("A1") = strFind   '把变量strFind写入到A1单元格,即“武汉****年*月份天气详情”
  34.         .Range("A2").Resize(UBound(brr), UBound(brr, 2)) = brr
  35.                '把brr输出到以A2为左上角的对应大小的单元格区域内
  36.     End With
  37.     '------------------------------------------------------------------
复制代码
再上传附件一个:

B03-zmnyu【VBA字典数组201301班】第二讲作业【代码需完成】.rar (65.4 KB, 下载次数: 7)

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-13 08:42 | 显示全部楼层
本帖最后由 shanxiren 于 2013-11-13 15:54 编辑

【VBA字典数组201301班】-B07-shanxiren.rar (55.01 KB, 下载次数: 3)

点评

直接贴代码。  发表于 2013-11-13 12:54

评分

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

查看全部评分

回复

使用道具 举报

发表于 2013-11-13 16:40 | 显示全部楼层
B02:望天打卦
先交作业 回头再整

【VBA字典数组201301班】第二讲作业【代码需完成】B02-望天打卦.rar

60.84 KB, 下载次数: 5

点评

要求直接贴出代码,不必上传附件。  发表于 2013-11-14 10:40

评分

参与人数 1金币 +10 收起 理由
从从容容 + 10 第二题没有完成

查看全部评分

回复

使用道具 举报

发表于 2013-11-13 16:49 | 显示全部楼层
本帖最后由 雨后彩霞 于 2013-11-13 20:22 编辑

Sub DataPacket(rgSource As Range, rgDest As Range, bGroupCount As Byte)
Dim arr()
Dim brr()
Dim lx, y, rg, k
Set rgSource = Application.InputBox("请选择需要分组的单元格区域", "选择", Type:=8)
If rgSource Is Nothing Then    '如果 rgSource 是 空值 则执行
    MsgBox "没有选择要分组的单元格区域"
   
    Exit Sub
   
End If
arr = rgSource.Value    'arr= rgSource的值
Set rgDest = Application.InputBox("请选择分组数据写入的位置", "选择", Type:=8)
If rgDest Is Nothing Then    '如果 rgDest 是 空值 则执行
    MsgBox "没有选择要分组的单元格区域"    '<消息框>:"没有选择要分组的单元格区域"
   
    Exit Sub    '退出子程序
   
   
End If
bGroupCount = Application.InputBox("请输入要分成的行数(>=1)", "选择", Default:=2, Type:=2)
lx = (rgSource.Count + bGroupCount) \ bGroupCount    'lx=( rgSource的计数值+bGroupCount)\bGroupCount
ReDim brr(1 To bGroupCount, 1 To lx)    '重定义变量brr(1到bGroupCount,1到lx)
For Each rg In arr   '设定变量范围为每一个rg位于arr'遍历数据源数组Arr
    k = k + 1  '计数器
   
    brr(Int((k - 1) / lx) + 1, ((k - 1) Mod lx) + 1) = rg    'brr(<取整>((k-1)/lx)+1,((k-1)Modlx)+1)=rg'将数据源里的数据分别写入结果数组brr中
   
Next rg
rgDest.Resize(UBound(brr, 1), UBound(brr, 2)) = brr    ' rgDest的<重调大小>(<数组上限>(brr,1),<数组上限>(brr,2))=brr
End Sub




Sub 查询天气()
Dim strDate$
Dim strUrl$
Dim strText$
Dim strFind$
Dim i As Long, v, k%, t, j%, l%
strUrl = "http://lishi.tianqi.com/wuhan/"
'查询的网址
strDate = Application.InputBox("请输入要查询的年月格式为YYYYMM" & vbCr & vbCr & "例如:201102" & vbCr & vbCr, , Format(DateAdd("m", -1, Now), "yyyymm"), , , , , 2)
'查询的年月,输入格式为YYYYMM
Dim httpRequest As Object
Set httpRequest = CreateObject("Msxml2.XMLHTTP.3.0")
'创建XMLHTTP对象,获取网页数据
'网页数据存储在变量 strText 中
With httpRequest
    .Open "GET", strUrl & strDate & ".html", False
    .send
    strText = .responseText
End With
strFind = "武汉" & Left(strDate, 4) & "年" & Val(Right(strDate, 2)) & "月份天气详情"
'检测输入的日期是否合格
i = InStr(strText, strFind)
If i = 0 Then
    MsgBox "查询月份不对"
    Exit Sub
End If
'-------------------------代码需完成部分---------------------------
'上面的代码和声明部分不得修改
'代码完成部分所需要的变量声明均写在此行下方即可,方便学委评分

Sheets("作业二结果").Range("A1:F600").ClearContents    '<工作表>("作业二结果" )的<单元格>区域("A1:F600" )的清除内容

v = Split(strText, "<li>风力</li>")    'v=<分割字符串>(strText,"<li>风力</li>")

v = Split(v(1), "<div style=""clear:both""></div>")    'v=<分割字符串>(v(1),"<div style=""clear:both""></div>")

v = Split(v(0), ".html"">")    'v=<分割字符串>(v(0),".html"">")

Sheets("作业二结果").[A1] = strFind    '<工作表>("作业二结果" )的[A1]=strFind

Sheets("作业二结果").Range("A2:F2") = Split("日期 最高气温 最低气温 天气 风向 风力", " ")    '<工作表>("作业二结果" )的<单元格>区域("A2:F2")=<分割字符串>("日期 最高气温 最低气温 天气 风向 风力"," ")

For i = 1 To UBound(v)    '设定变量范围为i=1到<数组上限>(v)
   
    k = InStr(v(i), "<")    'k=<正向判断字符串出现位置>(v(i),"<")
   
    Sheets("作业二结果").Cells(i + 2, 1) = Left(v(i), k - 1)    '<工作表>("作业二结果" )的<单元格>坐标(i+2,1)=<截取字符串左侧>(v(i),k-1)
   
    t = Split(v(i), "<li>")    't=<分割字符串>(v(i),"<li>")
   
    For j = 1 To UBound(t)    '设定变量范围为j=1到<数组上限>(t)
        
        k = InStr(t(j), "<")    'k=<正向判断字符串出现位置>(t(j),"<")
        Sheets("作业二结果").Cells(i + 2, j + 1) = Left(t(j), k - 1)    '<工作表>("作业二结果" )的<单元格>坐标(i+2,j+1)=<截取字符串左侧>(t(j),k-1)
    Next
Next
'------------------------------------------------------------------
MsgBox "提取完成"
End Sub

评分

参与人数 1金币 +20 收起 理由
从从容容 + 20 第一题有重复

查看全部评分

回复

使用道具 举报

发表于 2013-11-13 18:36 | 显示全部楼层
B05zjyxp上交第二课作业
刚到家先上交第一题 ,请评委老师多关照
  1. Sub DataPacket(rgSource As Range, rgDest As Range, bGroupCount As Byte)
  2. 'rgSource:源单元格
  3. 'rgdest:写入单元格
  4. '数据分组的行数
  5. '-----------过程的声明不得修改--------------
  6.     Dim arr, brr, crr
  7.     Dim n As Integer, m As Integer, k As Integer '声明相关变量
  8.     arr = rgSource.Value '将指定数据读入arr
  9.     ReDim brr(1 To UBound(arr) * UBound(arr, 2), 1 To 1) '重置brr
  10.     For n = 1 To UBound(arr)
  11.         For m = 1 To UBound(arr, 2)
  12.             k = k + 1
  13.             brr(k, 1) = arr(n, m) '将arr数组读入brr
  14.         Next m
  15.     Next n
  16.         k = 0
  17.         ReDim crr(1 To bGroupCount, 1 To (UBound(arr, 2) * UBound(arr)) / bGroupCount) '重置crr
  18.     For m = 1 To (UBound(arr, 2) * UBound(arr)) / bGroupCount
  19.         For n = 1 To bGroupCount
  20.             k = k + 1
  21.             If k > UBound(arr, 2) * UBound(arr) Then Exit For
  22.                 crr(n, m) = brr(k, 1) '将brr数组读入crr
  23.         Next n
  24.     Next m
  25.         rgDest.Resize(UBound(crr), UBound(crr, 2)) = crr '将crr数组读入指定单元格
  26. End Sub
复制代码

评分

参与人数 1金币 +10 收起 理由
从从容容 + 10 还要加油

查看全部评分

回复

使用道具 举报

发表于 2013-11-13 20:52 | 显示全部楼层
【VBA字典数组201301班】B08 缔造者
  1. Option Explicit

  2. Sub 按钮1_Click()
  3.     Dim rgSource As Range
  4.     Dim rgDest As Range
  5.     Dim bGroupCount

  6.     On Error Resume Next
  7.     Set rgSource = Application.InputBox("请选择需要分组的单元格区域", "选择", Type:=8)
  8.     '通过对话框选择要分组的单元格区域
  9.     If rgSource Is Nothing Then
  10.         MsgBox "没有选择要分组的单元格区域"
  11.         Exit Sub
  12.     End If


  13.     Set rgDest = Application.InputBox("请选择分组数据写入的位置", "选择", Type:=8)
  14.     '通过对话框选择分组后的数据需写入的单元格
  15.     If rgDest Is Nothing Then
  16.         MsgBox "没有选择要分组的单元格区域"
  17.         Exit Sub
  18.     End If

  19.     bGroupCount = Application.InputBox("请输入要分成的行数(>=1)", "选择", Default:=2, Type:=2)
  20.     '通过对话框输入数据要分成的行数
  21.     If Val(bGroupCount) < 1 Then
  22.         '检测行数的合法性
  23.         MsgBox prompt:="输入的行数不对" & String(2, vbCrLf) & "没有点击确定", Title:="亲,出错了"
  24.         Exit Sub
  25.     End If

  26.     Call DataPacket(rgSource, rgDest, Val(bGroupCount))
  27.     '调用分组过程
  28. End Sub

  29. Sub DataPacket(rgSource As Range, rgDest As Range, bGroupCount As Byte)
  30. 'rgSource:源单元格
  31. 'rgdest:写入单元格
  32. '数据分组的行数
  33. '-----------过程的声明不得修改--------------
  34.     Dim arr, brr
  35.     Dim r
  36.     Dim m As Integer
  37.     Dim i As Integer, j As Integer, icolumn As Integer
  38.    
  39.     m = 1
  40.    
  41.     If rgSource.Areas.Count > 1 Then '如果选取的区域是多重区域时
  42.         brr = rgSource.Areas(1) '将第一个区域赋值给变量brr
  43.         icolumn = WorksheetFunction.RoundUp(rgSource.Areas(1).Count / bGroupCount, 0) '计算数据分组时应占列数
  44.     Else
  45.         brr = rgSource '选取的区域赋值给变量brr
  46.         icolumn = WorksheetFunction.RoundUp(rgSource.Count / bGroupCount, 0) '计算数据分组时应占列数
  47.     End If
  48.    
  49.     ReDim arr(1 To bGroupCount, 1 To icolumn) '重新定义数组的大小
  50.    
  51.     If rgSource.Count > 1 Or rgSource.Areas(1).Count > 1 Then '如果选取区域的单元格数大于1或者是多重区域时
  52.         
  53.         For Each r In brr '遍历数组brr
  54.         
  55.             j = j + 1 '计数器
  56.             i = m '计数器
  57.             
  58.             If j <= icolumn Then '如果变量j的值小于或等于应占的列数时
  59.                 arr(i, j) = r '给数组赋值
  60.             Else
  61.                 j = 1 '重新计数
  62.                 m = m + 1 '重新计数
  63.                 arr(m, j) = r '给数组赋值
  64.             End If '结束判断
  65.             
  66.         Next r '循环下一个
  67.         
  68.     End If '结束判断
  69.    
  70.     rgDest.Resize(bGroupCount, icolumn).ClearContents '清除结果区域里的内容
  71.    
  72.     If rgSource.Count = 1 Or rgSource.Areas(1).Count = 1 Then '如果选择了一个单元格或者多重区域的第一个区域是单个单元格时
  73.         rgDest = rgSource.Value '写入单元格的值等于选定的单元格的值
  74.     Else '否则
  75.         rgDest.Resize(bGroupCount, icolumn) = arr '将数组arr赋值给写入单元格区域
  76.     End If '结束判断
  77.    
  78. End Sub
复制代码
第二题不会做。

评分

参与人数 1金币 +10 收起 理由
从从容容 + 10 继续努力

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 12:49 , Processed in 0.354352 second(s), 23 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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