ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南

[分享] 在winHttp中使用同步与异步。。。

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2015-9-18 09:33 | 显示全部楼层
本帖已被收录到知识树中,索引项:网页交互
感谢分享,学习一下!

TA的精华主题

TA的得分主题

发表于 2016-1-9 22:25 | 显示全部楼层
浮华、缠绕指尖 老师: 在你的 "winHttp异步之数组输出" 例子中, 当在标准模块中并发请求后,即:

For i = 1 To m
      With arr(i)
            .getP = i
            .BeginRequest
      End With
Next

然后,在类模块中输出:

Private Sub winHttp_OnResponseFinished()
     strt =  StrConv(winHttp.ResponseBody, vbUnicode, &H804)    '输出 m 页数据。问题:如何把这m个数据合并在一起,并赋值给变量 strt
End Sub

到这里,我虽然很多是看不懂,但测试了,是效果不错的。我现在的问题是: 如果我不在winHttp_OnResponseFinished()中输出结果,而是把取得的数据合并(即把m个数据合并在一起)后赋值给变量 strt ,然后在其他的模块中调用。(如在发生请求的模块,或其他的标准模块)。我试了,在其他的模块中调用strt是空值。

希望浮华、缠绕指尖老师以及其他有看到的老师们赐教,在此先谢谢了...

TA的精华主题

TA的得分主题

发表于 2016-1-10 09:55 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
WebConNum 发表于 2016-1-9 22:25
浮华、缠绕指尖 老师: 在你的 "winHttp异步之数组输出" 例子中, 当在标准模块中并发请求后,即:

For i  ...

strt =  StrConv(winHttp.ResponseBody, vbUnicode, &H804)    代表采集一次网址数据,记录只有一条.如果你要将N个数据采集结果,合并,也只能在全部数据采集完毕后,另写代码

TA的精华主题

TA的得分主题

发表于 2016-1-10 11:09 | 显示全部楼层
本帖最后由 WebConNum 于 2016-1-10 11:11 编辑
onlycxb 发表于 2016-1-10 09:55
strt =  StrConv(winHttp.ResponseBody, vbUnicode, &H804)    代表采集一次网址数据,记录只有一条.如果 ...

我这样试了, 这里先假设 m=10, 即请求10个网址, 这10个页面的数据都不一样,但结构一样.
Private Sub winHttp_OnResponseFinished()
     strt =  StrConv(winHttp.ResponseBody, vbUnicode, &H804)   
     msgbox strt
End Sub
运行结果是,弹窗10次,也是你对应页面上的数据.  我的意思是: 能不能将这10个数据合并在一起,重新赋值给一个新变量,比如 AAA. 就是说,不在OnResponseFinished()中处理数据,而只是将数据取出存入变量AAA中,然后在其他的模块中处理AAA数据.

TA的精华主题

TA的得分主题

发表于 2016-1-10 11:44 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
WebConNum 发表于 2016-1-10 11:09
我这样试了, 这里先假设 m=10, 即请求10个网址, 这10个页面的数据都不一样,但结构一样.
Private Sub win ...

不明白你的意思.好像那样失去了利用类模块建立异步程序的意义了

TA的精华主题

TA的得分主题

 楼主| 发表于 2016-1-10 14:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
WebConNum 发表于 2016-1-9 22:25
浮华、缠绕指尖 老师: 在你的 "winHttp异步之数组输出" 例子中, 当在标准模块中并发请求后,即:

For i  ...

噢,这个呀,比如你建立一个arr(1 to 10)的数组,那你异步10个网页的数据分别放在里面,这个arr不就是你想要的变量了吗?这时你再处理这个arr不就完事了

TA的精华主题

TA的得分主题

发表于 2016-1-10 14:53 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
onlycxb 发表于 2016-1-10 11:44
不明白你的意思.好像那样失去了利用类模块建立异步程序的意义了

没有失去异步的意义,当winHttp.ResponseText输出成功时,我们利用异步的目的就已经达到了。接下来就是对输出结果进行分析/处理,取出我们需要的部分。而我的意思就是,这个分析/处理过程不在OnResponseFinished()中进行,而是在其他模块中进行。我这样想是因为:如果我们要抓取的网站(或页面结构)不一样,那么,是不是就得需要多个这样的类模块?比如说:第1次请求10页面,页面结构和数据结构都一样,那么,我们可以在OnResponseFinished()中循环分析/处理这10请求返回的结果,这时需要一些代码(这里假设为代码A)来完成这个处理过程;但是,如果我第2次请求的网页跟第1次的不同,网站或页面结构或数据结构等都不一样,那么代码A就不适合处理了,就必须重新写代码,那不就是要再建立一个新的类模块了,如果是N个,那就得有N个类模块了...所以我才想,在OnResponseFinished()中取得输出结果,即winHttp.ResponseText,然后赋值给一个变量,如AAA,然后在其他的模块中再分析处理这些数据,取出我们所需要的部分,这样,类模块一个就可以了。毕竟,我们用异步最主要的目的就是想提高采集速度,而且采集的页面一般都不会是少数(包括页面结构也是多样的),否则,就直接使用同步就好了。不知道这样说,能看明白吗?

TA的精华主题

TA的得分主题

发表于 2016-1-10 15:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
浮华、缠绕指尖 发表于 2016-1-10 14:52
噢,这个呀,比如你建立一个arr(1 to 10)的数组,那你异步10个网页的数据分别放在里面,这个arr不就是你 ...

哦,老师来了,太好了... 我是有试过存入一变量,因为输出的结果是字符串,我把这变量定义为string(全局变量),但结果是这个变量在其他模块中读取时是空值。但没有想到过存入数组,我这就去试试... 谢谢老师指点。

TA的精华主题

TA的得分主题

发表于 2016-1-10 16:23 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
浮华、缠绕指尖 发表于 2016-1-10 14:52
噢,这个呀,比如你建立一个arr(1 to 10)的数组,那你异步10个网页的数据分别放在里面,这个arr不就是你 ...

老师,还在吗? 我试了,还是不行:  '先全局声明了数组arrT()

ReDim arrT(1 To 10)
Private Sub winHttp_OnResponseFinished()
for i=1 to 10
     arrT(i) = winHttp.ResponseText  
next i
End Sub
然后我在标准模块中取值:
for ii=1 to 10
    msgbox arrT(ii)
next ii
结果是,有时候也是空值, 有值得时候,输出的都是同一个值(即只是其中一页面返回的值,而不是10个页面的值). 另外,我又试了只发送一个请求:  即m=1(只是请求一个页面),然后:
Private Sub winHttp_OnResponseFinished()
     strT = winHttp.ResponseText     ' strT (string), 也声明为全局变量
  ' msgbox strT  '在此使用msg提示框时,能正常显示请求页面返回的值. 先注释掉,然后在标准模块中调用strT
End Sub
在标准模块中使用msgbox strT, msg框显示空白(空值),说明取不了strT值.也不知道这到底是什么原因?希望老师有空再给看看,谢谢了.

TA的精华主题

TA的得分主题

发表于 2016-1-11 09:41 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
好东西,学习了,收藏
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-23 09:33 , Processed in 0.030921 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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