【问题标题】:Excel 2013, searching for partial text in one cell and overwriting adjacent cell if condition is metExcel 2013,在一个单元格中搜索部分文本并在满足条件时覆盖相邻单元格
【发布时间】:2016-04-15 23:08:54
【问题描述】:

我需要写一个宏。

我有一个大约 30000 行的工作簿(每天更改)。

  1. 我需要在 (A) 列的单元格中的字符串中搜索表达式“TRADE”

  2. 如果单元格内的字符串包含表达式 TRADE 我需要将 (B) 列(同一行)中相关单元格中的字符串更改为表达式“TRADEIN”

  3. 如果条件不满足,列 (B) 中的相关单元格需要保持不变


到目前为止我学到了什么:

Formula =IF(ISNUMBER(FIND("TRADE", A1 )), 1, 2) 仅当直接放在单元格内并在 Excel 中复制时才会相应地更改相邻单元格的值。

当我尝试将字符串作为结果时,问题就开始了

Formula: =IF(ISNUMBER(FIND("TRADE", A1 )), "TRADEIN", "") 不起作用 ->错误

Formula: =IF(ISNUMBER(FIND("TRADE", A1 )), ""TRADEIN"", "") 不起作用->错误


然后,任何试图让我的宏从 VBA 将更复杂的公式插入单元格的尝试都失败了,即:

以下工作正常:

For i=1 to i=NumberOfRows

ActiveSheet.Cells(i, 2).Formula = "= 2+2"

next i

下面不起作用(同样,如果将公式直接放在单元格中,则公式有效):

For i=1 to i=NumberOfRows

ActiveSheet.Cells(i, 2).Formula = "=IF(ISNUMBER(FIND("TRADE", (i, 1)), 1, 2)"

next i

我认为列出我到目前为止所有失败的尝试是没有意义的(我想有很多无用的行要阅读),但无论如何 - 如果我错了,请纠正我。

我找不到与我的任务一样具体的解决方案,并且在更改网上找到的一些解决方案时遇到了问题,而其他解决方案根本不适合我。也许不完全知道如何以最有效的方式询问我需要的东西。非常基本,如果可以的话,尽量不要错过提议的模块/子程序中的任何声明 - 在我遵循的几个示例之外使用和创建对象和方法时,我还没有信心,或者选择/使用正确的具有兼容方法/功能等的变量类型。

【问题讨论】:

  • 有很多方法可以完成你所追求的,正如你在下面的答案中看到的那样,但你知道,如果你想让你的公式在 VBA 中工作,你可以这样写:@ 987654326@。请注意 TRADE 中引号周围的打开和关闭 " 以使 VBA 识别您要在公式中包含 '"s` 以及如何使用 & 将变量包装到字符串中。
  • 我只是想评论一下,对于您的第一个问题,这是一个很好的提出的问题。您提出了一个明确的问题,并展示了您尝试过但无法工作的代码。比很多第一个问题要好。欢迎来到 SO。
  • 感谢大家的快速回复。今天将坐下来学习如何根据论坛规则和机制奖励您的努力。关于解决方案,我应该有时间在明天的工作中检查并找出对我的情况最有效的方法。

标签: excel if-statement filtering vba


【解决方案1】:

使用 VBA 这就是实现目标的方法。这将找到 A 列中用于设置工作范围的最后一行。

Sub test()

Dim w As Range
lrow = Range("A1", Range("A" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible).Count
For Each w In Range("A1:A" & lrow).Cells
    If w.Value = "trade" Then
        w.Offset(0, 1).Value = "tradein"
    End If
Next w

End Sub

【讨论】:

  • 感谢您提供该模块,唯一的缺点是它仅适用于完全匹配(“trade”)并且会忽略(“TRADE”;“TradeIn”等),使用星号不会似乎改变了什么。对于所有可能的情况(40+),我仍然可以复制 For 函数,这让我暂时解决了问题。再次谢谢你:)
  • 现在,我不知道为什么,但是如果我尝试在完整文件上使用该模块(确实在手动填充了 20 行数据的样本上对其进行了测试)它不会更新列中的值B. 但是,如果我删除“SpecialCells(xlCellTypeVisible)”,它确实有效。从第二排开始...?
  • 我的意思是:...从第二行使它看起来像这样 ->[lrow = Range("A1", Range("A" & Rows.Count).End(xlUp)) 。数数]...?完整的 file.xlsx 具有使用我目前无法访问的进程/代码从 Access 数据库查询中导出的值,当我在完整的 file.xlsx (MSExcel2013) 中查看它们时,两列中的值似乎都是字符串
  • 您可以使用LIKE 代替=If w.value like "trade*"
  • 先生,您是救世主。非常感谢。我可以在其他我遇到困难的地方使用它,尽管要搜索的案例数量要少得多。再次感谢您,祝您有美好的一天:)
【解决方案2】:

练习使用自动过滤器,一旦解决了问题,请使用宏记录器获取代码。

选择 A 列,然后转到 Data=>Filter=>text Filter=>Contains....在框中键入要过滤的单词。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-17
    • 2018-07-03
    • 1970-01-01
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多