2012-03-01 43 views
0

我有一個任務返回特定列中的所有連續行。他們將連續有數據,第一個空白行將表示數據結束。我用它來查找列並將其傳遞給我的範圍,但我一直在收到語法錯誤。如何在使用Excel VBA僅識別列時循環訪問一系列單元格?

Dim Col 
Dim found As Boolean 
Dim cellRange As Range 

    found = Cells.Find(What:="My_Search_Text", After:=ActiveCell, LookIn:=xlValues, _ 
     LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False).Activate 

    'Take that column as the range. 
    If (found) Then 
     Col = ActiveCell.Column 
     cellRange = ActiveSheet.Range(Col, ActiveSheet.Range(Col).End(xlDown)).Select 

這裏的目標就是通過它們來得到正確的單元格區域和循環的,但是,我不是在循環部分的最後一行是不工作在所有的人。

那麼這最後一行的正確語法是什麼,是否有更好的方法來完成我想要做的事情?

+0

'ActiveCell.Column'返回列號,而不是列作爲範圍。 – Excellll 2012-03-01 16:28:34

+0

這就是我認爲我需要的範圍,首先找到列。 – 2012-03-01 16:44:39

+0

'Find()'返回一個範圍,所以你的'found'聲明應該是「As Range」。並從Find()的末尾刪除「.Activate」。然後使用'Col = found.Column' – 2012-03-01 17:14:01

回答

4

嘗試,我有選擇的情況下測試了以下:

然後使用設定的範圍。

我已經包含有關我所做的更改的註釋,但如果有任何不清楚的問題,請回來提問。

Option Explicit 
Sub FindRange() 

    Dim RangeStart As Range 
    Dim RangeEndPlusOne As Range 
    Dim RangeEntire As Range 

    ' Better to explicitly identify the sheet being searched 
    With Sheets("Source") 
    ' Do not attempt to activate the target cell. Instead get it as a range. 
    ' Are you sure about "LookAt:=xlPart"? "LookAt:=xlWhole" might be better 
    ' I have explicitly started the search from cell A1 rather than the current 
    ' position of the cursor. 
    Set RangeStart = .Cells.Find(What:="My_Search_Text", After:=.Range("A1"), _ 
           LookIn:=xlValues, LookAt:=xlPart, _ 
           SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
           MatchCase:=False, SearchFormat:=False) 

    If RangeStart Is Nothing Then 
     ' My "My_Search_Text" not found 
    Else 
     ' If the cell below RangeStart is empty, End(xlDown) will jump to 
     ' the bottom of the column or the next cell in the column with a value. 
     ' Search down the column for an empty cell 
     Set RangeEndPlusOne = .Columns(RangeStart.Column).Find(What:="", _ 
          After:=RangeStart, _ 
          LookIn:=xlValues, LookAt:=xlWhole, _ 
          SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
          MatchCase:=False, SearchFormat:=False) 
     ' I ought to test for not found but I assume there is a blank cell below 
     ' RangeStart 

     Set RangeEntire = .Range(RangeStart, RangeEndPlusOne.Offset(-1, 0)) 

     Debug.Print "Start " & RangeStart.Address 
     Debug.Print "End+1 " & RangeEndPlusOne.Address 
     Debug.Print "Entire " & RangeEntire.Address 
    End If 

    End With 

End Sub 
+3

不錯的一個。您已花時間給出完整答案。請注意,你可以使用'If Not'來避免'If'無關的事情:) – JMax 2012-03-01 17:35:19

+0

你說得對,但是我的腦袋因布爾表達式'Not X Is Nothing'我更喜歡有一個空的'Then'塊。但是:(1)在真實的代碼中,如果沒有找到目標文本,我會期待一些行動;(2)你指出這可能沒有我的心理限制的詹姆斯是好的。 – 2012-03-01 17:49:17

+0

我有VBA的限制,因爲我是一個Java開發人員,已經使用Excel VBA代碼12年了。感謝您的出色答案和耐心。 – 2012-03-01 17:59:11

2

當你在VBA使用對象,您需要使用關鍵字Set分配變量時,你的第一條語句應該是:

Set found = Cells.Find(What:="My_Search_Text", After:=ActiveCell, LookIn:=xlValues, _ 
     LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _ 
     MatchCase:=False, SearchFormat:=False) 

順便說一句,你不能分配使用方法作爲Activate。所以我在聲明結尾刪除了它。

+0

這也行不通。我只是使用find來獲得列號,這樣我就可以得到一個範圍。我如何爲此定義一個變量? – 2012-03-01 17:00:04

+0

@JamesDrinkard:看看Tony的回答。他給你一個完整的工作解決方案 – JMax 2012-03-01 17:34:24

2

如何獲得最後一行?

LastRow = SheetToCheck.Cells(ActiveCell.Row, ActiveCell.Column).End(xlDown).Row 

這將返回break/blank單元格之前的最後一行。

Set cellRange = SheetToCheck.Range(SheetToCheck.Cells(ActiveCell.Row, ActiveCell.Column), SheetToCheck.Cells(LastRow, ActiveCell.Column)) 
+0

順便說一句,我不喜歡使用ActiveCell/ActiveSheet/Selection,因爲他們可能會導致問題,如果你迷路了。我發現最好直接引用單元格/表格。如果使用當前選定的單元格,則將其分配給Set myCell = ActiveCell,這樣,如果選擇在進程中間更改,則不會被粘上。 – Gaffi 2012-03-01 17:32:55

相關問題