|
D05:w2001pf
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)
Dim i As Long, j As Long, m As Long, n As Long
Dim arr, arrjg
'rgSource:源单元格
'rgdest:写入单元格
'数据分组的行数
'-----------过程的声明不得修改--------------
If Selection.Count > 1 Then
'先判断选定的单元格区域的个数,个数大于1则把选定的区域装入数组arr中,否则直接把选定的单元格赋值给目标单元格
arr = rgSource.Areas.item(1)
If UBound(arr) * UBound(arr, 2) Mod bGroupCount = 0 Then '计算结果数组的列数
m = UBound(arr) * UBound(arr, 2) / bGroupCount
Else
m = Int(UBound(arr) * UBound(arr, 2) / bGroupCount) + 1
End If
ReDim arrjg(1 To bGroupCount, 1 To m)
'定义一个结果数组,数组的行数为指定的行数
For i = 1 To UBound(arr) '在数组arr中循环,结果写入到结果数组中
For j = 1 To UBound(arr, 2)
n = n + 1
arrjg(Int((n - 1) / UBound(arrjg, 2)) + 1, (n - 1) Mod UBound(arrjg, 2) + 1) = arr(i, j)
'结果数组的行数为(n-1)除以结果数组的列数的商取整后加1,结果数组的列数为(n-1)除以结果数组的列数余数加1
Next j
Next i
Range(rgDest.Address).Resize(UBound(arrjg), UBound(arrjg, 2)) = arrjg
Else
Range(rgDest.Address) = rgSource
End If
End Sub
Sub 查询天气()
Dim strDate$
Dim strUrl$
Dim strText$
Dim strFind$
Dim i 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
'-------------------------代码需完成部分---------------------------
'上面的代码和声明部分不得修改
'代码完成部分所需要的变量声明均写在此行下方即可,方便学委评分
Dim arr, tianshu, arrjg, m
arr = Split(strText, "<li>") '把网页数据分列成数组
m = DateValue(Left(strDate, 4) & "/" & Right(strDate, 2) & "/" & "01")
'把指定年月变成标准的日期格式
tianshu = Day(DateSerial(Year(m), Month(m) + 1, 0))
'计算当月的天数
ReDim arrjg(1 To tianshu + 1, 1 To 6)
'定义一个数组装入当月的记录
For i = 10 To (tianshu + 1) * 6 + 9
If InStr(arr(i), strDate) > 0 Then '判断是否包含日期
arrjg(Int((i - 10) / 6) + 1, (i - 10) Mod 6 + 1) = Split(Right(arr(i), 33), "</a></li>")(0)
'结果数组的行数为(i-10)除以结果数组的列数的商取整后加1,结果数组的列数为(i-10)除以结果数组的列数余数加1
Else
arrjg(Int((i - 10) / 6) + 1, (i - 10) Mod 6 + 1) = Split(arr(i), "</li>")(0) '把数组中的"</li>"切掉
End If
Next i
With Sheets("作业二结果") '把结果写入到指定位置中
.UsedRange = ""
.Range("A1") = strFind
.Range("A2").Resize(UBound(arrjg), UBound(arrjg, 2)) = arrjg
End With
'------------------------------------------------------------------
MsgBox "提取完成"
End Sub
|
评分
-
查看全部评分
|