在 LibreOffice Calc 中,我创建了一个掷骰子表。在 A6:B1005 中,我在 A 列中列出了数值,在 B 列中列出了具有该数值的掷骰子次数。以 d10 为例:
模具价值 | 卷数 |
---|---|
1 | 7 |
2 | 10 |
3 | 8 |
4 | 8 |
5 | 15 |
6 | 16 |
7 | 7 |
8 | 9 |
9 | 十三 |
10 | 7 |
11 | 0 |
12 | 0 |
单元格 D3 定义了骰子的面数。
我想要做的是从 B 列中获取骰子边范围内的最小值和最大值。我当前的公式是{=MIN(IF(A6:A10005 >= D3; B6:B10005))}
,但返回 0。我该如何更改公式以计算 D3 中的值?换句话说,我想返回 B6:B1005 范围内的最小值,仅包括 A6:A1005 >= D3 的值。
答案1
我昨晚终于弄清楚了,方法如下:
图像和公式
单元格 D2 和 D3 定义骰子的数量以及每个骰子的面数:
数量:100d。面数:d20
单元格 A6:Bn列出骰子的结果以及每个面的结果数量:
骰子、骰子每个面的点数和计数。
在单元格 A3:B3 中,我列出了最低值和最高值,并在括号中进行了计数:
最低和最高:16(1)/6(11)
为了编写此函数,我不得不产生一个非常可怕的嵌套concatenate
,但它完成了工作:
=KJED.SAMAN(INDEKS(A6:A10005;
SAMANLIKNA(N.MINST(B6:B10005;
TEL.VISS(A6:A10005;">="&D3));B6:B10005;0));
"(";N.MINST(B6:B10005;
TEL.VISS(A6:A10005;">="&D3));")/";INDEKS(A6:A10005;
SAMANLIKNA(N.STØRST(B6:B10005;1);B6:B10005;0));
"(";MAKS(B6:B10005);")")
=CONCATENATE(INDEX(A6:A10005;
MATCH(SMALL(B6:B10005;
COUNT.IF(A6:10005;">="&D3));B6:B10005;0));
"(";SMALL(B6:B10005;
COUNT.IF(A6:A10005;">="&D3);")/";INDEX(A6:A10005;
SAMANLIKNA(LARGE(B6:B10005;1);B6:B10005;0));
"(";MAX(B6:B10005);")")
解释
这实际上就是左派LOOKUP
。
MATCH
工作原理
`=MATCH(搜索条件;搜索范围;类型[0,1])
通过查看源单元格(例如包含值 101 的 B1),然后查看数据范围(例如产品列表),该值将返回在列表中找到数据的数字。示例:
A B
1 Enter product type: 902
2
3 Jackets 900
4 Trousers 901
5 Shoes 902
对于此示例,MATCH
如果查找区域 B3:B5,则会返回值 3,因为“102”是与 B1 中输入的产品编号匹配的第三行。
结合INDEX
通过查看指定来源,我们可以收集相关数据。我们已经收集了数字 4。结构是INDEX(reference;row;column;area)
。让我们改进我们的数据示例:
A | 乙 | C | 德 | 埃 | F | |
---|---|---|---|---|---|---|
1 | 产品类别: | 902 | ||||
2 | ||||||
3 | 产品编号 | 物品 | 品牌 | 物品 | 产品编号 | |
4 | 900 | 尼克 | 夹克 | 900 | ||
5 | 901 | 利维斯 | 裤子 | 901 | ||
6 | 902 | 尼克 | 鞋 | 902 | ||
7 | 903 | 苯 | 帽子 | 903 | ||
8 | 904 | 利维斯 | 围巾 | 904 | ||
A |
B |
C |
D |
E |
F |
在单元格 B4 中,我们可以输入函数=INDEX(E$4:E$8;MATCH(B4;F$4:F$8;0))
,然后将其粘贴到范围 B4:B8 中。这将执行的操作是查看范围 E4:E8 中的项目范围,然后针对其行转到 MATCH 公式,其中我们首先获取员工在 B4 中输入的数据(项目编号 902),然后查看范围 F4:F8 以找到该数字,最后将其返回到索引,该索引列出了单元格 B4 中的预期“鞋子”。
SMALL
和LARGE
最后,还有获取正确小数的问题。MIN
没有用,因为其中包含零。我需要公式来查看整个范围,因为骰子上的面数可能会增加。(在 Hackmaster 中,我们甚至使用 d10000 来表示致命一击。)让我们再看一下公式:
SMALL(B6:B10005;COUNT.IF(A6:10005;">="&D3))
这样做的目的是,查看区域 B6:B10005,其中列出了每个结果的命中次数,然后使用 aCOUNT.IF
查找左列中列出可能的骰子面数的数字,最后从单元格 (D3) 中收集最大数字,其中列出了骰子面数。标准之所以这样写 ( ">="&D3
),是因为当标准不是数字时,必须在引号中表示。表达式通过 & 符号与单元格引用连接。