如何在Excel(和Google Sheets)中查找稀疏数组的宽度和宽度?
假设您在Excel中有一个单元格网格(最新版本,如Office 365)。如果不使用VB,但一定要使用标准函数(即以编程方式,而不是“手动”),在以下情况下,如何找到网格的宽度和深度(或网格右下角单元格的名称或引用):如何在Excel(和Google Sheets)中查找稀疏数组的宽度和宽度?,excel,google-sheets,Excel,Google Sheets,假设您在Excel中有一个单元格网格(最新版本,如Office 365)。如果不使用VB,但一定要使用标准函数(即以编程方式,而不是“手动”),在以下情况下,如何找到网格的宽度和深度(或网格右下角单元格的名称或引用): 您将获得左上角单元格(TLC)的名称 宽度=最宽行中TLC和最右边非空单元格之间的列数 深度=从TLC到最深列中最低(即编号最高的行)非空单元格的行数 您不能假设最宽行或最深列的位置。i、 e.最宽的行不必位于阵列的顶部或底部,最深的列不必位于最左侧或最右侧 阵列可能是稀疏的;
- 您将获得左上角单元格(TLC)的名称
- 宽度=最宽行中TLC和最右边非空单元格之间的列数
- 深度=从TLC到最深列中最低(即编号最高的行)非空单元格的行数
- 您不能假设最宽行或最深列的位置。i、 e.最宽的行不必位于阵列的顶部或底部,最深的列不必位于最左侧或最右侧
- 阵列可能是稀疏的;i、 e.单元格上方和左侧可能有空白,并带有值
好的,这里是一个相当暴力的Excel方法,只用于查找最后一行-使用偏移量获取整个工作表中从B4开始的每一行,然后小计查看它是否包含任何非空白单元格,然后乘以行号,并使用max查找包含某些内容的最大行号:
=MAX((SUBTOTAL(3,OFFSET(B4,ROW(B4:B1048576)-ROW(B4),0,1,16384-COLUMN(B4)))>0)*ROW(B4:B1048576))
=MAX((SUBTOTAL(3,OFFSET(B4,0,COLUMN(B4:XFD4)-COLUMN(B4),1048576-ROW(B4),1))>0)*COLUMN(B4:XFD4))
必须使用CtrlShift作为数组公式输入
进入
您可以通过减去B4的行或列来获得宽度和深度
正如预期的那样,反应有点迟缓,但可以容忍
在以下情况下,您也可以使用Countif:
=MAX((COUNTIF(OFFSET(B4,ROW(B4:B1048576)-ROW(B4),0,1,16384-COLUMN(B4)),"<>")>0)*ROW(B4:B1048576))
=MAX((COUNTIF(OFFSET(B4,0,COLUMN(B4:XFD4)-COLUMN(B4),1048576-ROW(B4),1),"<>")>0)*COLUMN(B4:XFD4))
=MAX((COUNTIF(偏移量(B4,行(B4:B1048576)-行(B4),0,116384-列(B4)),“”)>0)*行(B4:B1048576))
=MAX((COUNTIF(偏移量(B4,0,列(B4:XFD4)-列(B4),1048576行(B4),1),“”)>0)*列(B4:XFD4))
但它并没有回避偏移量是一个易变函数的问题,因此对电子表格的任何更改都会迫使重新计算
如果可以限制范围,速度可以大大提高。也可以使用其他答案中提到的Google Sheets方法,例如
=MAX(IF(B4:L20<>"",ROW(B4:L20)))
=最大值(如果(B4:L20“”,第(B4:L20)行)
但是,如果应用于整个Excel工作表,这似乎会耗尽资源。此答案适用于Google工作表中的深度
=max(arrayformula(if(<range> <> "", row(<range>)))) - (row(<range>)-1)
=max(数组公式(if(“,row()))-(row()-1)
将稀疏数组坐标替换为从左上角单元格开始的最大可能
,例如A1:D20或TLC为A1时的任何值。请注意,如果数组不是从第1行开始,我们只需减去起始行
这假设您可以声明“最大可能范围”。但这似乎是一个安全的假设:要么你的数据向下延伸到无限多的行,而下面没有任何具体的数据,当你只是放了一个非常大的数字,要么你确实在下面有一些具体的数据,在这种情况下,你将范围限制在上面的行
以下是TLC=J2的示例
为宽度找到等效公式留给读者一个(要求不高的)练习:-)此公式将向您显示“BRC”:
=地址(
最大值(数组公式(如果(A:Z“”,第(A:Z)行))-(第(A:Z)行)-1,
最大值(数组公式(如果(A:Z“”,列(A:Z)))-(列(A:Z)-1),4)
=ADDRESS(
MAX(ARRAYFORMULA(IF(A:Z<>"", ROW(A:Z))))-(ROW(A:Z)-1),
MAX(ARRAYFORMULA(IF(A:Z<>"", COLUMN(A:Z))))-(COLUMN(A:Z)-1), 4)