ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E问E答 > Excel VBA > 如何运用VBA模仿网站模糊查询城市名,并获取其天气预报

如何运用VBA模仿网站模糊查询城市名,并获取其天气预报

作者:绿色风 分类: 时间:2022-08-17 浏览:241
楼主
xmyjk
Q:如图,像图片所示的网站一样模糊查询城市名,并获得该城市的天气预报?

 

A:
原理简要分析:
运用textbox的change事件,只要在文本框输入文字,就调用查询程序名程序,向网址发包。
取回城市名的数据后,再将listbox显示出来,并将城市数据进行显示。
当鼠标点击listbox后,将所点击的Listbox的城市数据进行发包,向服务器取得天气预报数据。
取得天气预报数据后,弹出窗口提示,隐藏listbox。

程序演示如图:

 
  1. Option Explicit

  2. Sub t(sea As String)
  3.     Dim url As String, tmp, arr, i&
  4.     url = "http://toy.weather.com.cn/SearchBox/searchBox?keyword=" & Escape(Trim(sea)) '设置城市名的查询URL
  5.     On Error Resume Next
  6.     With CreateObject("Microsoft.XMLHTTP")
  7.         .Open "get", url, False '发包
  8.         .setRequestHeader "Connection", "keep-alive" '设置头部消息
  9.         .setRequestHeader "DNT", "1"
  10.         .send
  11.         tmp = Split(.responsetext, "n"":""") '获取各城市名至数组
  12.     End With
  13.     If IsArray(tmp) Then
  14.         tmp = Filter(tmp, "d"":""")
  15.         ReDim arr(0 To UBound(tmp)) '整理文本数据流
  16.         For i = 0 To UBound(tmp)
  17.             arr(i) = Split(Split(tmp(i), "d"":""")(1), """,")(0) & "-" & Split(tmp(i), """,")(0) & ":" & Split(Split(tmp(i), "i"":""")(1), """,")(0)
  18.         Next
  19.     End If
  20.     ListBox1.Visible = True '在列表框进行输出
  21.     ListBox1.List = arr
  22.     If Err <> 0 Then MsgBox "错误!"
  23.     On Error GoTo 0
  24. End Sub
  25. Public Function Escape(ByVal strText As String) As String '转码,将文字转为URL可用的内码向服务器发送
  26.     Dim JS As Object
  27.     Set JS = CreateObject("scriptcontrol")
  28.     JS.Language = "JavaScript"
  29.     Escape = JS.Eval("encodeURI('" & Replace(strText, "'", "\'") & "');")
  30. End Function


  31. Private Sub ListBox1_Click()
  32.     Call qi(Trim(Str(Split(ListBox1.List(ListBox1.ListIndex), ":")(1)))) '一旦被点击,识别被选中的项目,调用天气查询的程序
  33.     ListBox1.Clear
  34.     ListBox1.Visible = False
  35.     TextBox1.Value = ""
  36. End Sub

  37. Private Sub TextBox1_Change()
  38.     If Len(Trim(TextBox1.Value)) > 0 Then Call t(TextBox1.Value) Else ListBox1.Clear: ListBox1.Visible = False '调用城市查询程序
  39. End Sub

  40. Private Sub UserForm_Initialize() '初始化界面,使Listbox隐藏
  41.     ListBox1.Clear
  42.     ListBox1.Visible = False
  43. End Sub

  44. Sub qi(dai As String)
  45.     Dim xmlhttp As Object, dqyb As String, jryb As String
  46.     Dim url As String
  47.     url = "http://www.weather.com.cn/data/sk/" & dai & ".html" '查询所点击的天气预报
  48.     Set xmlhttp = CreateObject("Microsoft.XMLHTTP")
  49.     On Error Resume Next
  50.     With xmlhttp
  51.         .Open "get", url, False '发包获取气温
  52.         .send
  53.         dqyb = Split(Split(.responsetext, "city"":""")(1), """")(0) & "当前气温:" & Split(Split(.responsetext, "temp"":""")(1), """")(0) & "度"
  54.         .Open "get", "http://www.weather.com.cn/weather/" & dai & ".shtml", False '发包获取一周预报
  55.         .send
  56.         jryb = "Today is " & Trim(Split(Split(.responsetext, "一周天气预报:")(1), "</title>")(0))
  57.     End With
  58.     Set xmlhttp = Nothing
  59.     If Err <> 0 Then MsgBox "错误!" Else MsgBox dqyb & vbCrLf & jryb
  60.     On Error GoTo 0
  61. End Sub

  62. Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  63.     Application.Visible = True
  64.     Application.Quit
  65. End Sub

天气查询.zip
2楼
海洋之星
嘿嘿,VBA学习中,希望弦月多多指导.
3楼
亡者天下
这个功能现在很多网站都在用啊

4楼
水星钓鱼
原来这个转码函数,杨版早就用了。
5楼
老糊涂


免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap