0

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

我正在尝试做的事情

我有一个大约 15,000 行 x 大约 15 列的数据文件。我希望我的宏做的是,一旦我在单独的工作表上点击了一个按钮,代码将获取我在该工作表上的特定单元格中键入的字符串,转到包含所有数据的工作表,然后使用 find在其中一列上运行以查找我定义的字符串的所有实例。

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

澄清一下,我想在其中找到字符串的列包含人们输入的描述——不只是一个词要看;这就是为什么我一直在尝试使用 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

我知道我肯定在 find 函数上做错了,但我无法解决这个问题 - 我认为我的问题在于 After 参数,因为它没有按照我的想法执行(参考单元格 C6作为开始使用 Find from 的地方?)。我尝试查看 Ozgrid 上的 Find 功能指南,但我想我只是让自己更加困惑。

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

4

3 回答 3

1

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

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

于 2012-06-28T00:59:00.547 回答
0

正如刚才提到的。.Cells(3, 6) 您在without前面使用点运算符WithsourceSht最好的方法是在您的案例中直接将其引用到混凝土板。如果要引用单元格 C6,则可以使用例如:

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

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

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

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

于 2012-06-28T05:53:12.897 回答
0

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

这个网站上有很多关于如何将可见行复制到另一张工作表的示例,这里是一个示例:Excel 宏 - 复制和粘贴过滤的行

于 2012-06-28T18:25:47.303 回答