2012-06-18 31 views
5

我只是解決了我有把「設置」關鍵字的定義行,但我想知道的是「爲什麼」的問題之間?差異型使用和不使用Set關鍵字

基本上,我這樣做:

Dim startCell, iCell as Range 
For Each iCell in Range(whatever) 
    If iCell.value <>"" Then 
     Set startCell = Cells(iCell.Row + 1, iCell.Column) 
    End If 
Next iCell 

如果我省略了「設置」關鍵字的代碼仍然編譯罰款,但在局部變量窗口,我看到它的更改爲「字符串」而不是「變體/對象/範圍」。爲什麼會發生?

+1

startCell不在這裏的範圍類型... – Qbik

回答

14

這是爲什麼。當你這樣說:

Dim startCell, iCell As Range 

認爲你這樣做:

Dim startCell As Range, iCell As Range 

,但你已經真的做是這樣的:

Dim startCell 'As Variant, by default 
Dim iCell As Range 

這是一個經典的VBA錯誤。大多數VBA程序員都做到了,這就是爲什麼大多數VBA編程依傍每Dim語句(每行即,一個)只能聲明一個變量。否則,犯這樣的錯誤太容易了,之後很難發現。

因此,使用Dim startCell您已隱式聲明變量爲Variant類型(相當於Dim startCell As Variant)。

當你再這樣說:

Set startCell = Cells(iCell.Row + 1, iCell.Column) 

的變體獲得的東西上的參考分配(範圍)的右手側類型。但是,當你這樣說:

startCell = Cells(iCell.Row + 1, iCell.Column) 

沒有Set關鍵字,你並沒有使用的引用,但一個值到變量startCell,現在獲得的右手側的值的類型。這是什麼類型?那麼,Range對象的默認屬性是Value,所以你會得到的Cells(iCell.Row + 1, iCell.Column).Value類型。如果該單元格包含一個字符串,那麼你會得到一個字符串。

1

分配一個對象變量時必須使用設置關鍵字。 Cells(iCell.Row + 1, iCell.Column)正在返回一個範圍對象,因此必須使用集合,否則您將得到大家最喜歡的VBA錯誤:91: Object variable or With block variable not set

編輯:

Range對象有一個默認的倒流性爲好,這是「值」屬性。如果你只是參考範圍(「A1」),將採取範圍「值」爲默認的變體。這就是爲什麼當數據類型提前知道時應避免使用變體。

+0

......但是,正如他在問題中所說的,他沒有得到那個錯誤。爲什麼?這就是讓這個問題變得有趣的原因。 –

3

Set用於基準分配到一個對象,Let(或簡單的分配)分配一個對象的值(如果有的話)

Dim a As Variant 
    Set a = ActiveSheet.Cells(1) 
    'TypeName(a) = Range, a now contains reference to the cell's range 
    a = ActiveSheet.Cells(1) 
    'TypeName(a) = Double or String, whatever is in the Cell, a contains the cell's value