2011-09-28 13 views
5

Ho scritto macro in Excel che utilizza l'array dinamico. Gli utenti aggiungeranno elementi a quell'array.È possibile memorizzare gli elementi dell'array in modo permanente in VBA in Excel?

È possibile memorizzare gli elementi in modo permanente, quindi gli elementi saranno disponibili anche dopo la chiusura della cartella di lavoro?

Il trucco è che non voglio memorizzare elementi in un foglio di lavoro e inserirli di nuovo in array quando la cartella di lavoro è aperta, ma per avere elementi permanentemente salvati nell'array.

+0

Cosa c'è di sbagliato con la memorizzazione su un foglio? – Reafidy

+0

Vedere anche: http://stackoverflow.com/questions/7350388/saving-vba-dictionary-object-in-excel/7350849#7350849 Ci sono alcune note. – Fionnuala

+2

Ricordarsi di accettare le risposte che funzionano. C'è un'icona a forma di freccia nella parte in alto a sinistra delle risposte: puoi selezionarla per accettare la risposta. – aevanko

risposta

5

Una delle tue migliori scommesse è quella di memorizzare i valori dell'array in un foglio di lavoro e contrassegnare il foglio di lavoro come nascosto usando VBA.

Me.Worksheets("ArrayValuesWorksheet").Visible = False 

se si utilizzano altre cose come file CSV locali, Registro di sistema, ecc, allora il codice sarà comportarsi in modo diverso semplicemente spostando la cartella di lavoro di macchine diverse e si perde la possibilità di avere più copie della matrice.

Modifica (eccellente suggerimento @ commenti di Reafidy sotto)

+14

Utilizzare 'Fogli (" ArrayValuesWorksheet "). Visibile = xlVeryHidden' per impedire che il foglio venga visualizzato nell'elenco. – Reafidy

+1

È inoltre possibile proteggere con password il proprio codice e i fogli "Molto nascosti" andando su Strumenti/Proprietà progetto VBA/Scheda Protezione e inserendo una password. L'utente non sarà in grado di mostrare i fogli "Molto nascosti". Post scriptum LOL al termine Microsoft "Molto nascosto". Voglio dire, ho capito b/c Sono stato lì ... è divertente vedere un Enum con quel nome. – ray

+0

Grazie per i suggerimenti ragazzi, ma non voglio memorizzare i dati nei fogli di lavoro nascosti, poiché voglio distribuire macro come una sorta di estensione, componente aggiuntivo (non lo so ancora) quindi funzionerà su qualsiasi cartella di lavoro ogni volta che viene aperto l'excel. Penso che non sarà possibile condividere la macro in questo modo se è allegato un foglio di lavoro nascosto. A proposito, puoi consigliare qual è il modo migliore per distribuire la macro? – user652061

0

Per leggere/Array scrittura in lamiera è possibile utilizzare

Sub WriteArray() 
Dim MyArray As Variant 

MyArray = Array("x", "y", "z") 

Range("A1:C1").Value = MyArray 

End Sub 

Sub ReadArray() 

Dim MyArray As Variant 

MyArray = Range("A1:C1").Value 

End Sub 

Dopo si può utilizzare la proprietà Visible di foglio da nascondere come noi hanno risposto

2

È anche possibile memorizzare un array in un nome dalla raccolta dei nomi e questo nome può essere nascosto.

Names.Add Name:="StoredArray", RefersTo:=myArray, Visible:=False 
+1

Questo lo memorizzerà come stringa e non come array. – Reafidy

+0

Grazie a Ronie e Reafidy. Non è un problema se memorizza i dati come una stringa come sospetto di poter leggere la stringa di nuovo sull'array. Ciò che è interessante per me è quando condivido questa macro come una sorta di add-in (estensione) sarà possibile salvare i dati nella raccolta dei nomi? – user652061

+0

Questa è la risposta, non è difficile leggerlo di nuovo dalla costante denominata in un array durante l'inizializzazione. –

1

Per rispondere alla tua domanda direttamente: No, non c'è modo per memorizzare una matrice che ha una durata oltre l'applicazione nella memoria - dovrete salvare da qualche parte.

Ci sono diverse opzioni disponibili ma il tuo migliore è molto probabilmente salvandolo su un foglio. I fogli "molto nascosti" sono visibili solo attraverso il codice VBA, quindi per l'utente è la stessa cosa che l'array è sempre presente e attivo nella memoria.

0

"non c'è modo ...", >>> si può fare!

alcuni esempi: listbox/ComboListBox (su un foglio) = array ...

Per 2D matrice variante: range() = matrice.

o riporla in un commandbarMenu (quelli possono essere fatti multidimensionale)

o whateverthat mantiene dopo aver ricaricato cartella di lavoro ...

Problemi correlati