2016-07-19 173 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