Excel:VBA宏从包含字符串的单元格中提取关键字

时间:2016-07-19 17:56:14

标签: excel vba excel-vba macros

我是Excel Macros和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”,特定栏中的单元格包含“狗玩球”,“球坏”等。

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

由于

4 个答案:

答案 0 :(得分:2)

扩展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()>0

我发现If Instr()InStr 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 更可靠,因为{{1}}有lots of return-value options

一般认为,为了避免将来出现问题 - 而不是切换表格,请明确指出您的意思。示例(并非显示所有代码):

{{1}}

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

InStr( [start], string, substring, [compare] )

参数或参数

启动

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

的字符串

要在其中搜索的字符串。

您要查找的子字符串。

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

VBA常量值解释 vbUseCompareOption -1使用选项比较 vbBinaryCompare 0二进制比较 vbTextCompare 1文本比较

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

答案 3 :(得分:1)

最快的方法是:

  • 将过滤器应用于数据
  • 设置范围变量= .SpecialCells(xlCellTypeVisible)
  • 使用range.Copy Sheets("Sheet2").Range("A1")将数据直接复制到Sheet2
    Sub DoIt()

        Dim SearchRange As Range
        Sheets("Sheet1").UsedRange.AutoFilter Field:=2, Criteria1:="=*Ball*", _
            Operator:=xlAnd

        Set SearchRange = Sheets("Sheet1").UsedRange.SpecialCells(xlCellTypeVisible)

        If Not SearchRange Is Nothing Then

            SearchRange.Copy Sheets("Sheet2").Range("A1")

        End If

    End Sub