2010-09-02 18 views
6

Il supporto VBA utilizza una matrice di variabili di intervallo?Utilizzo di una serie di intervalli in VBA - Excel

dim rangeArray() as range 
dim count as integer 
dim i as integer 

count = 3 

redim rangeArray(1 to count) 

for i = 1 to count 
    msgbox rangeArray(i).cells(1,1).value 
next 

Non riesco a farlo funzionare in questo tipo di applicazione. Voglio memorizzare una serie di intervalli in un certo ordine come "copia master". Posso quindi aggiungere, eliminare, ordinare o fare qualsiasi cosa su questo array e quindi stamparlo su una serie di intervalli in Excel. Non sembra che Excel lo sostenga: ti costringe semplicemente a memorizzare i tuoi dati nel foglio di calcolo e devi rileggerli per poterli utilizzare.

+0

Quello che sto cercando di fare è implementare qualcosa di simile a una "classe contenitore" in Java, per poter memorizzare dati misti in una posizione comoda, preferibilmente invisibile. Nel mio programma, c'è una sezione di template che viene copiata da un altro foglio e poi incollata ripetutamente sul foglio attivo e taggata in modo che gli utenti possano identificare le singole sezioni e il nome così posso riferirmi. – GenericJam

+0

cosa non funziona con questo codice? cosa stai cercando di ottenere? Guardando il codice sopra, non hai riempito l'array con il riferimento dell'intervallo effettivo. 'Set rangeArray (1) = Range (" A1 ")' seguito da 'Set rangeArray (2) = Range (" A2 ")' seguito da 'Set rangeArray (3) = Range (" A3 ")' – shahkalpesh

+0

Grazie per tutti quelli che hanno contribuito Alla fine ho appena copiato gli intervalli, aggiunto le nuove sezioni, rinominato in sequenza e ricopiato nello spazio originale. Era un po 'grosso ma funziona. La principale rivelazione per me è stata: excel non supporta i dati persistenti e gruppi misti di dati a meno che non sia sul foglio. Il problema è che puoi copiare accidentalmente i dati inserendoli nelle celle sbagliate, quindi devi essere molto diligente nel posizionare e rintracciare i tuoi dati. – GenericJam

risposta

10

No, gli array non possono contenere oggetti. Ma o Gli oggetti possono contenere oggetti. Penso che ciò che potresti desiderare sia un oggetto Range che consiste in vari specifici oggetti Range. In questo esempio, rMaster è il mio "array" che contiene tre celle.

Sub StoreRanges() 

    Dim rMaster As Range 
    Dim rCell As Range 

    Set rMaster = Sheet1.Range("A1") 
    Set rMaster = Union(rMaster, Sheet1.Range("A10")) 
    Set rMaster = Union(rMaster, Sheet1.Range("A20")) 

    For Each rCell In rMaster 
     MsgBox rCell.Address 
    Next rCell 

End Sub 

Con la mia nuova conoscenza trovato che gli array possono contenere gamme (thnx jtolle), ecco un esempio di come si potrebbe memorizzare gli intervalli in un array e ordinarli

Sub UseArray() 

    Dim aRng(1 To 3) As Range 
    Dim i As Long 

    Set aRng(1) = Range("a1") 
    Set aRng(2) = Range("a10") 
    Set aRng(3) = Range("a20") 

    BubbleSortRangeArray aRng 

    For i = LBound(aRng) To UBound(aRng) 
     Debug.Print aRng(i).Address, aRng(i).Value 
    Next i 

End Sub 

Sub BubbleSortRangeArray(ByRef vArr As Variant) 

    Dim i As Long, j As Long 
    Dim vTemp As Variant 

    For i = LBound(vArr) To UBound(vArr) - 1 
     For j = i To UBound(vArr) 
      If vArr(i).Value > vArr(j).Value Then 
       Set vTemp = vArr(i) 
       Set vArr(i) = vArr(j) 
       Set vArr(j) = vTemp 
      End If 
     Next j 
    Next i 

End Sub 
+0

Se ho usato questo metodo, sarei in grado di ordinarlo senza copiare i miei dati esistenti? – GenericJam

+3

Rimuoverò felicemente il -1 se si modifica questo post, ma gli array * possono * contenere oggetti, compresi gli oggetti Range. – jtolle

+0

Accidenti se non hai ragione. Bene, ho usato Excel solo da 15 anni. :) Grazie per la correzione. –

1

Non è del tutto chiaro per me di cosa stai parlando.

Se stai chiedendo la possibilità di creare Range s quella mappa su nulla ed esistono da soli, allora no, non c'è modo. Un oggetto Range è solo qualcosa che fa riferimento a una determinata area di un foglio di lavoro. Non ha alcuna memoria propria o qualcosa del genere. Diverse istanze diverse della classe Range possono fare riferimento alla stessa area del foglio di lavoro.

E se vuoi solo memorizzare alcuni riferimenti in un array, allora va bene, fallo. L'unico problema con il codice è che non si inizializzano gli elementi dell'array prima di utilizzarli: poiché lo Range è un tipo di riferimento, tutti gli elementi vengono inizializzati con Nothing s per impostazione predefinita.

+0

Quello che dovrò fare, quindi implementare il mio concetto è copiare la sezione che voglio usare in una sezione inutilizzata del foglio, scherzare con essa e poi copiarla quando ho finito con esso. – GenericJam

+0

@GenericJam Utilizzare quindi un foglio nascosto. – GSerg

4

Non è del tutto chiaro che cosa si vuoi fare, ma ...

Se si desidera una raccolta, perché non utilizzare un oggetto di raccolta VBA?

Dim myRanges as New Collection 

Un Collection.Item può essere qualsiasi oggetto, tra cui un Range.

Un oggetto intervallo non contiene dati; contiene un riferimento alle celle del foglio di lavoro. Se vuoi che il range contenga il contenuto della tua collezione, dovrai copiarli in e dal foglio di lavoro.

Come con Java, le variabili VBA sono effimere, sia in una matrice che in una raccolta. Se vuoi chiudere il file e avere i dati lì quando lo apri di nuovo, devi averlo nelle celle del foglio di lavoro. I fogli di lavoro sono il tuo meccanismo di persistenza.

Ho intenzione di fare un grande salto qui, quindi se sono lontano, ignorami. Quello che penso tu stia cercando suggerisce di impostare un foglio di lavoro separato come "database", popolato con oggetti List/Table contenenti i tuoi dati grezzi. Di fronte a questo, è il tuo "foglio utente" dove fai le cose interessanti, facendo riferimento ai dati nel foglio del database. Dai un nome a tutto.

+0

È possibile ottenere senza utilizzare i fogli di lavoro, ma archiviando i dati solo nelle variabili? – Ans