所以这是Microsoft {“ Q0”:“ 2”,“ Q1”:“ 1”,“ Q2”:“ 2”,“ Q3”:“ 1”,“ Q4”:“ 2” ,“ Q5”:“ 3”,“ Q6”:“ 2”,“ Q7”:“ 1”,“ Q8”:“ 2”} 如何制作一个将所有数字相加的函数。 (在这种情况下为2 + 1 + 2 + 1 + 2 + 3 + 2 + 1 + 2 = 16)
答案 0 :(得分:1)
有很多Google命中有关解析通用JSON的VBA函数的信息,但如果您希望工作表函数适用于您的特定格式,请尝试以下操作:
有两种方法可以做到这一点。您可以尝试自己解析json,但数组公式变得笨拙(请参阅答案的后半部分)。或者,您可以将JSON转换为XML,然后使用内置的XML过滤功能。
要将JSON更改为XML,您需要:
{"
代替<a><b><c>
":"
代替</c><d>
","
代替</d></b><b><c>
"}
代替</d></b></a>
这将更改如下内容:
{"Q0":"0","Q1":"1"}
进入:
<a><b><c>Q0</c><d>0</d></b><b><c>Q1</c><d>1</d></b></a>
例如,您可以将此公式放入B8中,以将B2中的值从JSON转换为XML:
=SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2,
"{""", "<a><b><c>"),
""":""", "</c><d>"),
""",""", "</d></b><b><c>"),
"""}", "</d></b></a>")
之后,您可以使用此XML筛选器功能获取B8中XML字符串的值之和:
=SUM(FILTERXML(B8,"//d"))
这是一个数组公式,因此将其放入单元格后,请按Control-Shift-Enter,而不是仅按Enter。
因此,包括替换在内的整个数组公式为:
=SUM(FILTERXML(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(B2,
"{""", "<a><b><c>"),
""":""", "</c><d>"),
""",""", "</d></b><b><c>"),
"""}", "</d></b></a>"),
"//d"))
如果您真的想自己解析JSON,那么我不知道一种在一个单元格中使用一个公式求和的方法,但是如果您在单元格中显示数据然后将其加起来就可以了。
如果JSON在B2中,则可以在A5中输入此数组公式以获取第一个键:
=SUBSTITUTE(LEFT(MID(","&MID($B2,2,LEN($B2)-2)&",",
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)+1), COLUMN(A1)),
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1)+1)-
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1))-1),
SEARCH(":",MID(","&MID($B2,2,LEN($B2)-2)&",",
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)+1), COLUMN(A1)),
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1)+1)-
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1))-1),
1)-1
),"""","")
A6中的此数组公式将获得第一个值:
=--SUBSTITUTE(RIGHT(MID(","&MID($B2,2,LEN($B2)-2)&",",
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)+1), COLUMN(A1)),
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1)+1)-
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1))-1),
LEN(MID(","&MID($B2,2,LEN($B2)-2)&",",
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)+1), COLUMN(A1)),
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1)+1)-
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1))-1))-
SEARCH(":",MID(","&MID($B2,2,LEN($B2)-2)&",",
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)+1), COLUMN(A1)),
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1)+1)-
SMALL(IF(ISERROR(SEARCH(MID(","&MID($B2,2,LEN($B2)-2)&",", ROW($1:$99), 1), ",")), "", ROW($1:$99)), COLUMN(A1))-1),
1)
),"""","")
然后您可以将A5复制到B5:I5,然后将A6复制到B6:I6,最后将A6:I6汇总。
请记住,它们是数组公式,因此在将其放入单元格后,请按Control-Shift-Enter,而不仅仅是按Enter。
我对这些公式的解释不能比在其中获得解释的网页更好:https://www.get-digital-help.com/2011/03/23/text-to-columns-split-words-in-a-cell-excel-array-formula/我真的建议您阅读他们对公式的解释。
我对该页面上的公式所做的更改包括:
MID($B2,2,LEN($B2)-2)
代替$B2
","&MID($B2,2,LEN($B2)-2)&","
代替" "&$B2&" "
SUBSTITUTE(...,"""","")
LEFT()
抓住关键部分,而用MID()
抓住价值部分--
转换