2012-03-30 2 views
5

ho scritto qualche VBA funzionale:Salva gamma di variabili

Sheets("Src").Range("A2:A9").Copy Destination:=Sheets("Dest").Range("A2") 

Voglio estrarre l'intervallo di origine in una variabile per la flessibilità.

SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Tuttavia, questo non funziona. Quale SrcRange deve essere attenuato come? La prima riga è corretta?
Ho provato Dimming SrcRange come Range e mi ha dato
Runtime error 91: Object Variable or With block variable not set

Io non sono molto familiare con la lingua e la documentazione mi ha lasciato che vogliono (non sono riuscito a trovare il tipo di ritorno per le Schede (indice) invocazione, this è stato il più vicino che ho trovato). Quando premo Registra macro, eseguo alcune azioni e premo stop, il corpo Macro è ancora vuoto.

Qualcuno potrebbe far luce su come utilizzare SrcRange come variabile?

risposta

9

Nella propria risposta, in modo efficace fare questo:

Dim SrcRange As Range ' you should always declare things explicitly 
Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

non sei veramente "estrarre" il campo a una variabile, si sta impostando un riferimento alla gamma.

In molte situazioni, questo può essere più efficiente e più flessibile:

Dim Src As Variant 
Src= Sheets("Src").Range("A2:A9").Value 'Read range to array 
'Here you can add code to manipulate your Src array 
'... 
Sheets("Dest").Range("A2").Value = Src 'Write array back to another range 
+0

Mi piace essere in grado di leggere su una variabile/matrice Variant per ulteriore flessibilità. Grazie per il consiglio! –

7

... E la risposta è:

Set SrcRange = Sheets("Src").Range("A2:A9") 
SrcRange.Copy Destination:=Sheets("Dest").Range("A2") 

Il Set fa la differenza. Quindi funziona come un fascino.

8

Giusto per chiarire, c'è una grande differenza tra queste due azioni, come suggerito da Jean-François Corbett.

Un'azione è copiare/caricare i dati effettivi dal Range("A2:A9") in una matrice variante chiamata vArray (cambiato per evitare confusione tra la matrice variante e sonore entrambi chiamati Src):

vArray = Sheets("Src").Range("A2:A9").Value

mentre l'altra semplicemente imposta una variabile range (SrcRange) con l'indirizzo della gamma Sheets("Src").Range("A2:A9"):

Set SrcRange = Sheets("Src").Range("A2:A9")

In questo caso, i dati non vengono copiati e rimangono dove si trovano, ma ora possono essere utilizzati più o meno allo stesso modo di una matrice. Questo è spesso perfettamente adeguato, ma se è necessario accedere ripetutamente, testare o calcolare con tali dati, caricarlo prima in un array sarà MOLTO più veloce.

Ad esempio, si supponga di voler controllare un "database" (foglio di grandi dimensioni) rispetto a un elenco di Periferia e Postcode noti. Entrambi i set di dati sono in fogli separati, ma se vuoi che funzioni velocemente, carica i sobborghi e i codici postali in una matrice (vive in memoria), quindi esegui ogni riga del database principale, verificando i dati dell'array. Questo sarà molto più veloce che se accedete entrambi dai loro fogli originali.