从描述中提取计数的方法

时间:2019-05-17 19:29:38

标签: excel vba excel-formula

我经常要负责从其他来源提取信息,并接收没有大小单位的信息。大小或数量在说明中,并希望能够使用以下逻辑编写一个excel公式:

如果单元格包含胶囊,片剂,液体等,则使该单元格也相等胶囊,片剂,液体等+之前的数字

一些示例项目:

PhoneEntity

如果下面的说明中有说明,请在下面的栏中输入“平板电脑”或“计数”。

我尝试使用if和then语句,但是不知道如何将它们组合起来以创建'or'和'and'

期望上面示例中的列如下所示:

phones

3 个答案:

答案 0 :(得分:1)

如果值在A列中,则公式将如下所示:

=+IF(ISERROR(VALUE(RIGHT(LEFT(A3,SEARCH(IF(ISERROR(SEARCH("Tablets",A3)),IF(ISERROR(SEARCH("Capsules",A3)),IF(ISERROR(SEARCH("Count",A3)),"","Count"),"Capsules"),"Tablets"),$A3)-1),4))),0,VALUE(RIGHT(LEFT(A3,SEARCH(IF(ISERROR(SEARCH("Tablets",A3)),IF(ISERROR(SEARCH("Capsules",A3)),IF(ISERROR(SEARCH("Count",A3)),"","Count"),"Capsules"),"Tablets"),$A3)-1),4)))&" "&IF(ISERROR(SEARCH("Tablets",A3)),IF(ISERROR(SEARCH("Capsules",A3)),IF(ISERROR(SEARCH("Count",A3)),"","Count"),"Capsules"),"Tablets")

由于公式很长,请参见下面的两个不同的单元格,第一个搜索我们要查找的项目(片剂,胶囊或计数)并返回它,第二个搜索上一个数字:

+IF(ISERROR(SEARCH("Tablets",A4)),IF(ISERROR(SEARCH("Capsules",A4)),IF(ISERROR(SEARCH("Count",A4)),"","Count"),"Capsules"),"Tablets")

+IF(ISERROR(VALUE(RIGHT(LEFT(A4,SEARCH(B4,$A4)-1),4))),0,VALUE(RIGHT(LEFT(A4,SEARCH(B4,$A4)-1),4)))

该公式对于数字的获取有一个限制,并且限制为9999,这比该公式对结果进行中继更重要。同样,对于数字1到9,公式可能会返回错误#value。如果需要,可以通过更改第二个公式来解决。

答案 1 :(得分:0)

我会做这样的事情:

  • 从IF语句IF(-test-, -true-, -false-)
  • 开始
  • 填充-test-部分。假设我首先想找到“平板电脑”。我可以使用...FIND("Tablet",A2)...,但是这里的问题是,如果找不到“ Tablet”,它将引发错误,因此我将对此进行错误校验,例如...IFERROR(Find("Tablet",A2), FALSE)...,如果没有“ Tablet”,则返回FALSE在单元格A2中找到。
  • 但是我也想寻找'Count',所以我可以将OR与已经建立的...OR( IFERROR(Find("Tablet",A2), FALSE), IFERROR(Find("Count",A2), FALSE) )一起使用,以便将结果或在一起(如果找到“ Tablet”或“ Count” ,此函数将返回一个数字(由于它是一个数字,因此将其读取为TRUE!)
  • 现在,我将该OR()方程式放入-true-的IF中,那么我当然可以将其作为“ Tablet”或“ Count”,或在其中放置一个新的方程式以明确说明其发现的内容。而我的-false-我可以做出""

这时,我将拥有一个完整的方程式,该方程式将检查“ Count”或“ Tablet”并吐出我的-true-方程式中的所有内容。否则,该单元格将保持空白: IF(OR( IFERROR(Find("Tablet",A2), FALSE), IFERROR(Find("Count",A2), FALSE) ), "Count/Tablet", "")

答案 2 :(得分:0)

这是使用RegExp进行了经过严格测试的UDF:

Function Amounts(txt)
    Dim re As Object, allMatches, m, rv, sep

    Set re = CreateObject("VBScript.RegExp")
    re.Pattern = "(\d+\s?(tablets|tablet|count|liquid))"
    re.ignorecase = True
    re.MultiLine = True
    re.Global = True

    Set allMatches = re.Execute(txt)
    For Each m In allMatches
        rv = rv & sep & m
        sep = ","
    Next m
    Amounts = IIf(rv <> "", rv, "(none)")
End Function

用法:

=Amounts(A2)

enter image description here