[英]Excel : VBA Macro to extract keyword from cell containing string
我是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” =“球”,并且特定列中的单元格包含“狗和球一起玩”,“球不好”等。
如何提取包含“ YourCriteria”的行?需要对代码进行哪些修改?
谢谢
为了扩大道格的答案,
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
VBA中有一个内置的运算符: Like 。 您可以使用以下命令替换当前测试:
If Cells(r, Columns("B").Column).Value Like "*YourCriteria*" Then 'Found
InStr( [start], string, substring, [compare] )
参数或参数
开始
可选的。 它是搜索的起始位置。 如果省略此参数,则搜索将从位置1开始。
串
要在其中搜索的字符串。
子串
您要查找的子字符串。
比较可选。 这是要执行的比较的类型。 它可以是以下值之一:
VBA常数值说明vbUseCompareOption -1使用选项比较vbBinaryCompare 0二进制比较vbTextCompare 1文本比较
最快的方法是:
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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.