Excel 2007对用户定义的字符串使用“查找”功能,然后将每个匹配项的整行复制到另一个工作表

时间:2012-06-28 00:13:50

标签: string excel-vba excel-2007 row vba

我是Excel VBA的新手,这是我第一次尝试制作一个有用的宏来加快我的工作流程。

我正在尝试做什么

我的数据文件大约有15行,大约15列。我希望我的宏做的是,当我在单独的工作表上按下一个按钮时,代码会将一个字符串输入到该工作表上的特定单元格中,转到包含所有数据的工作表,然后使用查找在其中一列上执行函数以查找我已定义的字符串的所有实例。

找到字符串的所有实例后,我想复制相应的行并将它们粘贴到我运行宏的工作表中。

为了澄清,我想要找到字符串的列包含人们输入的描述 - 不只是要查看一个单词;这就是为什么我一直在尝试使用Find函数。

到目前为止我的尝试:

Sub FindTextBasicData()

'Define variables
Dim sourceSht As Worksheet
Dim outputSht As Worksheet
Dim strSearch As String
Dim searchRange As Range
Dim outputRange As Range

'Set the sheet variables to those present in the workbook
Set sourceSht = Sheets("Basic Data")
Set outputSht = Sheets("Output")

'Set the value of the string variable to the contents of cell C2 in the output sheet
strSearch = outputSht.Range("C2")

'Set the range variable to the range in the data sheet that I want to check    
Set searchRange = sourceSht.Range("C6:C15448")

'Use the Find function to look through the range I defined and select all rows where the
'string variable can be found, setting the second range variable to these values
Set outputRange =searchRange.Find(What:=strSearch, After:=.Cells(3, 6), LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False).EntireRow

'Copy the results of the Find function to the clipboard
outputRange.Copy

'Select the 5th row of the output sheet as the location to paste the data, and then paste   
outputSht.Select
Rows(5).Select
ActiveSheet.Paste

End Sub

我知道我肯定在查找函数时遇到了什么问题,但是我无法解决这个问题 - 我认为我的问题在于After参数,因为它不符合我的想法(引用单元格C6作为开始使用Find from?的地方。我试着查看Ozgrid上的Find函数指南,但我想我只是把自己弄糊涂了。

如果我能让这个宏工作正常,我将能够大量使用它来大大简化我必须为这15000条记录做的数据分析。对此的任何帮助将不胜感激,我当然乐意澄清我是否还没有解释好的东西。

3 个答案:

答案 0 :(得分:1)

引用.Cells(3, 6)需要使用With块进行限定,或者直接引用WorksheetRange对象。这里最简单的解决方案是sourceSht.Cells...

此外,Cells(3, 6)是单元格F3,而您需要单元格C6。把它们放在一起,你就应该有After:=sourceSht.Cells(6, 3)

答案 1 :(得分:0)

如上所述。您在.Cells(3, 6)前面使用点运算符而不使用With。最好的方法是在您的情况下直接将它引用到具体表单sourceSht。如果要引用单元格C6,则可以使用例如:

sourceSht.Range("C6")sourceSht.Cells(6,3)sourceSht.Cells(3,"C")等。

但我认为这不应该导致问题(如果引用有效),因为 After 参数不相关(和可选),如果您要做的只是在整个范围内搜索。实际上只需要 What 参数。

set outputRange = searchRange.Find(strSearch).EntireRow应该做到这一点。此外,如果您指定 After 参数,则搜索不会查看该单元格。

无论如何,这只会为您提供找到该字符串的行中的第一个单元格。不是所有的人。您可能希望将搜索代码与FindNext方法结合使用,或者只使用Find方法的 After 参数。

答案 2 :(得分:0)

使用Range.Find方法根据第二个工作表上的值过滤第一个工作表上的行,而不是Range.AutoFilter方法,而是仅复制可见行。恕我直言,这比Range.Find方法更好(这仍然比循环更好)。

此网站上有很多关于如何将可见行复制到另一个工作表的示例,以下是一个示例:Excel Macros - Copy and paste filtered rows