2016-07-19 128 views
9

Se si esegue il seguente codiceQual è la differenza tra .Value = "" e .ClearContents?

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

Quando controllo cellule (1, 1) e cellule (2, 1) usando la formula ISBLANK() entrambi i risultati tornare TRUE. Quindi mi chiedo:

Qual è la differenza tra Cells(,).Value = "" e Cells(,).ClearContents?

Sono essenzialmente uguali?


Se quindi eseguire il seguente codice per verificare la differenza di tempo tra i metodi:

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 

ottengo il seguente output per il runtime sulla mia macchina

.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 

Sulla base di questi risultati, vediamo che il metodo .Value = "" è più veloce di .ClearContents in media. È vero in generale? Perchè così?

+0

credo hai centrato l'unghia sulla testa con i tuoi test di cronometraggio nts è utile se c'è una formattazione numerica che si desidera conservare, che può essere scritta dalla stringa vuota. Ci potrebbe essere più sfumatura di quella, però, ma se così fosse, non ne sono a conoscenza – RGA

+2

'.Value =" "' sta semplicemente inserendo una stringa di lunghezza zero nella cella, quindi stai solo scrivendo un nuovo valore (_non è tecnicamente vuoto ..._) '.ClearContents' sta rimuovendo il' .Value 'della cella che immagino abbia un po' più di overhead in termini di gestione della memoria. –

+0

@MacroMan Usando l'analogia matematica, stai implicando che '.Value =" "' è uguale a 0 e '.ClearContents' è uguale a un set vuoto? Comunque, grazie RGA per aver modificato la mia domanda. –

risposta

1

Da quello che ho trovato, se il tuo obiettivo è quello di avere una cella vuota e non vuoi modificare nulla sulla formattazione, dovresti usare Value = vbNullString poiché è il più efficiente.

Il "ClearContents" sta controllando e modificando altre proprietà nella cella come la formattazione e la formula (che tecnicamente è una proprietà separata da Valore). Quando si utilizza Value = "" si modifica solo una proprietà e quindi è più veloce. L'utilizzo di vbNullString richiede al compilatore che si stia utilizzando una stringa vuota rispetto all'altra modalità con virgolette doppie, che si aspetta una stringa generale. Poiché vbNullString richiede di aspettarsi una stringa vuota, è in grado di saltare alcuni passaggi e ottenere un guadagno in termini di prestazioni.

+1

Come si fa a cambiare il valore di ".Value" di una cella per evitare di cambiare il '.Formula' della cella? Non ha molto senso. Inoltre, nessuno dei due metodi per rimuovere il valore della cella influisce sulla formattazione. – Comintern

+0

Se si immette una formula con una macro, è necessario impostare la proprietà Range.Formula o la proprietà Range.FormulaR1C1. Puoi impostare una formula usando la proprietà '.Value' ed Excel realizzerà automaticamente che è una formula e spostarla per te (non lo so per certo, ma immagino che le vecchie versioni di ExcelVBA non lo spostassero automaticamente per te) . Quindi utilizzando Range.ClearContents è possibile controllare i parametri .Formula e .Value. Se il tuo valore .Value non inizia con "=", avrebbe senso che non farà nulla per il Formula, eccetto forse per cancellare o ignorarlo. – NPComplete

+0

Quindi stai dicendo che quando si imposta '.Value', Excel deve controllare se' .Formula' ha bisogno di cambiare, ma non ha bisogno di controllare quando si '.ClearContents' che è in qualche modo più veloce perché sta facendo più lavoro? Ciò ha ancora meno senso. – Comintern

-1

È possibile notare una grande differenza nel foglio di calcolo di Excel.

Si supponga che B1 è riempito da equazione restituisce vuoto A1 = 5 B1 = "= if (A1 = 5,"", "x")

In questo caso, si deve equazioni che si può scrivere in C1 (1) C1 = < = VAL.VUOTO (B1)> (2) C1 =

Soluzione 1 tornerà false, come la cella viene riempita con equazione Soluzione 2 restituirà true