2013-09-23 7 views
6

Buona sera amici:2 modi per "ClearContents" su VBA Excel, ma 1 funziona correttamente. Perché?

che ho in mente 2 modi per cancellare un contenuto in un intervallo definito delle cellule di un progetto VBA (in MS Excel):

  1. Worksheets("SheetName").Range("A1:B10").ClearContents
  2. Worksheets("SheetName").Range(Cells(1, 1), Cells(10, 2)).ClearContents

Il problema è che il secondo modo mi mostra un errore '1004' quando non sto guardando il foglio di lavoro corrente "SheetName" (in altre parole, quando non ho "SheetName" come Foglio attivo).

Il primo modo funziona perfettamente in ogni situazione.

Perché succede? Come posso usare la "seconda via" senza questo bug?

+1

Non per punti ma la mia risposta è stata difficile da capire? –

+0

@ Sid Se mai fossi disperata per accettare credo che ti seguirò solo per ripubblicare le tue risposte! – pnuts

+1

@pnuts: No non penso: @tigeravatar è disperato :) Era solo una differenza di pochi minuti :) –

risposta

8

È perché non si è qualificato Cells(1, 1) con un oggetto del foglio di lavoro e lo stesso vale per Cells(10, 2). Per far funzionare il codice, dovrebbe essere simile a questa:

Dim ws As Worksheet 

Set ws = Sheets("SheetName") 
Range(ws.Cells(1, 1), ws.Cells(10, 2)).ClearContents 

alternativa:

With Sheets("SheetName") 
    Range(.Cells(1, 1), .Cells(10, 2)).ClearContents 
End With 

EDIT: L'oggetto Range erediterà il foglio di lavoro dagli oggetti Celle quando il codice viene eseguito da un modulo standard o userform. Se si esegue il codice da un modulo di codice foglio di lavoro, è necessario qualificare Range anche, in questo modo:

ws.Range(ws.Cells(1, 1), ws.Cells(10, 2)).ClearContents 

o

With Sheets("SheetName") 
    .Range(.Cells(1, 1), .Cells(10, 2)).ClearContents 
End With 
+0

Si potrebbe voler aggiungere 'ws.' prima del' Range'? 'ws.Range (ws.Cells (1, 1), ws.Cells (10, 2)). ClearContents' –

+0

Analogamente aggiungendo un DOT per il secondo codice' .Range (.Cells (1, 1), .Cells (10, 2)). ClearContents' –

+0

Non è necessario. Range erediterà il foglio di lavoro degli oggetti Cells se Range non è stato fornito con un foglio – tigeravatar

8

Questo perché non si qualifica completamente l'oggetto celle. Prova questo

With Worksheets("SheetName") 
    .Range(.Cells(1, 1), .Cells(10, 2)).ClearContents 
End With 

Notare il DOT prima delle celle?

0

Per numerica l'indirizzamento delle cellule provare ad abilitare S1O1 casella di controllo nella SM Impostazioni di Excel. È la seconda scheda dall'alto (cioè le formule), da qualche parte nella seconda pagina nella mia versione ungherese.

Se abilitato, gestisce l'indirizzamento VBA in entrambi gli stili, ad esempio Intervallo ("A1: B10") e Intervallo (Celle (1, 1), Celle (10, 2)). Presumo che gestisca solo lo stile Range ("A1: B10"), se non abilitato.

Buona fortuna!

(Nota, tale intervallo ("A1: B10") rappresenta un quadrato 2x10, mentre Intervallo (Celle (1, 1), Celle (10, 2)) rappresenta 10x2. L'uso di numeri di colonna anziché lettere non influirà l'ordine di indirizzamento.)