ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

请老师们解答:JSA能否从这个网址取数据240319

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-5-31 19:30 | 显示全部楼层
金牌1 发表于 2024-5-31 16:43
老师太优秀了,高手!!!

不用客气,19行的代码改一下
点击第1列股票代码时,会自动打开网页链接,调试时没注意,打开的网页链接没数据,改过后可以了

  1. async function 股票人气榜(){
  2.     async function getRes(argm1, gpdm){
  3.         let p = await fetch(`https://emappdata.eastmoney.com/stockrank/${argm1}`, {
  4.           method: 'POST',
  5.           headers: {'content-type': 'application/json'},
  6.           body: JSON.stringify({'srcSecurityCode': `${gpdm}`})
  7.         });
  8.         let res = await p.json();
  9.         return res;
  10.     };
  11.     let t1 = Date.now()
  12.     const gpdms = Range('表1[代码]').Value2.flat().map((x, i) => {
  13.         if (typeof x == 'number') x = String(x);
  14.         if (x.length < 6) x = '0'.repeat(6 - x.length) + x;
  15.         x = '03'.includes(x[0]) ? 'SZ' + x : 'SH' + x;
  16.         return x;
  17.     });
  18.     Range('表1[代码]').Value2 = gpdms.map(x =>
  19.         [`=HYPERLINK("http://guba.eastmoney.com/rank/stock?code=${x.slice(2)}", "${x.slice(2)}")`])
  20.     let res1 = await Promise.all(gpdms.map((x, i) => getRes('getCurrentLatest', x)));
  21.     let res2 = await Promise.all(gpdms.map((x, i) => getRes('getProfileStockRank', x)));
  22.     let res = res1.map((x, i) =>
  23.         [x.data.rank, x.data.rankChange, res2[i].data.oldUidRate, res2[i].data.newUidRate]
  24.     );
  25.     Range('表1[[实时排名]:[铁杆粉丝]]').Value2 = res;
  26.     console.log(`${res.length}只股票,用时:${(Date.now()-t1)*0.001}秒`)
  27. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-1 09:38 | 显示全部楼层
一江春水1688 发表于 2024-5-31 19:30
不用客气,19行的代码改一下
点击第1列股票代码时,会自动打开网页链接,调试时没注意,打开的网页链接 ...


感谢高手老师的细致解答!!!
还有个问题不理解:老师A列更新数据将6位文本格式换成6位数字格式还是不能执行?

50a3ea3fa52b4514d5166a5b5169416f.png

TA的精华主题

TA的得分主题

发表于 2024-6-1 11:16 | 显示全部楼层
金牌1 发表于 2024-6-1 09:38
感谢高手老师的细致解答!!!
还有个问题不理解:老师A列更新数据将6位文本格式换成6位数字格式还是 ...

把不能运行的附件传上来,我看一下

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-1 11:30 | 显示全部楼层
一江春水1688 发表于 2024-6-1 11:16
把不能运行的附件传上来,我看一下

换代码测试不行240601;A列6位数字的格式设置难度太大!

换代码测试不行240601.rar

56.19 KB, 下载次数: 10

TA的精华主题

TA的得分主题

发表于 2024-6-1 13:24 | 显示全部楼层
金牌1 发表于 2024-6-1 11:30
换代码测试不行240601;A列6位数字的格式设置难度太大!

我明白了,你清除了原【表1】表格下半部分的内容,但【表1】还是原来的大小,只是后半部分的内容都是空白,股票代码也全是空,导致第14行代码中的 x.length 出错,程序就此中止,没有运行下去。
解决办法:
①选中【表1】第1个空白股票代码,按Ctrl + ↓ ,即选中了【表1】全部空白股票代码区域
②点鼠标右键→【删除】→【表行】,这样,【表1】的大小跟真实数据的大小相同了,【表1】中也不再有空白股票代码了
③运行程序,应该就正常了。
说明:将来,在【表1】中添加新的股票代码,【表1】会自动扩充,不用担心其大小

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2024-6-1 13:25 来自手机 | 显示全部楼层
本帖最后由 一江春水1688 于 2024-6-1 13:27 编辑


已解决,回复内容还在审核中

TA的精华主题

TA的得分主题

发表于 2024-6-1 22:04 | 显示全部楼层
一江春水1688 发表于 2024-6-1 13:25
已解决,回复内容还在审核中

不想动【表1】的话,代码修改如下:
  1. async function 股票人气榜(){
  2.     async function getRes(argm1, gpdm){
  3.         let p = await fetch(`https://emappdata.eastmoney.com/stockrank/${argm1}`, {
  4.           method: 'POST',
  5.           headers: {'content-type': 'application/json'},
  6.           body: JSON.stringify({'srcSecurityCode': `${gpdm}`})
  7.         });
  8.         let res = await p.json();
  9.         return res;
  10.     };
  11.     const gpdms = [];
  12.     Range('表1[代码]').Value2.flat().some((x, i) => {
  13.         if (!x) return !x;
  14.         if (typeof x == 'number') x = String(x);
  15.         if (x.length < 6) x = '0'.repeat(6 - x.length) + x;
  16.         x = '03'.includes(x[0]) ? 'SZ' + x : 'SH' + x;
  17.         gpdms.push(x);
  18.     });
  19.     if (!gpdms) return;
  20.     Range('表1[代码]').Resize(gpdms.length, 1).Value2 = gpdms.map(x =>
  21.         [`=HYPERLINK("http://guba.eastmoney.com/rank/stock?code=${x.slice(2)}", "${x.slice(2)}")`])
  22.     let res1 = await Promise.all(gpdms.map((x, i) => getRes('getCurrentLatest', x)));
  23.     let res2 = await Promise.all(gpdms.map((x, i) => getRes('getProfileStockRank', x)));
  24.     let res = res1.map((x, i) =>
  25.         [x.data.rank, x.data.rankChange, res2[i].data.oldUidRate, res2[i].data.newUidRate]
  26.     );
  27.     Range('表1[[实时排名]:[铁杆粉丝]]').Resize(res.length, res[0].length).Value2 = res;
  28. }
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-6-2 09:49 | 显示全部楼层
一江春水1688 发表于 2024-6-1 22:04
不想动【表1】的话,代码修改如下:

再次感谢老师的进一步解答!!!,更优秀作品!还有个问题:超链接这个到VBA不一样,会替换。如何更新?
Range('表1[代码]').Resize(gpdms.length, 1).Value2 = gpdms.map(x =>
        [`=HYPERLINK("http://guba.eastmoney.com/rank/stock?code=${x.slice(2)}", "${x.slice(2)}")`])
0b07c31e5bb76a44ebe236e9af311654.png
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-4 00:52 , Processed in 0.052819 second(s), 16 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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