2012-10-03 88 views
1

所以我認爲我對VBA有了很好的把握,但是現在這個錯誤真的讓我感到困擾,我無法弄清楚問題所在。 這裏是極短的子程序(從一個模塊運行):vba簡單範圍/對象錯誤

Sub test() 
    Dim lr 
    lr = Sheets(1).Range("a1", Cells(65, 1)) 
    MsgBox lr.Address 
End Sub 

無論出於何種原因,這將引發了一個「應用程序中定義/對象定義的錯誤」

任何人都可以解釋?

編輯: 這也拋出了同樣的錯誤:

MsgBox Sheets(1).Range("a1", Cells(65, 1)).Address 

EDIT2: 我要改變我的問題有點像我瞭解有關對象的事情,但我做什麼用的使用「找」方法。 所以這裏是代碼:

Set lookrange = Sheets(1).Range(Cells(2, 1), Cells(200, 1)) 
Set result = lookrange.Find(what:=searchTerm, lookat:=xlWhole) 

在這種情況下它告訴我lookrange導致問題。

+0

about edit2:「有問題」? – KekuSemau

回答

3

好的。你有幾個問題。

Option Explicit 
sub test() 
    Dim lr as Range 
    set lr = Sheets(1).Range("a1", Cells(65, 1)) 
    MsgBox lr.Address 
End Sub 

首先,是人誰是新的VBA,使用Option Explicit幾乎總是在你的模塊的頂部,因此您需要維度的變量。

其次,您從不聲明lr作爲對象類型 - 請確保您將其聲明爲Range類型 - 您不一定必須這樣做,但這是一種很好的做法。

第三,您需要使用set,正如其他人在分配對象(如Range值)時指示的那樣,否則您將始終得到該錯誤。


到問題的第二部分。

MsgBox Sheets(1).Range("a1", Cells(65, 1)).Address 

更改爲

With Sheets(1) 
    MsgBox .Range(.Range("A1"), .Cells(65, 1)).Address 
End With 

如果你曾經從比Sheet1你會得到錯誤,不同的紙張上運行這一點,因爲Cells(65,1)參考不會對Sheet1 - Excel將認爲你的意思是當前工作表。


第三部分

Set lookrange = Sheets(1).Range(Cells(2, 1), Cells(200, 1)) 
Set result = lookrange.Find(what:=searchTerm, lookat:=xlWhole) 

有相同的問題第二部分。另請注意,如果找不到result,並且上述第二條語句(Find的結果)將導致錯誤(如果Find不成功),則完全可能會運行錯誤。

+0

由於OP在VBA(理論上)方面相對較新,請您建議他在1行中使用'With Sheets(1)'而不是使用'Sheets(1)'3次?它更漂亮,不會讓我畏縮。 –

+0

@DanielCook很好的電話。我改變了這一點。 – enderland

0

大概你的範圍定義是不正確的...不知道你在那裏試圖實現,但表(1).range(myrange)返回一個範圍對象。

Sub tetPop() 

    Call popAddress(10, 12) 
    Call popAddress(14, 21) 
    Call popAddress(11, 18) 

End Sub 

Sub popAddress(ByVal row As Integer, ByVal col As Integer) 

    Dim lr As Range 

    Set lr = Sheets(1).Range("a1", Cells(row, col)) 
    MsgBox lr.Address 

    ' or better and direct 
    MsgBox Sheets(1).Range("a1", Cells(row, col)).Address 

End Sub 

會彈出不同的地址 乾杯

丹尼爾

+0

當然,但上面的代碼不是我的程序,它只是但是,這導致了一個問題。我需要使用單元格(x,x)方法作爲範圍的底部不固定,我打算用變量替換65。地址方法也是不相關的,我只是不知道爲什麼它不起作用,無論是作爲一個對象還是隻是一個範圍 – harryg

+0

你可以使用這個相同的符號使用變量爲65通過使用set lr = sheets(1 ).range(「A1:A」和變量名) – scott

+0

看到我更正的答案,使用變量和不同的範圍....這工作 – Daniel

0

的一點是,lr = Sheets(1).Range("a1", Cells(65, 1))返回一個範圍對象。
強調對象。所以你需要在開始時使用set,就像Daniel一樣。
由於您在沒有set的情況下分配了該對象,因此Excel使用默認屬性,即Range.Value。所以賦值不會拋出錯誤,只能將lr用作對象。

+0

儘管你的'編輯'行不應該拋出一個錯誤,但它不這樣做因爲我正在測試它。 – KekuSemau