基于ESI的MS EXCEL自动更新数据表格实现

头像
Pikachu Detective
 Stardust-Guardian
 Fraternity.

帖子: 6
注册时间: 04-02-2019 23:52

基于ESI的MS EXCEL自动更新数据表格实现

帖子 Pikachu Detective » 31-03-2019 15:28

首先,需要申明,楼主是程序小白!!!楼主是程序小白!!!楼主是程序小白!!!
重要的事情说三遍

然后感谢一下论坛里的大佬发的帖子提供的思路
原帖地址:viewtopic.php?f=5&t=1033
看完大佬的帖子表示,嗯,要是MS EXCEL也能直接从ESI上读取数据就好了,于是有了本帖

实现方式分为三步:(本帖基于MS EXCEL 2010,各版本可能略有不同请自行调整)
第一步:创建一个启用宏的Microsoft Excel 工作表并启用宏
第二步:创建自定义函数GET_JITA_SELL
第三部:使用自定义函数GET_JITA_SELL,各位商业大佬就可以为所欲为啦 :twisted:

接下来分别讲一下如何实现的
第一步:首先随意创建一个EXCEL表格,另存为,保存类型选择“Excel 启用宏的工作簿”,这样就创建了一个可以用宏的工作簿了,接下来打开它,在 文件-选项-信任中心-信任中心设置-宏设置 里勾选“启用所有宏”,点击确定一路退出。

第二步也是最关键的一步,创建自定义函数,这个也是本帖中最重要的一部分。在打开的表格界面按下Alt+F11,会弹出一个窗口,在左上角写着工程的小窗里右键你的工作表,插入,模块。这时你的工程窗口会出现一个叫做模块的文件夹,里面有你刚刚创建的模块1,双击打开它,然后把下面分隔符内的代码完完整整地复制粘贴进去,并按 Ctrl+S 保存工作簿,可能会弹出隐私问题警告,不用管忽视就行,然后关掉这个窗口只保留EXCEL工作簿的窗口。
各位大神请不要吐槽,楼主真是编程小白,还望各位大神能够优化代码

================================我是分隔符=====================================

Function GET_JITA_SELL(type_id)
Dim strJson As String
Dim xmlHttp As Object
Dim index_last As Long
Dim index_write As Long
Dim price As Double
Dim lowprice As Double
station_id = "60003760"
url = "https://esi.evetech.net/latest/markets/10000002/orders/?datasource=tranquility&order_type=sell&type_id=" + CStr(type_id)
Set xmlHttp = CreateObject("Microsoft.XMLHTTP")
xmlHttp.Open "GET", url, False
xmlHttp.send
If xmlHttp.ReadyState = 4 Then
strJson = xmlHttp.responseText
End If
index_last = InStrRev(strJson, "location_id" & Chr(34) & ":" & station_id)
index_write = 1
lowprice = 1E+20
Do While index_write < index_last
retprice = GetPrice(strJson, index_write, "location_id" & Chr(34) & ":" & station_id, "," & Chr(34) & "range")
price = retprice
If price < lowprice Then
lowprice = price
End If
index_write = InStr(index_write + 1, strJson, "location_id" & Chr(34) & ":" & station_id)
Loop
retprice = GetPrice(strJson, index_write, "location_id" & Chr(34) & ":" & station_id, "," & Chr(34) & "range")
price = retprice
If price < lowprice Then
lowprice = price
End If
GET_JITA_SELL = lowprice
End Function
Function GetPrice(inputStr As String, start_find As Long, key1 As String, key2 As String) As String
Dim Find1 As Long
Dim Find2 As Long
Dim GetString As String
Find1 = InStr(start_find, inputStr, key1)
Find2 = InStr(Find1, inputStr, key2)
GetString = Mid(inputStr, Find1 + Len(key1), Find2 - Find1 - Len(key1))
GetPrice = Mid(GetString, 47)
End Function

================================我是分隔符=====================================



第三步:这时你就可以开始使用这个自定义函数了,在空白的单元格里打上“=get_jita_sell(type_id)”,回车即可获得此type_id对应的物品在吉他海4的当前最低卖价了,至于type_id的获取方法在其他很多帖子里都有描述这里就不写了
注意:在公式-计算选项里选择手动,在打开表格需要用的时候点下右边的开始计算就会重新计算函数的值

头像
Ljw1124
 Stardust-Guardian
 Fraternity.

帖子: 1
注册时间: 08-09-2018 20:13

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Ljw1124 » 31-03-2019 15:38


头像
jungle rule
 Fuxi Legion
 Fraternity.

帖子: 6
注册时间: 30-12-2018 00:02

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 jungle rule » 02-04-2019 17:05

大概懂了意思,有时间研究一下,感谢!

头像
SelilaLee
 Galactic Empire Co LTD
 Fraternity.

帖子: 37
注册时间: 30-09-2017 02:04

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 SelilaLee » 12-04-2019 20:33

good!

头像
Heterophotus YG
 STARCHASER Inc.
 STARCHASER Alliance

帖子: 3
注册时间: 08-04-2019 02:37

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Heterophotus YG » 15-04-2019 18:01

那么如何查收单价格呢?

头像
Pikachu Detective
 Stardust-Guardian
 Fraternity.

帖子: 6
注册时间: 04-02-2019 23:52

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Pikachu Detective » 17-04-2019 09:44

Heterophotus YG 写了:
15-04-2019 18:01
那么如何查收单价格呢?
其实是一样的,就是需要修改调用的ESI网址和下面的初始条件和判断条件就行了

头像
Heterophotus YG
 STARCHASER Inc.
 STARCHASER Alliance

帖子: 3
注册时间: 08-04-2019 02:37

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Heterophotus YG » 17-04-2019 10:08

Pikachu Detective 写了:
17-04-2019 09:44
Heterophotus YG 写了:
15-04-2019 18:01
那么如何查收单价格呢?
其实是一样的,就是需要修改调用的ESI网址和下面的初始条件和判断条件就行了
尝试过了,改了buy类型并且把大于改成小于,lowprice初始赋值改为1,但无论如何就是报错
求帮忙按照这个写法写一个,我看看我哪里没改对~

头像
Pikachu Detective
 Stardust-Guardian
 Fraternity.

帖子: 6
注册时间: 04-02-2019 23:52

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Pikachu Detective » 25-04-2019 10:19

Heterophotus YG 写了:
17-04-2019 10:08
Pikachu Detective 写了:
17-04-2019 09:44
Heterophotus YG 写了:
15-04-2019 18:01
那么如何查收单价格呢?
其实是一样的,就是需要修改调用的ESI网址和下面的初始条件和判断条件就行了
尝试过了,改了buy类型并且把大于改成小于,lowprice初始赋值改为1,但无论如何就是报错
求帮忙按照这个写法写一个,我看看我哪里没改对~
url里面sell改成buy,下面两个if里面的<改成>应该就行了,最好把函数名称也改了改成get_jita_buy

头像
Pikachu Detective
 Stardust-Guardian
 Fraternity.

帖子: 6
注册时间: 04-02-2019 23:52

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Pikachu Detective » 30-04-2019 19:49

[quote="Pikachu Detective" post_id=7145 time=1556158770 user_id=10517]
[quote="Heterophotus YG" post_id=7124 time=1555466894 user_id=11437]
[quote="Pikachu Detective" post_id=7123 time=1555465477 user_id=10517]


其实是一样的,就是需要修改调用的ESI网址和下面的初始条件和判断条件就行了
[/quote]

尝试过了,改了buy类型并且把大于改成小于,lowprice初始赋值改为1,但无论如何就是报错
求帮忙按照这个写法写一个,我看看我哪里没改对~
[/quote]

url里面sell改成buy,下面两个if里面的<改成>应该就行了,最好把函数名称也改了改成get_jita_buy
[/quote]

改进:编码优化,修复了最小交易个数不为1时导致的数据报错;添加了吉他最高收价的函数GET_JITA_BUY,将分隔符间的两段代码分别复制到两个模块里,新建模块的方法及使用方法参照原贴,请放弃原贴的代码

================================我是分隔符==================================

Function GET_JITA_SELL(type_id)
Dim strJson As String
Dim xmlHttp As Object
Dim index_last As Long
Dim index_write As Long
Dim price As Double
Dim lowprice As Double
station_id = "60003760"
URL = "https://esi.evetech.net/latest/markets/10000002/orders/?datasource=tranquility&order_type=sell&type_id=" + CStr(type_id)
Set xmlHttp = CreateObject("Microsoft.XMLHTTP")
xmlHttp.Open "GET", URL, False
xmlHttp.send
If xmlHttp.ReadyState = 4 Then
strJson = xmlHttp.responseText
End If
index_last = InStrRev(strJson, "location_id" & Chr(34) & ":" & station_id)
index_write = 1
lowprice = 1E+20
Do While index_write < index_last
retprice = GetPrice(strJson, index_write)
price = retprice
If price < lowprice Then
lowprice = price
End If
index_write = InStr(index_write + 1, strJson, "location_id" & Chr(34) & ":" & station_id)
Loop
retprice = GetPrice(strJson, index_write)
price = retprice
If price < lowprice Then
lowprice = price
End If
GET_JITA_SELL = lowprice
End Function
Function GetPrice(inputStr As String, start_find As Long) As String
Dim Find1 As Long
Dim Find2 As Long
Dim GetString As String
Find1 = InStr(start_find, inputStr, "price")
Find2 = InStr(Find1, inputStr, "range")
GetString = Mid(inputStr, Find1 - 1, Find2 - Find1 - 1)
GetPrice = Mid(GetString, 9)
End Function

================================我是分隔符==================================

Function GET_JITA_BUY(type_id)
Dim strJson As String
Dim xmlHttp As Object
Dim index_last As Long
Dim index_write As Long
Dim price As Double
Dim lowprice As Double
station_id = "60003760"
URL = "https://esi.evetech.net/latest/markets/10000002/orders/?datasource=tranquility&order_type=buy&type_id=" + CStr(type_id)
Set xmlHttp = CreateObject("Microsoft.XMLHTTP")
xmlHttp.Open "GET", URL, False
xmlHttp.send
If xmlHttp.ReadyState = 4 Then
strJson = xmlHttp.responseText
End If
index_last = InStrRev(strJson, "location_id" & Chr(34) & ":" & station_id)
index_write = 1
highprice = 0
Do While index_write < index_last
retprice = GetPrice(strJson, index_write)
price = retprice
If price > highprice Then
highprice = price
End If
index_write = InStr(index_write + 1, strJson, "location_id" & Chr(34) & ":" & station_id)
Loop
retprice = GetPrice(strJson, index_write)
price = retprice
If price > highprice Then
highprice = price
End If
GET_JITA_BUY = highprice
End Function
Function GetPrice(inputStr As String, start_find As Long) As String
Dim Find1 As Long
Dim Find2 As Long
Dim GetString As String
Find1 = InStr(start_find, inputStr, "price")
Find2 = InStr(Find1, inputStr, "range")
GetString = Mid(inputStr, Find1 - 1, Find2 - Find1 - 1)
GetPrice = Mid(GetString, 9)
End Function

================================我是分隔符==================================

头像
Feeling Surper
 My Little Pony.
 Fraternity.

帖子: 5
注册时间: 18-08-2018 22:54

Re: 基于ESI的MS EXCEL自动更新数据表格实现

帖子 Feeling Surper » 09-06-2019 02:04

大佬为何不写一个typeid的查询function

回复

在线用户

正浏览此版面之用户: 没有注册用户 和 1 访客