ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8265|回复: 8

[分享] VBA网抓之自定义EXCEL天气预报函数可查询最近7天的天气

[复制链接]

TA的精华主题

TA的得分主题

发表于 2017-1-10 08:14 | 显示全部楼层 |阅读模式
天气预报很多人都做过,我这个版本的一部分代码也来自于网友分享,不同的是我进行升级,做了城市代码自动查询以及7天任意时间组合的参数查询 QQ图片20170110081430.png
视频演示如下
http://excel880.com/blog/archives/979
代码如下
  1. 'Option Explicit
  2. '作者 百度不到去谷歌 excel880.com 作品2016-01-04
  3. '根据城市名称查询最近7天天气预报
  4. '预报天数为逗号分隔的参数,不写返回今天,直接写0的话是7天全部,其余形式 1-7 写哪几个就返回哪几天
  5. '例如 天气预报("武汉", "1,2") 返回今天和明天 2,3返回明天和后天 可自由组合
  6. Function 天气预报(城市, Optional 预报天数 = "1")
  7. Dim brr, arr
  8.     brr = TQYB(城市)
  9.     If 预报天数 = 0 Then 预报天数 = "1,2,3,4,5,6,7"
  10.     arr = Split(预报天数, ",")
  11.     For i = 0 To UBound(arr)
  12.         天气预报 = 天气预报 & vbCrLf & Trim(brr(Val(arr(i)) - 1))
  13.     Next
  14.     天气预报 = Mid(天气预报, 3)
  15. End Function
  16. Function TQYB(城市)  'g根据城市返回7天结果数组
  17.     exstr = String(20, " ")
  18.     Set regex = CreateObject("vbscript.regexp")
  19.     regex.Global = True
  20.     regex.Pattern = "[\u0100-\uffff]"
  21.     arr = Split("h1,0,14,p,0,18,p,1,10,i,1,10", ",")
  22.     Dim brr
  23.     With CreateObject("Microsoft.XMLHTTP")
  24.         .Open "GET", CityUrl(城市) & "?r=" & Rnd, True
  25.         .send
  26.         While .readystate <> 4
  27.             DoEvents
  28.         Wend
  29.         If .Status <> 200 Then
  30.             Exit Function
  31.         End If
  32.         mystr = .responsetext
  33.     End With
  34.     With CreateObject("htmlfile")
  35.         .designmode = "on"
  36.         .Open
  37.         .writeln mystr
  38.         mystr = ""
  39.         For Each ul In .getelementsbytagname("ul")
  40.             If ul.classname = "t clearfix" Then
  41.                 For Each li In ul.getelementsbytagname("li")
  42.                     For N = LBound(arr) To UBound(arr) Step 3
  43.                         Set t = li.getelementsbytagname(arr(N))
  44.                         st = t.Item(CInt(arr(N + 1))).innertext
  45.                         If N + 3 < UBound(arr) Then
  46.                             mystr = mystr & Left(st & exstr, CInt(arr(N + 2)) - regex.Execute(st).Count)
  47.                         Else
  48.                             mystr = mystr & st
  49.                         End If
  50.                     Next
  51.                     mystr = mystr & vbCrLf
  52.                 Next
  53.             End If
  54.         Next
  55.     End With
  56.     brr = Split(mystr, vbCrLf)
  57.     TQYB = brr
  58. End Function


  59. Public Function GetBody(ByVal URL$)
  60.     Dim ObjXML
  61.     On Error Resume Next
  62.     Set ObjXML = CreateObject("Microsoft.XMLHTTP")
  63.     With ObjXML
  64.         .Open "Get", URL, False, "", ""
  65.         .setRequestHeader "If-Modified-Since", "0"
  66.         .send
  67.         GetBody = .responsetext
  68.     End With
  69.     ' = BytesToBstr(GetBody, Coding)
  70.     Set ObjXML = Nothing
  71. End Function

  72. Function CityUrl(city)
  73.     Dim s
  74.     s = GetBody("http://www.cnblogs.com/wf225/p/4090737.html") '天气网城市代码a
  75.     CityUrl = regGet(s, "\d+=" & city)
  76.     If CityUrl <> "" Then CityUrl = "http://www.weather.com.cn/weather/" & Left(CityUrl, 9) & ".shtml"
  77. End Function
  78. Public Function regGet(s, pString) '返回正则匹配\d[^_]*\d
  79.     Dim matchs, regex
  80.     regGet = ""
  81.     On Error Resume Next
  82.     Dim temp, N
  83.      Set regex = CreateObject("VBScript.RegExp")
  84.     With regex
  85.         .Global = True
  86.         .IgnoreCase = True
  87.         .Pattern = pString
  88.         Set matchs = .Execute(s)
  89.     End With
  90.     regGet = matchs(0).Value
  91.     Set regex = Nothing
  92.     Set matchs = Nothing
  93. End Function
复制代码




补充内容 (2020-9-18 14:55):
最新更新版本http://excel880.com/blog/archives/6955

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2017-1-10 14:51 | 显示全部楼层
你的作品日期是2016-01-04,还是 2017-01-04?

TA的精华主题

TA的得分主题

 楼主| 发表于 2017-1-18 23:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2017-3-25 16:26 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
占一座位,好好学习

TA的精华主题

TA的得分主题

发表于 2017-4-27 23:20 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
不错的天气预报vba

TA的精华主题

TA的得分主题

发表于 2019-3-15 15:08 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
收藏学习,这个很有用

TA的精华主题

TA的得分主题

发表于 2019-5-30 11:46 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-9-17 10:20 | 显示全部楼层
楼主能不能在你这个功能上进行扩展呢,筛选省内或者周边城市,适合进行自驾露营游泳等活动的功能。比如,天气太热、下雨,不适合露营,天气太热适合游泳。天气太冷不适合游泳,有云有雨适合爬山看云海等等。

TA的精华主题

TA的得分主题

发表于 2023-6-2 11:22 | 显示全部楼层
您好,请问下天气网城市代码 能否从表格里面获取呢?网址上面不是很全
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-24 05:45 , Processed in 0.047110 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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