查找具有给定属性的列中的第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)
也就是说,你会提供一个Range
search和数字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