2017-08-10 65 views
0

我想查找「A」列中首先提到「1」的行。使用範圍()。查找()。行結果如果不是條件

Dim begin1, end1 As Integer 
begin1 = 0 
end1 = 0 


begin1 = Range("A:A").Find("1", SearchOrder:=xlByRows, SearchDirection:=xlNext, LookIn:=xlValues).Row 
end1 = Range("A:A").Find("1", SearchOrder:=xlByRows, SearchDirection:=xlPrevious, LookIn:=xlValues).Row 

If Not begin1 Is Nothing Then 

此刻,「如果不是」條件不起作用,因爲它是錯誤的對象。我不瞭解足夠的VBA知道如何改變這種狀況。

任何幫助將不勝感激!

+0

如果begin1 <> 0然後...''? –

+0

它做了什麼,我知道得到一個錯誤91對象變量沒有設置爲關於begin1 = ...和end1 = ... – Doule

+0

'如果不是開始1是沒有那麼'是你通常用於一個對象的檢查。 'begin1'是一個整數,它可以是0或行號。此檢查已過時,因爲'begin1 = Range(「A:A」)。Find(「1」,SearchOrder:= xlByRows,SearchDirection:= xlNext,LookIn:= xlValues)。如果「1 「沒有找到。 –

回答

1

首先,要小心在聲明中如何使用逗號。

Dim begin1, end1 As Integer 

這導致begin1被聲明爲'variant',end1被聲明爲整數。如果你想使用一個整數在if ... then語句,你應該使用

Dim begin1 as integer, end1 as integer 

然後: 如果你想使用逗號那麼下面將宣佈既是整數

If begin1 <> 0 then 

如果你想使用一個範圍它將是:

if Not begin1 is nothing then 
+0

如果找不到任何東西,仍然會拋出錯誤(對象未在所找到的範圍的'.Row'方法中設置) - 這意味着'If begin1 <> 0 Then'行首先被廢棄。除此之外,你當然完全正確。 –

+0

你是對的,但錯誤處理沒有在問題中解決,所以我沒有提到它。 – Slaqr

2

試試這個。將begin1和end1聲明爲範圍,然後檢查它們是否被找到(即使在整個列中只有一個1,只需要檢查前者,因爲end1將被找到),並且如果他們使用找到的單元格的行屬性。

Sub x() 

Dim begin1 As Range, end1 As Range 

With Range("A:A") 
    Set begin1 = .Find(1, after:=.Cells(.Cells.Count), SearchOrder:=xlByRows, SearchDirection:=xlNext, LookIn:=xlValues) 
    Set end1 = .Find(1, after:=.Cells(1), SearchOrder:=xlByRows, SearchDirection:=xlPrevious, LookIn:=xlValues) 
End With 

If Not begin1 Is Nothing Then 
    MsgBox "First row is " & begin1.Row 
    MsgBox "Last row is " & end1.Row 
End If 

End Sub 
+0

如果我這樣做,該程序確實編譯,但我後來使用begin1和end1作爲整數:對於i = begin1到end1 - X + 1.如果begin1和end1是範圍正確的話,那不起作用? – Doule

+0

不,但你可以聲明另外兩個變量爲Long,並將它們分別設置爲兩個找到的單元格的行。就個人而言,我只會使用'begin1.row',但如果您反覆使用它,則變量可能有意義。 (或更改範圍變量的名稱。) – SJR

+0

正如@SJR所說,我會堅持使用'begin1.row'。你可以使用一個Integer變量 - 在If ... End If塊中添加iBegin = begin1.row記住首先將它聲明爲一個整數然後將第一個1加入第32768行,會得到一個「溢出」錯誤。如果你真的需要它,就像一個數字使用'Long'一樣。 –