【问题标题】:Excel : VBA Macro to extract keyword from cell containing stringExcel:VBA宏从包含字符串的单元格中提取关键字
【发布时间】:2016-07-20 02:25:14
【问题描述】:

我是 Excel 宏和 VBA 的新手,面临以下问题:

(1) 我有一个大约 50,000 行和 11 列的数据集。

(2) 我需要根据某个关键字从工作表中提取行,该关键字与特定列中存在的字符串匹配。

(3) 我有来自另一个堆栈溢出问题的以下代码:

Sub testIt()
Dim r As Long, endRow as Long, pasteRowIndex As Long

endRow = 10 ' of course it's best to retrieve the last used row number via a function
pasteRowIndex = 1

For r = 1 To endRow 'Loop through sheet1 and search for your criteria

If Cells(r, Columns("B").Column).Value = "YourCriteria" Then 'Found

        'Copy the current row
        Rows(r).Select 
        Selection.Copy

        'Switch to the sheet where you want to paste it & paste
        Sheets("Sheet2").Select
        Rows(pasteRowIndex).Select
        ActiveSheet.Paste

        'Next time you find a match, it will be pasted in a new row
        pasteRowIndex = pasteRowIndex + 1


       'Switch back to your table & continue to search for your criteria
        Sheets("Sheet1").Select  
    End If
Next r
End Sub

(4) 当正在搜索的列的单元格将“YourCriteria”作为唯一条目时,这非常有效。

(5) 但是,在我的数据中,我的字符串中嵌入了“YourCriteria”

例如:“YourCriteria” = “ball”,特定列中的单元格包含“the dog play with the ball”、“the ball is bad”等。

如何提取包含“YourCriteria”的行?需要对代码进行哪些修改?

谢谢

【问题讨论】:

    标签: vba excel macros


    【解决方案1】:

    为了扩展 Doug 的答案,

    If InStr(Cells(r, 2).Value, "YourCriteria")>0 Then 'Found
                   '  ^ Column A=1, B=2, ...
    

    编辑2 更改为您想要查看的任何列号(C=3、D=4、...)。你也可以像以前一样使用Columns("B").Column,如果你觉得更舒服的话。

    我发现If InStr()>0If Instr() 更可靠,因为InStrlots of return-value options

    一般的想法,以避免将来出现问题 - 而不是切换工作表,明确参考您的意思是哪个工作表。示例(未显示所有代码):

    dim shSource as Sheet
    set shSource = ActiveWorkbook.Sheets("Sheet1")
    dim shDest as Sheet
    set shDest = ActiveWorkbook.Sheets("Sheet2")
    ...
        If InStr(shSource.Cells(r, 2).Value, "YourCriteria")>0 Then 'Found
            shSource.Rows(r).Copy
            shDest.Rows(pasteRowIndex).Select
            shDest.Paste
    

    【讨论】:

    • 嗨 cwx,你能解决我的疑问吗?
    • +1 用于使用不带 [start] 参数的版本(这对我来说似乎永远无法正常工作)并包含 >0。如果您希望条件忽略大小写,您还应该考虑使用 vbTextCompare。例如。您可以匹配“YourCriteria”、“yourcriteria”、“yOurcrIteriA”等。
    【解决方案2】:

    VBA 中有一个内置运算符:Like。你可以用这个替换当前的测试:

    If Cells(r, Columns("B").Column).Value Like "*YourCriteria*" Then 'Found
    

    【讨论】:

      【解决方案3】:
      InStr( [start], string, substring, [compare] )
      

      参数或参数

      开始

      可选。它是搜索的起始位置。如果省略此参数,则搜索将从位置 1 开始。

      字符串

      要在其中搜索的字符串。

      子字符串

      您要查找的子字符串。

      比较可选。这是要执行的比较类型。它可以是以下值之一:

      VBA 常量值说明 vbUseCompareOption -1 使用选项比较 vbBinaryCompare 0 二进制比较 vbTextCompare 1 文字比较

      借自http://www.techonthenet.com/excel/formulas/instr.php

      【讨论】:

        【解决方案4】:

        最快的方法是:

        • 对数据应用过滤器
        • 设置范围变量 = .SpecialCells(xlCellTypeVisible)
        • 使用range.Copy Sheets("Sheet2").Range("A1") 将数据直接复制到Sheet2
        子 DoIt() 将 SearchRange 调暗为范围 Sheets("Sheet1").UsedRange.AutoFilter Field:=2, Criteria1:="=*Ball*", _ 运算符:=xlAnd 设置 SearchRange = Sheets("Sheet1").UsedRange.SpecialCells(xlCellTypeVisible) 如果不是 SearchRange 什么都不是,那么 SearchRange.Copy Sheets("Sheet2").Range("A1") 万一 结束子

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-10-02
          • 1970-01-01
          • 2016-12-17
          • 2014-04-17
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 1970-01-01
          相关资源
          最近更新 更多