2012-06-18 4 views
5

Ich habe gerade ein Problem gelöst Ich hatte die "Set" Schlüsselwort in einer Definitionszeile setzen, aber was ich gerne wissen würde, ist "warum"?Unterschied in der Art zwischen verwenden und nicht verwenden Setzen Sie das Schlüsselwort

Grundsätzlich Ich tue dies:

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 

Wenn ich die „Set“ Schlüsselwort weglassen der Code immer noch gut kompiliert, aber in der lokalen Variablen Fenster sehe ich, dass seine Typ Änderungen „String“ statt "Variante/Objekt/Bereich". Warum sollte das passieren?

+1

startCell ist nicht vom Range-Typ hier ... – Qbik

Antwort

14

diesem Grund zuzuweisen. Wenn Sie sagen, dass dies:

Dim startCell, iCell As Range 

Sie denken Sie habe dies getan:

Dim startCell As Range, iCell As Range 

aber was haben Sie wirklich getan, ist dies:

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

Dies ist ein klassischer VBA-Fehler. Die meisten VBA-Programmierer haben es geschafft, und deshalb greifen die meisten VBA-Programmierer darauf zurück, nur eine Variable pro Dim-Anweisung zu deklarieren (d. H. Eine pro Zeile). Ansonsten ist es viel zu einfach, diesen Fehler zu machen, und es ist schwer, ihn danach zu erkennen.

Also mit Dim startCell haben Sie Ihre Variable implizit als Variant-Typ deklariert (entspricht Dim startCell As Variant).

Wenn Sie dann sagen:

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

die Variant erwirbt die Art der Sache auf der rechten Seite der Referenzzuordnung (Range). Wenn Sie jedoch sagen, dass dies:

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

ohne Set Stichwort, du bist nicht eine Referenz zuweisen, sondern ein Wert an die Variable startCell, die nun den Typ des Wertes auf der rechten Seite erfasst. Was ist das für ein Typ? Nun, die Standardeigenschaft eines Range-Objekts ist Value, also erhalten Sie den Typ Cells(iCell.Row + 1, iCell.Column).Value. Wenn diese Zelle eine Zeichenfolge enthält, erhalten Sie eine Zeichenfolge.

1

Sie müssen das Schlüsselwort Set verwenden, wenn Sie ein Objekt einer Variablen zuweisen. Cells(iCell.Row + 1, iCell.Column) ist ein Bereich Objekt zurück, so Set muss verwendet werden, sonst erhalten Sie jedermanns Lieblings-VBA-Fehler: 91: Object variable or With block variable not set.

Edit:

Range-Objekte haben eine Standardrückgabe Eigenschaft als auch, was den ‚Wert‘ Eigenschaft. Wenn Sie nur Range ("A1") referenzieren würden, würde der Bereich "Value" als Standardwert für eine Variante verwendet werden. Aus diesem Grund sollten Sie Varianten vermeiden, wenn der Datentyp im Voraus bekannt ist.

+0

... noch, wie er in der Frage sagt, er bekommt diesen Fehler nicht. Warum? Das macht diese Frage interessant. –

3

Set wird verwendet, um eine Referenz auf ein Objekt, Let (oder einfache Zuordnung) zuzuordnen, den Wert eines Objekts (falls vorhanden)

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 
Verwandte Themen