查找具有给定属性的列中的第n个单元格

我没有太多的经验,但我试图编写一个函数,将search列A和第一次发现一个string以“AT”开头,它会将整个string复制到单元格N1,第二个string以“ AT“将被复制到N2,等等,直到A列用尽。 这是我迄今为止的微弱尝试,但我没有太多的运气。

Function Find_AT(ByVal I As Integer) Dim c As Range Dim COUNTER As Integer Dim CAPTURE As Long COUNTER = 0 For Each c In Range("A1", Range("A65636").End(xlUp)) If Left(c, 2) = AT Then COUNTER = COUNTER + 1 If COUNTER = I Then CAPTURE = c Exit For End If End If Next c Find_AT = CAPTURE End Function 

考虑:

 Function Find_AT(ByVal I As Long) As String Dim c As Range Dim COUNTER As Long Dim CAPTURE As String Dim v As String COUNTER = 0 CAPTURE = "xx" For Each c In Range("A1", Range("A65636").End(xlUp)) v = c.Text & " " If Left(v, 2) = "AT" Then COUNTER = COUNTER + 1 If COUNTER = I Then CAPTURE = c.Address Exit For End If End If Next c Find_AT = CAPTURE End Function 

你的代码的错误是文本(string)AT需要用双引号“AT”括起来。 将Option Explicit添加到模块的顶部,当您尝试编译或执行该函数时,会出现此错误。

但是,考虑到你的描述,我怀疑你可能想写一个子程序(SUB)而不是函数。 函数是为了返回一个值。 如果你想使用一个函数,你可以像这样定义它:

 Function Find_AT(rng As Range, ByVal i As Integer) 

也就是说,你会提供一个Rangesearch和数字1来find范围中以“AT”开头的第一个值。 但是,如果你把这个函数放在一个单元格中并复制下来,它将只返回第一个匹配项。 您需要手动将1更改为2,3等(或使用ROW()的变体自动生成此序列)。

无论如何,我怀疑你真的想要一个SUB程序,你可以通过点击工作表上的一个button来运行。

如果你想继续你的当前函数,那么你可以声明返回types为一个string:

 Function Find_AT(ByVal i As Integer) As String '... Dim CAPTURE As String '... CAPTURE = c.Text 

否则,设置CAPTURE = c并试图返回这个值会导致一个问题,因为c是一个Range对象。

过滤更有效率。 以下两种方法:

过滤

 Sub GetAT1() X = Filter(Application.Transpose(Range([a1], Cells(Rows.Count, "A").End(xlUp))), "AT", True) If UBound(X) > 0 Then [n1].Resize(UBound(X) + 1) = Application.Transpose(X) End Sub 

自动筛选

 Sub GetAT() Dim rng1 As Range Set rng1 = Range([a1], Cells(Rows.Count, "A").End(xlUp)) Application.ScreenUpdating = False ActiveSheet.AutoFilterMode = False rng1.AutoFilter 1, "=AT*" rng1.Copy [n1] If LCase$(Left$([n1], 2)) <> "at" Then [n1].Delete xlUp ActiveSheet.AutoFilterMode = False Application.ScreenUpdating = True End Sub