2013-06-27 76 views
1

我沒有太多經驗,但我正在嘗試編寫一個函數,它將搜索列A,並在第一次找到以「AT」開頭的字符串時,它會將整個字符串複製到單元格N1,以「AT」開頭的第二個字符串將被複制到N2,等等,直到列A用完。這是我迄今爲止的微弱嘗試,但我沒有太多運氣。查找具有給定屬性的列中的第n個單元格

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 

回答

0

您的代碼出錯是文本(字符串)AT需要用雙引號「AT」括起來。將Option Explicit添加到模塊的頂部,當您嘗試編譯或執行該函數時,它會將您帶到此錯誤。

但是,根據你的描述,我懷疑你可能想寫一個子程序(SUB)而不是函數。函數旨在返回一個值。如果你想使用的功能,你可以定義這樣的:

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

也就是說,你會爲它供給一個Range搜索和數字1來查找範圍以「AT」開頭的第一個值。但是,如果將此函數放入單元格中並將其複製下來,它仍將僅返回第一次出現。您需要手動將1更改爲2,3等(或使用ROW()的變體自動生成此序列)。

無論如何,我懷疑你真的想要一個SUB程序,你可以通過點擊工作表上的一個按鈕來運行。

如果您希望繼續使用當前的功能,那麼你可以聲明返回類型爲字符串:

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

否則,設置CAPTURE = c並試圖返回這個值會導致一個問題,因爲c是一個Range目的。

0

考慮:

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 
0

過濾效率要高得多。以下兩種方法:

過濾

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 
+0

在我的經驗,在單元格中刪除是非常低效的。把過濾後的範圍加載到一個變體數組並循環遍歷它會更好嗎? – MiVoth

+0

它只是(可能)刪除單個單元格。 – brettdj

相關問題