如何在excel中计算元素

如何在excel中计算元素,excel,count,Excel,Count,所以我有一个列叫做化学公式,有40000个条目,我想做的是计算化学公式中包含多少元素。例如:- EXACT_MASS FORMULA 626.491026 C40H66O5 275.173274 C13H25NO5 为此,我需要某种公式,它将返回 C H O 40 66 5 13 25 5 对于不同的元素,所有列都是单独的列,对于不同的条目,所有行都是单独的列。有什么配方可以做到这一点吗?你可以自己制作配方 使用ALT和F11打开VBA编辑器并插入新模块 单击“工具”,然后单击“引

所以我有一个列叫做化学公式,有40000个条目,我想做的是计算化学公式中包含多少元素。例如:-

EXACT_MASS  FORMULA
626.491026  C40H66O5
275.173274  C13H25NO5
为此,我需要某种公式,它将返回

C  H  O
40 66 5
13 25 5

对于不同的元素,所有列都是单独的列,对于不同的条目,所有行都是单独的列。有什么配方可以做到这一点吗?

你可以自己制作配方

使用ALT和F11打开VBA编辑器并插入新模块

单击“工具”,然后单击“引用”,添加对Microsoft VBScript正则表达式5.5的引用

现在添加以下代码:

公共函数公式将公式拆分为字符串,将字母拆分为字符串 作为对象的模糊RE Set RE=CreateObjectVBScript.RegExp 带RE .Global=True .MultiLine=False .IgnoreCase=False .Pattern=[A-Z]{1}[A-Z]? 以 暗匹配作为对象 Set Matches=RE.ExecutetheFormula 将集合设置为集合 设置集合=新集合 作为整数的Dim i 作为对象的暗匹配 对于i=匹配项。计数-1到0步骤-1 Set Match=Matches.Itemi 集合。添加公式的中间部分,Match.FirstIndex+LenMatch.Value+1,UCaseTrimMatch.Value theFormula=LefttheFormula,Match.FirstIndex 下一个 FormulaSplit=未找到 出错时继续下一步 FormulaSplit=collection.itemucasetrimitter 错误转到0 如果FormulaSplit=那么 公式split=1 如果结束 设置RE=无 设置匹配项=无 设置匹配=无 设置集合=无 端函数 用法:

公式splitc40h66o5,H将返回66。 公式splitc40h66o5,O将返回5。 公式splitc40h66o5,blah将返回未找到。 您可以直接在工作簿中使用此公式。
你可以自己制作配方

使用ALT和F11打开VBA编辑器并插入新模块

单击“工具”,然后单击“引用”,添加对Microsoft VBScript正则表达式5.5的引用

现在添加以下代码:

公共函数公式将公式拆分为字符串,将字母拆分为字符串 作为对象的模糊RE Set RE=CreateObjectVBScript.RegExp 带RE .Global=True .MultiLine=False .IgnoreCase=False .Pattern=[A-Z]{1}[A-Z]? 以 暗匹配作为对象 Set Matches=RE.ExecutetheFormula 将集合设置为集合 设置集合=新集合 作为整数的Dim i 作为对象的暗匹配 对于i=匹配项。计数-1到0步骤-1 Set Match=Matches.Itemi 集合。添加公式的中间部分,Match.FirstIndex+LenMatch.Value+1,UCaseTrimMatch.Value theFormula=LefttheFormula,Match.FirstIndex 下一个 FormulaSplit=未找到 出错时继续下一步 FormulaSplit=collection.itemucasetrimitter 错误转到0 如果FormulaSplit=那么 公式split=1 如果结束 设置RE=无 设置匹配项=无 设置匹配=无 设置集合=无 端函数 用法:

公式splitc40h66o5,H将返回66。 公式splitc40h66o5,O将返回5。 公式splitc40h66o5,blah将返回未找到。 您可以直接在工作簿中使用此公式。

我曾尝试在一个配方奶粉中这样做,并得出以下结论:

=IFERROR((MID($C18,FIND(D17,$C18)+1,2))*1,IFERROR((MID($C18,FIND(D17,$C18)+1,1))*1,IFERROR(IF(FIND(D17,$C18)>0,1),0)))

它不是很整洁,如果您的任何元素出现超过99次,则必须进一步扩展-我在工作表上也使用了随机放置,因此标题H、C和O位于第17行。我个人同意Jamie的答案,但我只是想试试看我是否可以在公式中做到这一点,并认为这是值得分享的另一个角度。

我尝试过在公式中做到这一点,并得出以下结论:

=IFERROR((MID($C18,FIND(D17,$C18)+1,2))*1,IFERROR((MID($C18,FIND(D17,$C18)+1,1))*1,IFERROR(IF(FIND(D17,$C18)>0,1),0)))

它不是很整洁,如果您的任何元素出现超过99次,则必须进一步扩展-我在工作表上也使用了随机放置,因此标题H、C和O位于第17行。我个人会同意Jamie的答案,但我只是想尝试一下,看看我是否可以用一个可能的公式来做这件事,并认为这是值得分享的另一个观点。

即使这有一个优秀且被接受的VBA解决方案,我也无法抗拒不使用VBA来做这件事的挑战

我早些时候发布了一个解决方案,但这在所有情况下都不起作用。此新代码应始终有效:

=MAX(
   IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0),
   IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0)
 )
按数组公式输入:Ctrl+Shift+Enter

输出:

当找不到时,公式输出0,我只是使用条件格式将0变成灰色

工作原理

公式的这一部分查找元素,后跟1到99之间的数字。如果找到,则返回原子数。否则,返回0。结果存储在一个数组中:

IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0)
IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0)
如果是C13H25NO5,则为sea rch for C返回此数组:

{1,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,...,0}
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}
1是第一个数组元素,因为C1是匹配项。13是第十三个数组元素,这就是我们感兴趣的

公式的下一部分查找元素,后跟一个大写字母,表示新元素。字母A到Z是字符65到90。如果找到,则返回数字1。否则,返回0。结果存储在一个数组中:

IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0)
IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0)
Z被加到化学式中,这样当它的最后一个元素没有数字时就会找到匹配项。例如,H2O。元素周期表中没有元素Z,所以这不会引起问题

对于C13H25NO5,搜索N将返回以下数组:

{1,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,...,0}
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}
1是数组中的第15个元素。那是因为它发现了字母NO,而O是字母表中的第15个字母


从每个阵列中获取最大值可以得到所需的原子数。

尽管这有一个优秀且被接受的VBA解决方案,但如果不使用VBA,我无法抵抗这样做的挑战

我早些时候发布了一个解决方案,但这在所有情况下都不起作用。此新代码应始终有效:

=MAX(
   IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0),
   IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0)
 )
按数组公式输入:Ctrl+Shift+Enter

输出:

当找不到时,公式输出0,我只是使用条件格式将0变成灰色

工作原理

公式的这一部分查找元素,后跟1到99之间的数字。如果找到,则返回原子数。否则,返回0。结果存储在一个数组中:

IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0)
IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0)
对于C13H25NO5,搜索C将返回以下数组:

{1,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,...,0}
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}
1是第一个数组元素,因为C1是匹配项。13是第十三个数组元素,这就是我们感兴趣的

公式的下一部分查找元素,后跟一个大写字母,表示新元素。字母A到Z是字符65到90。如果找到,则返回数字1。否则,返回0。结果存储在一个数组中:

IFERROR(IF(FIND(C$1&ROW($1:$99),$B2),ROW($1:$99),0),0)
IFERROR(IF(FIND(C$1&CHAR(ROW($65:$90)),$B2&"Z"),1,0),0)
Z被加到化学式中,这样当它的最后一个元素没有数字时就会找到匹配项。例如,H2O。元素周期表中没有元素Z,所以这不会引起问题

对于C13H25NO5,搜索N将返回以下数组:

{1,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,...,0}
{0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0}
1是数组中的第15个元素。那是因为它发现了字母NO,而O是字母表中的第15个字母



从每个数组中取最大值可以得到所需的原子数。

字符串是否固定,我的意思是,每个条目是否都有一个字母表,然后是两个数字,一个字母表,然后是两个数字,一个字母表和其他数字?因此每个条目都有一个字母表,但数字可能会有所不同。例如,你可以得到C10H60,或者你可以得到CH4,它应该把C算作1,甚至CH3O,它应该把C和O算作1,把H算作3K,但一切都是标准的,因为总是从C开始,然后是H,然后是O。对吗?所以基本上,它必须算出C,H,O或者化学式中可能存在的任何化学元素。例如,在处理这个问题时,H2CO3将显示为H-2、C-1和O-3,请注意区分大小写。二氧化碳是C-1,O-2。Co2钴是Co-2。字符串是固定的吗?我的意思是,每个条目都有一个字母表,然后是两个数字,一个字母表,然后是两个数字,一个字母表和其他数字吗?所以每个条目都有一个字母表,但数字可以不同。例如,你可以得到C10H60,或者你可以得到CH4,它应该把C算作1,甚至CH3O,它应该把C和O算作1,把H算作3K,但一切都是标准的,因为总是从C开始,然后是H,然后是O。对吗?所以基本上,它必须算出C,H,O或者化学式中可能存在的任何化学元素。例如,在处理这个问题时,H2CO3将显示为H-2、C-1和O-3,请注意区分大小写。二氧化碳是C-1,O-2。二氧化碳钴就是二氧化碳。谢谢你的帮助!我现在只是尝试一下,基本上是复制并粘贴了它,但我一直得到以下答复:-用户定义的类型不是defined@user2062207-是否添加了对Microsoft VBScript正则表达式5.5库的引用?在VBA编辑器中,单击“工具”,然后单击“参照”。然后在列表中查找Microsoft VBScript正则表达式5.5。勾选它,然后按OK。@user2062207我已经更新了Jamie的代码,使其具有后期绑定。我相信当Jamie批准它时,您应该能够看到更新的代码,然后您可以检查它。@JurPertin-谢谢您的帮助。我不能直接接受你的编辑,但我已经采纳了你的想法并编辑了答案。谢谢很抱歉回复太晚,我们实验室的网络瘫痪了。我现在就去!谢谢你的帮助!我现在只是尝试一下,基本上是复制并粘贴了它,但我一直得到以下答复:-用户定义的类型不是defined@user2062207-是否添加了对Microsoft VB的引用
脚本正则表达式5.5库?在VBA编辑器中,单击“工具”,然后单击“参照”。然后在列表中查找Microsoft VBScript正则表达式5.5。勾选它,然后按OK。@user2062207我已经更新了Jamie的代码,使其具有后期绑定。我相信当Jamie批准它时,您应该能够看到更新的代码,然后您可以检查它。@JurPertin-谢谢您的帮助。我不能直接接受你的编辑,但我已经采纳了你的想法并编辑了答案。谢谢很抱歉回复太晚,我们实验室的网络瘫痪了。我现在就去!谢谢你的帮助!我将试一试,看看它是如何运作的。这两个例子都很完美,所以我投了赞成票。请注意,如果一个元素有两个字符,它将不起作用。对于CO2,它正确返回1表示碳,2表示氧。但对于二氧化碳,它错误地返回1表示碳,1表示钴。我认为如果不使用数组公式,就无法使用函数完成此操作。谢谢您的帮助!我将试一试,看看它是如何运作的。这两个例子都很完美,所以我投了赞成票。请注意,如果一个元素有两个字符,它将不起作用。对于CO2,它正确返回1表示碳,2表示氧。但对于二氧化碳,它错误地返回1表示碳,1表示钴。我不认为不使用数组公式就可以用函数实现这一点。