Excel 从描述中提取计数的方法

Excel 从描述中提取计数的方法,excel,vba,excel-formula,Excel,Vba,Excel Formula,我的任务是不断地从另一个来源获取信息,并接收不带大小名称的信息。大小或计数在说明中,希望能够使用以下逻辑编写excel公式: 如果单元格中包含胶囊、片剂、液体等,则将此单元格与胶囊、片剂、液体等+其前面的数字相等 几个示例项目: Nature's Bounty Magnesium 500 mg, 200 Tablets Aerobic Life Mag 07 Oxygen Digestive System Cleanser Capsules, 180 Count Natural

我的任务是不断地从另一个来源获取信息,并接收不带大小名称的信息。大小或计数在说明中,希望能够使用以下逻辑编写excel公式:

如果单元格中包含胶囊、片剂、液体等,则将此单元格与胶囊、片剂、液体等+其前面的数字相等

几个示例项目:

Nature's Bounty Magnesium 500 mg, 200 Tablets    
Aerobic Life Mag 07 Oxygen Digestive System Cleanser Capsules, 180 Count    
Natural Vitality Natural Calm Anti Stress Drink 30 count Raspberry Lemon
如果描述中提到,希望下一列有平板电脑或计数

我尝试过使用if-and-then语句,但不知道如何组合它们来创建“or”和“and”

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

200 Tablets
180 Count
30 Count

如果值在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,公式可能返回错误值。如果需要,可以通过更改第二个公式来解决此问题。

我会这样做:

  • 从IF语句开始
    IF(-test-,-true-,-false-)
  • 填充-测试-部分。假设我第一次想找到“平板电脑”。我可以使用
    …FIND(“Tablet”,A2)…
    但是,这里的问题是如果找不到“Tablet”,它将抛出一个错误,因此我将像这样进行错误验证
    …IFERROR(FIND(“Tablet”,A2),FALSE)…
    如果在单元格A2中找不到“Tablet”,它将返回FALSE
  • 但我还想查找“Count”,这样我就可以使用一个或,以及我已经建立的
    …或(IFERROR(Find(“Tablet”,A2),FALSE),IFERROR(Find(“Count”,A2,FALSE))
    这样就可以或一起使用结果-如果找到“Tablet”或“Count”,这个函数将返回一个数字(因为它是一个数字,所以读作TRUE!)
  • 现在我把这个或()方程放到IF中,如果是真的,那么我当然可以把它做成“平板电脑”或“计数”,或者在那里放一个新的方程来具体说明它发现了什么。而my-false-我可以生成
在这一点上,我将有一个完整的方程,它将检查“计数”或“平板”,并吐出我的真实方程中的任何东西。否则,单元格将保持空白:
IF(或(IFERROR(Find(“table”,A2),FALSE),IFERROR(Find(“Count”,A2),FALSE)),“Count/table”,“FALSE”)

下面是一个使用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

您可以仅使用公式来执行此操作,但公式效率非常低,因此我建议使用VBA。到目前为止,您尝试了什么?我也在使用R进行这项工作,似乎无法使and/or语句在其中也起作用。对那里的引导
+
的用途感到好奇。公式生成一个
变量/String
…我用+代替=,因为它更快(在西班牙语键盘中),而且excel启动公式没有什么区别。这是我在西班牙语键盘上打字的习惯,在这里你需要使用Shift键来输入=。有趣;我需要按Shift键来做一个
+
;-)
=Amounts(A2)