提取单个Excel单元格中的值以在forumla中使用

我正在创build一个Excel电子表格,我想根据单元格的内容创build一个公式。 一个基本的例子如下:

在这里输入图像说明

因此,单元格1,2和3的值为YxZ。 我想要使​​用Y值和Z值,并根据每个值进行计算。 我不想为Y和Z分开单元格。

所以我想选出Y并做一个简单的加法得到11.然后我想要得到Z的平均值,在这种情况下是225。

可以这样做吗? 我绝不是一个Excel向导!

这是@ScottCraner的出色答案的变体:

Function Apply(Formulas As Range, operator As String, operand As Long, func As String) As Variant Dim terms As Variant Dim cell As Range Dim expression As String Dim i As Long ReDim terms(1 To Formulas.Cells.Count) i = 1 For Each cell In Formulas.Cells terms(i) = Split(cell, operator)(operand - 1) i = i + 1 Next cell expression = func & "(" & Join(terms, ",") & ")" Apply = Application.Evaluate(expression) End Function 

你传递一个expression式的operand operator operand ,一个表示operand operator operand的string,以及表示操作数之前的操作数或操作数之后的整数1或2,以及表示要应用的函数的string到相应的操作数。

它是这样工作的:

在这里输入图像说明

在第一列中,我使用operand = 1 ,在第二列中我使用operand = 2

您需要数组公式来提取每个单元格中x的文本,转换为数字,然后将这些值相加在一起=>使用Ctrl + Shift + Enter确认后,复制并粘贴到单元格I2(Y之和)和J2除以Y的总和):

 =SUM(IFERROR(VALUE(LEFT($A2:$H2,FIND("x",$A2:$H2)-1)),0)) =SUM(IFERROR(VALUE(LEFT($A2:$H2,FIND("x",$A2:$H2)-1)) * VALUE(MID($A2:$H2,FIND("x",$A2:$H2)+1,255)),0)) / $I2 

一个vba选项。

这个用户自定义函数将返回这两个数字:

 Function sumaver(rng As Range, dm As String) Dim sm As Double Dim avg As Double Dim cnt As Long Dim r As Range Dim str() As String Dim tmp(1 To 2) For Each r In rng str = Split(r.Value, dm) If UBound(str) = 1 Then sm = sm + str(0) avg = avg + str(1) cnt = cnt + 1 End If Next r tmp(1) = sm tmp(2) = avg / cnt sumaver = tmp End Function 

把它放在一个连接到所需工作簿的模块中。 不要把它放在工作表或ThisWorkbook代码中。

因为它返回两个数字的数组,所以可以通过两种方式来调用。

首先是突出两个连续的水平单元格,并在第一个input:

 =sumaver(A2:H2,"x") 

然后按Ctrl-Shift-Enter而不是Enter。 如果正确完成,Excel将自动将{}放在公式的周围,并填充第二个单元格。 第一个将是第二个平均值的总和。

但是,如果您将不同的非连续水平单元格中的单个部分进行比较,则可以使用以下公式调用总和:

 =INDEX(sumaver(A2:H2,"x"),1,1) 

平均有:

 =INDEX(sumaver(A2:H2,"x"),1,2) 

sumaver()函数的参数是sumaver(Range, character on which to split)

您可以在范围中包含空单元格,它们将被忽略。

在这里输入图像说明