2013-07-14 13 views
6

Perché la non seguenti lavori:VBA Gamma Excel() con cellulare argomento

Range(Cells(1,1)).Value = 3

Cells(1,1) dovrebbero essere essenzialmente la stessa cosa usando A1 giusto?

(mi rendo conto che ho potuto solo fare Cells(1,1).Value = 3, ma io sono solo curioso di sapere il motivo per cui non funziona.)

ho letto la voce di MSDN e si vede che il primo argomento deve essere A1 stile, ma qualcosa di simile funziona:

Range(Cells(1,1), Cells(2,3)).Value = 2

totalmente confuso.

risposta

2

Quando si desidera utilizzare la proprietà Cells per specificare i parametri dell'oggetto range (se ricordo bene - non utilizzo VBA da diverso tempo), è necessario fornire due argomenti.

Quindi, se si vuole fare riferimento a un oggetto range che ha una sola cella, quindi è necessario scrivere:

Range(Cells(1, 1), Cells(1, 1)).value = "Hello World" 
+0

Perché questo dovrebbe essere non ho idea se ... –

+0

è solo fonte di confusione perché contraddice la loro possedere la documentazione, per quanto posso tel (dice che devi usare lo stile A1 come primo argomento). Immagino sia solo una di quelle strane decisioni di design con cui devi convivere. – user943870

+0

Non esattamente, se scorri la documentazione vedrai che ci sono diverse condizioni se stai usando la proprietà Cells ... In quella sezione in realtà non menziona lo stile A1 (ovviamente perché riguarda la proprietà Cells). –

12

Quando Range viene utilizzato con un solo parametro, il parametro viene viene interpretato come un nome di intervallo .

Range(Cells(1,1)) 

è lo stesso che utilizzare

Range(Cells(1,1).Value) 

Così si otterrà un risultato solo è il valore di Cells(1,1) è un indirizzo di intervallo valido in A1 stile

Solo quando passavano due parametri gamma vengono hanno interpretato come gli angoli di un intervallo.

+0

+1 buon post Chris. – brettdj

+0

Buono, ma potrebbe essere più completo con le celle (1,1). Esempio di indirizzo? – LuizAngioletti

+1

Range (Cells (1,1) .Value) genera un errore sul mio computer. Range (Cells (1,1) .Address) funziona comunque. – user3032689

-2

Quando si utilizzano "celle", è necessario formulare Object.cells, ad es. Application.cells (2,2) o activeWorksheet.cells

+0

spiegazione più? – tod

3

Invece di riferirsi a una singola cella come questo:

Range(Cells(1,1), Cells(1,1)) 

si può scrivere:

Range(Cells(1,1).Address) 
1

Per una singola cella la sua molto più semplice: utilizzare le celle di default) la funzione (:

Cells(1,1) = "hello world" 

o utilizzare le celle di un foglio() funzione:

Dim sht as Worksheet 
Set sht = Sheets("myworksheet") ' or: = Sheets(1) 
sht.Cells(1,1) = "hello world" 

Per un intervallo è necessario utilizzare due parametri, come spiegato nelle altre risposte fornite qui. Ma il vantaggio è che puoi impostare un intero intervallo di campi su un valore. E puoi lavorare su un foglio che non è "attivo", dietro le quinte.Per esempio:

Const colRand = 4 
Const colDiff = 5 

Dim sht as Worksheet, rngHi As Range, rngRand As Range, rngDiff As Range 
Set sht = Sheets("myworksheet") ' or: = Sheets(1) 

Set rngHi = sht.Range(sht.Cells(1,1), sht.Cells(3,3) 
rngHi = "hello world" 

Set rngRand = sht.Range(sht.Cells(1,colRand), sht.Cells(8,colRand) ' column 4, rows 1-8 
rngRand = "=RAND()" 

Set rngDiff = sht.Range(sht.Cells(2,colDiff), sht.Cells(8,colDiff) ' column 5, rows 2-8 
' using FormulaR1C1 in case the sheet isn't set to use that type of formula 
Set rngDiff.FormulaR1C1="=RC[-1] - R[-1]C[-1]" ' on previous columnn, diff between this row and previous row 

Spiegazione:

La funzione Cells riceve uno:
un parametro stringa - in cui si specifica l'intervallo A1_And_Colon Style
o due parametri di cella - il cella iniziale dell'intervallo e cella finale.

Quindi, per impostare l'intervallo con 'celle' che è necessario dare entrambe le celle divise da una virgola:

Range(Cells(1,1), Cells(1,1)) = "hello world" 
Range(Cells(2,2), Cells(3,4)) = "you cannot square around, but you can round a square" 
Sheets(1).Cells(5,5) = "=Round(Sqrt(5))"