如何在Excel中添加Q的总和

时间:2018-09-26 02:45:02

标签: excel

所以这是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)

1 个答案:

答案 0 :(得分:1)

有很多Google命中有关解析通用JSON的VBA函数的信息,但如果您希望工作表函数适用于您的特定格式,请尝试以下操作:

有两种方法可以做到这一点。您可以尝试自己解析json,但数组公式变得笨拙(请参阅答案的后半部分)。或者,您可以将JSON转换为XML,然后使用内置的XML过滤功能。

“将JSON转换为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()抓住价值部分
  • 为值公式的结果添加从字符串到数字的--转换