2016-07-19 24 views
9

Wenn ich den folgenden CodeWas ist der Unterschied zwischen .Value = "" und .ClearContents?

Sub Test_1() 
    Cells(1, 1).ClearContents 
    Cells(2, 1).Value = "" 
End Sub 

laufe Wenn ich Zellen überprüfen (1, 1) und Zellen (2, 1) unter Verwendung der Formel ISBLANK() beiden Ergebnisse zurück TRUE. Also ich frage mich:

Was ist der Unterschied zwischen Cells(,).Value = "" und ?

Sind sie im Wesentlichen gleich?


Wenn ich dann den folgenden Code ausführen, um die Zeitdifferenz zwischen den Methoden zu testen:

Sub Test_2() 
Dim i As Long, j As Long 
Application.ScreenUpdating = False 

For j = 1 To 10 
    T0 = Timer 
    Call Number_Generator 
    For i = 1 To 100000 
     If Cells(i, 1).Value/3 = 1 Then 
      Cells(i, 2).ClearContents 
      'Cells(i, 2).Value = "" 
     End If 
    Next i 
    Cells(j, 5) = Round(Timer - T0, 2) 
Next j 

End Sub 

Sub Number_Generator() 
Dim k As Long 
Application.ScreenUpdating = False 

For k = 1 To 100000 
    Cells(k, 2) = WorksheetFunction.RandBetween(10, 15) 
Next k 

End Sub 

ich die folgende Ausgabe für Runtime auf meinem Rechner

.ClearContents .Value = "" 
4.20   4.44 
4.25   3.91 
4.18   3.86 
4.22   3.88 
4.22   3.88 
4.23   3.89 
4.21   3.88 
4.19   3.91 
4.21   3.89 
4.17   3.89 

erhalten auf diese Basierend Ergebnisse, sehen wir, dass die Methode .Value = "" im Durchschnitt schneller als .ClearContents ist. Trifft das überhaupt zu? Warum?

+0

ich denke, true zurück Du hast mit deinen Timing-Tests den Nagel auf den Kopf getroffen nts ist nützlich, wenn eine Zahlenformatierung beibehalten werden soll, die von der leeren Zeichenfolge überschrieben werden kann. Vielleicht gibt es mehr Nuancen als das, aber wenn dem so ist, bin ich mir dessen nicht bewusst. – RGA

+2

'.Value =" "' setzt nur eine Nulllänge in die Zelle, also schreibst du einfach einen neuen Wert darauf (_Es ist technisch nicht leer ..._) '.ClearContents' entfernt tatsächlich den' .Value' der Zelle, von dem ich mir ein bisschen mehr Overhead in Sachen Speicherverwaltung vorstelle. –

+0

@MacroMan Mit Mathe Analogie, implizieren Sie, dass '.Value =" "ist gleich 0 und' .ClearContents' ist gleich einem leeren Satz? Wie auch immer, danke RGA für die Bearbeitung meiner Frage. –

Antwort

1

Nach dem, was ich gefunden habe, wenn Ihr Ziel ist, einfach eine leere Zelle zu haben, und Sie nichts über die Formatierung ändern möchten, sollten Sie Value = vbNullString als das ist am effizientesten.

Der 'ClearContents' prüft und ändert andere Eigenschaften in der Zelle wie Formatierung und Formel (was technisch eine andere Eigenschaft als Value ist). Wenn Sie Value = "" verwenden, ändern Sie nur eine Eigenschaft und so ist es schneller. Wenn vbNullString den Compiler, der eine leere Zeichenfolge verwendet, mit umgekehrten Anführungszeichen auffordert, wird eine allgemeine Zeichenfolge erwartet. Da vbNullString eine leere Zeichenfolge erwartet, kann es einige Schritte überspringen und Sie erhalten eine Leistungssteigerung.

+1

Wie ändert sich das Ändern des '.Value' einer Zelle, die' .Formula' der Zelle zu ändern? Das macht nicht viel Sinn. Auch keine Methode zum Entfernen des Zellenwerts wirkt sich auf die Formatierung aus. – Comintern

+0

Wenn Sie eine Formel mit einem Makro eingeben, sollten Sie die Range.Formula-Eigenschaft oder die Range.FormulaR1C1-Eigenschaft festlegen. Sie können eine Formel mit der '.Value'-Eigenschaft festlegen und Excel erkennt automatisch, dass es sich um eine Formel handelt, und verschiebt sie für Sie (ich weiß es nicht genau, aber ich könnte mir vorstellen, dass ältere Versionen von ExcelVBA es nicht automatisch für Sie verschoben haben) . Also überprüft Range.ClearContents die .Formula-Parameter und .Value. Wenn Ihr .Value nicht mit "=" beginnt, wäre es sinnvoll, dass es nichts mit der .Formula zu tun hat, außer vielleicht, dass Sie es löschen oder ignorieren. – NPComplete

+0

Sie sagen also, dass Excel beim Einstellen des '.Value's prüfen muss, ob die' .Formula' geändert werden muss, aber es muss nicht überprüft werden, wenn Sie '.ClearContents', dass es irgendwie schneller ist weil es mehr Arbeit macht? Das macht noch weniger Sinn. – Comintern

-1

Sie können einen großen Unterschied in der Excel-Tabelle feststellen.

dass B1 Angenommen durch Gleichung gefüllt ist wieder leer A1 = 5 B1 = "= if (A1 = 5,"“, "x")

In diesem Fall müssen Sie Gleichungen, können Sie schreiben in C1 (1) C1 = < = isblank (B1)> (2) C1 =

Lösung 1 wird false zurück, wenn die Zelle mit Gleichung gefüllt ist Lösung 2 wird