提取单个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)
您可以在范围中包含空单元格,它们将被忽略。