【问题标题】:Turn nested if formula into VBA将嵌套 if 公式转换为 VBA
【发布时间】:2019-06-23 01:42:49
【问题描述】:

我想把我的公式变成一个宏。我想在 A 列上查找值并根据条件向 D 列返回不同的值。

我的公式是:

=IF(ISNUMBER(SEARCH("*10*",D2,6)),"word1",IF(ISNUMBER(SEARCH("*15*",D2,1)),"word2",IF(ISNUMBER(SEARCH("*1*",D2,1)),"word3",IF(ISNUMBER(SEARCH("*20*",D2,1)),"word4",IF(ISNUMBER(SEARCH("*30*",D2,1)),"word5")))))

我需要确保对 1 的搜索出现在 10 或 15 之后,这样公式就不会为包含“1”的所有单元格返回 word3。

A 列包含有时拼写错误的文本,因此唯一常见的值是数字。这就是为什么我想在文本中搜索数字以返回 word12345。

下面是一个例子-我每周都会得到一个不同的excel文件,其中包含年龄和姓氏,需要手动填写程序分类。

╔═══════════╦═════════╦═══════════╦═════════╗  
║    AGE    ║  NAME   ║ LAST NAME ║ PROGRAM ║  
╠═══════════╬═════════╬═══════════╬═════════╣  
║ 10 YE OLD ║ ANNE    ║ BROWN     ║ word1   ║  
║ AGE 10    ║ ALLY    ║ SMITH     ║ word1   ║  
║ 15 YO     ║ MATT    ║ JANES     ║ word2   ║  
║ 15        ║ DENNIS  ║ JOHNSON   ║ word2   ║  
║ 10Y OLD   ║ DIANA   ║ WILLIAMS  ║ word1   ║  
║ 20yr      ║ JORDAN  ║ BROWN     ║ word4   ║  
║ 30 YR OLD ║ MELISSA ║ RODRIGUEZ ║ word5   ║  
╚═══════════╩═════════╩═══════════╩═════════╝  

我需要从中获取结果的数据示例如下:

10 YE OLD
AGE 10
15 YO
15
10Y OLD
20yr
30 YR OLD

【问题讨论】:

  • 为什么不使用查找表并将公式缩短到更合适的大小?
  • 你能给我们一个你必须搜索的数据样本以及你在寻找什么吗?这比从您的公式开始并向后工作更容易使用。
  • 我同意 Scott,使用查找表。这样,任何人都可以更新表格并获得他们需要的结果。如果事情需要改变,绝大多数人将无法更新 VBA。尽可能从代码中抽象出逻辑。

标签: excel vba if-statement search excel-formula


【解决方案1】:

您可以尝试一下,我对其进行了测试,它对我有用,如您所说的那样使用整数 (10,15,5,1,30,20) 并将其更改为“word1”等。如果您正在寻找一个范围,即 1 但小于 10,可以更新选择案例。您必须在代码中指示的位置插入工作簿名称和扩展名以及工作表名称。

Sub Select_Case()
Dim RNG As Range
Dim ws As Worksheet
Dim TextTest As String
Dim AllColumn As Variant

Set ws = Workbooks("<EnterYourWorkbookName.Extension_Here>").Worksheets("<EnterYourSheetNameHere>")
AllColumn = ws.Range(ws.Cells(2, 4), ws.Cells(1, 4).End(xlDown).Offset(1, 0)) 'assumes heading in row 1 and no breaks in data

    For i = 2 To UBound(AllColumn) 'assumes heading, no headin i = 1
        TextTest = ws.Cells(i, 4).Value
        Set RNG = ws.Cells(i, 4) 'rows then columns if you need to change it later, this should be where you want to output your data
        Select Case TextTest
            Case Is = 10
                RNG = "word1"
            Case Is = 15
                RNG = "word2"
            Case Is = 1
                RNG = "word3"
            Case Is = 20
                RNG = "word4"
            Case Is = 30
                RNG = "word5"
            'Case else (utilize if you have a catch all just in case it is something not predicted)
                'what to do
        End Select
    Next i
End Sub

如果您需要一些小的调整,请告诉我。

【讨论】:

  • 我相信对于您的情况,Select Case 比嵌套 if 语句更好,它在 VBA 编码中更容易阅读。如果您真的在寻找一个值,那么您评估的顺序也不是那么重要。
  • @user10986956 您正在评估哪一列,您需要哪一列中的信息?年龄总是显示左边2个字符是年龄吗?所以 20 YR OLD,或 20 YR,但总是 20 是左 2?
猜你喜欢
  • 2017-03-03
  • 2020-02-27
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多