2012-06-18 9 views
5

Właśnie rozwiązałem problem związany z ustawianiem słowa kluczowego "Ustaw" w wierszu definicji, ale chciałbym wiedzieć, "dlaczego"?Różnica w typie między używaniem a niewykorzystywaniem Ustaw słowo kluczowe

Zasadniczo, robie to:

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 

Jeśli pominąć „Set” keyword kod nadal kompiluje grzywny, ale w oknie zmiennych lokalnych widzę, że jego typu zmian „string” zamiast "Wariant/Obiekt/Zasięg". Dlaczego tak się stało?

+1

StartCell nie jest typem Range tutaj ... – Qbik

Odpowiedz

14

Dlatego. Kiedy mówisz:

Dim startCell, iCell As Range 

myślisz zrobiłeś to:

Dim startCell As Range, iCell As Range 

ale co masz naprawdę wykonanej to:

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

Jest klasyczny błąd VBA. Większość programistów VBA go stworzyło i dlatego większość programistów VBA powraca deklarując tylko jedną zmienną na instrukcję Dim (tj. Jedną na linię). W przeciwnym razie zbyt łatwo jest popełnić ten błąd, a potem trudno go dostrzec.

Tak więc z Dim startCell niejawnie zadeklarowałeś swoją zmienną jako typ Wariantu (odpowiednik Dim startCell As Variant).

Kiedy potem powiedzieć:

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

Variant nabywa typ rzecz na prawej stronie przypisania referencyjnego (zakres). Jednak, gdy to mówisz:

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

bez słowa kluczowego Set, nie jesteś przypisywanie odwołanie, ale wartość do zmiennej startCell, który obecnie nabywa typ wartości po prawej stronie. Czym jest ten typ? Cóż, domyślną właściwością obiektu Range jest Value, więc otrzymasz typ Cells(iCell.Row + 1, iCell.Column).Value. Jeśli ta komórka zawiera ciąg znaków, otrzymasz ciąg znaków.

1

Musisz użyć parametru Set podczas przypisywania obiektu do zmiennej. Cells(iCell.Row + 1, iCell.Column) zwraca obiekt z zakresu, dlatego należy użyć Ustaw, w przeciwnym razie otrzymasz ulubiony błąd VBA wszystkich użytkowników: 91: Object variable or With block variable not set.

Edit:

obiekty klasy mają właściwość domyślna powrotny, a także, co jest własność 'value'. Jeśli miałbyś tylko odwoływać się do zakresu ("A1"), to przyjmowałby on wartości domyślne zakresów dla wariantu. Dlatego powinieneś unikać używania wariantów, gdy typ danych jest znany z wyprzedzeniem.

+0

... jednak, jak mówi w pytaniu, nie dostanie tego błędu. Czemu? To właśnie sprawia, że ​​pytanie to jest interesujące. –

3

Set służy do przydzielania odniesienie do obiektu Let (lub prosty przypisania) przypisania wartości obiektu (jeżeli występuje)

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 
Powiązane problemy