2016-07-19 132 views
0

我相信新的Excel宏和VBA,和现在面临以下问题细胞提取关键词:Excel中:VBA宏从包含字符串

(1)I有一个数据组,其具有〜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” =“球”,并在一个特定的列中的单元(一个或多个)含有“狗玩球”,‘球差’等

我如何可以提取含有“YourCriteria行”?什么是需要修改的代码?

感谢

回答

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()>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 
+0

嗨cwx,请你解决我的疑问? – pranav

+1

+1使用版本没有[开始]参数(它似乎从来没有对我工作正常),并包括> 0。 如果您希望标准忽略大小写,您还应该考虑使用vbTextCompare。例如。你可以匹配“YourCriteria”,“yourcriteria”,“yOurcrIteriA”等。 – Mikegrann

+0

@pranav编辑:) – cxw

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

参数或参数

开始

可选。这是搜索的起始位置。如果省略该参数,搜索将开始在位置1

在其中进行搜索的字符串。

子串

要查找的子字符串。

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

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

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

2

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

If Cells(r, Columns("B").Column).Value Like "*YourCriteria*" Then 'Found 
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