使用指定的标题在表中查找两列,差异所有行然后计算平均值?

时间:2017-09-16 14:44:55

标签: arrays excel vba excel-vba loops

我有一个信息表,我想创建一个函数,它会在表格范围内找到与我提供的标题匹配的两列,然后将两列的每一行之间的差异存储为阵列。获取此数组后,我希望函数返回数组的平均值,最大值和最小值。输出将是水平的,并放置在3个相邻的单元格中。

我不是手动执行此操作,因为表非常大,我必须得到两行的许多排列(435个排列)的差异和平均值,因此手动计算会太繁琐。

public function index()
            {
                $assets = $this->Assets->find('all')
                ->select([ 'id', 'name', 'serial'])
                ->contain(['ExternalAssets' => [
                  'fields' => [
                      'NAME','SERIAL'
                     ]
                ]);
                //if you wanna paginate your resut
                //$assets = $this->paginate($assets);

                $this->set(compact('assets'));
                $this->set('_serialize', ['assets']);
            }

public function view($id = null)
    {
        $assets= $this->Assets->get($id, [
            'contain' => []
        ]);

        $this->set('assets', $assets);
        $this->set('_serialize', ['assets']);
    }

这是我尝试过的,但它返回了无效的名称错误。我是vba的新手(只使用过python和R),真的需要一些帮助。提前谢谢!

1 个答案:

答案 0 :(得分:1)

不需要VBA。

如果headers是表示标题标签的范围,data表示数据的范围(不包括标题行),那么

=INDEX(data,0,MATCH(header1,headers,0))

提供了一个数组,该数组对应于标有header1的数据表的列。

因此,您的最大值,最小值和平均值可以简单地获得

=MAX(INDEX(data,0,MATCH(header1,headers,0))-INDEX(data,0,MATCH(header2,headers,0)))
=MIN(INDEX(data,0,MATCH(header1,headers,0))-INDEX(data,0,MATCH(header2,headers,0)))
=AVERAGE(INDEX(data,0,MATCH(header1,headers,0))-INDEX(data,0,MATCH(header2,headers,0)))

其中header1header2是您选择的两个标题标签。

在从公式栏提交时,每个公式都需要使用CTL+SHIFT+ENTER作为数组公式输入,而不仅仅是ENTER。然后公式将出现在公式栏中的花括号{...}内,确认它是一个数组公式。

由于您有435个排列,我猜测您的数据表有30列。

如果您愿意,可以轻松生成所有435种可能排列的结果。

为此,请创建一个包含435对(n,m)的列表,以使n小于mnm均在范围1内, ...,30。创建从(1,2)开始到(29,30)结束的列表。现在MATCH(header1,headers,0)MATCH(header2,headers,0)可以简单地用nm替换,分别在公式中给出

=MAX(INDEX(data,0,n)-INDEX(data,0,m))
=MIN(INDEX(data,0,n)-INDEX(data,0,m))
=AVERAGE(INDEX(data,0,n)-INDEX(data,0,m))

作为对(n,m)的必需结果,同样应将这些公式作为数组公式输入CTL+SHIFT+ENTER

下图显示了对具有25行和6列的示例数据表的所有15种排列应用此方法的结果。 enter image description here