2011-09-28 2 views
5

J'ai écrit une macro dans Excel qui utilise un tableau dynamique. Les utilisateurs ajouteront des éléments à ce tableau.Est-il possible de stocker des éléments de tableau de façon permanente dans VBA dans Excel?

Est-il possible de stocker des éléments de manière permanente, de sorte que les éléments seront disponibles même après la fermeture du classeur? L'astuce est que je ne veux pas stocker des éléments dans une feuille de calcul et les réinsérer dans un tableau lorsque le classeur est ouvert, mais pour que les éléments soient enregistrés en permanence dans le tableau.

+0

Quel est le problème avec le stockage sur une feuille? – Reafidy

+0

Voir aussi: http://stackoverflow.com/questions/7350388/saving-vba-dictionary-object-in-excel/7350849#7350849 Il y a quelques notes. – Fionnuala

+2

N'oubliez pas d'accepter les réponses qui fonctionnent. Il y a une icône en forme de flèche en haut à gauche des réponses - vous pouvez la sélectionner pour accepter la réponse. – aevanko

Répondre

5

L'un de vos meilleurs paris consiste à stocker les valeurs de tableau dans une feuille de calcul et à marquer la feuille de calcul comme masquée à l'aide de VBA.

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

Si vous utilisez d'autres choses comme des fichiers CSV locaux, registre, etc alors le code de fonctionnement sont possibles en déplaçant simplement le classeur à des machines différentes et vous perdrez la possibilité d'avoir plusieurs copies du tableau.

Modifier (Excellente suggestion dans @ commentaires de Reafidy ci-dessous)

+14

Utilisez 'Sheets (" ArrayValuesWorksheet "). Visible = xlVeryHidden' pour empêcher l'affichage de la feuille dans la liste d'affichage. – Reafidy

+1

Vous pouvez également protéger par mot de passe votre code et les feuilles "Très cachées" en allant dans Outils/Propriétés du Projet VBA/Onglet Protection et en entrant un mot de passe. L'utilisateur ne pourra pas afficher les feuilles "Très cachées". P.S. LOL au terme de Microsoft "Very Hidden". Je veux dire, je comprends b/c que j'ai été là ... c'est juste drôle de voir un Enum avec ce nom. – ray

+0

Merci pour les suggestions les gars, mais je ne veux pas stocker des données dans les feuilles de calcul cachées, comme je veux distribuer la macro comme une sorte d'extension, add-in (je ne sais pas encore) afin qu'il fonctionne sur n'importe quel classeur chaque fois que l'Excel est ouvert. Je pense qu'il ne sera pas possible de partager une macro de cette manière s'il y a une feuille de calcul cachée. En passant, pouvez-vous conseiller quelle est la meilleure façon de distribuer des macros? – user652061

0

Pour lire/tableau d'écriture dans la feuille, vous pouvez utiliser

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 

Une fois que vous pouvez utiliser la propriété Visible de la feuille pour cacher que nous avez répondu.

2

Vous pouvez également stocker un tableau dans un nom de la collection de noms et ce nom peut être masqué.

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

Cela va le stocker comme une chaîne pas un tableau. – Reafidy

+0

Merci Ronie et Reafidy. Ce n'est pas un problème s'il stocke des données sous forme de chaîne car je suppose que je peux revenir à la chaîne de lecture. Ce qui est intéressant pour moi, c'est quand je partage cette macro comme une sorte d'add-in (extension) sera-t-il possible de sauvegarder des données dans la collection de noms? – user652061

+0

Ceci est la réponse, il n'est pas difficile de le lire à partir de la constante nommée dans un tableau lors de l'initialisation. –

1

Pour répondre à votre question directement: Non, il n'y a aucun moyen de stocker un tableau qui a une durée de vie au-delà de l'application dans la mémoire - vous devrez l'enregistrer quelque part.

Plusieurs options sont disponibles, mais le mieux est probablement de les enregistrer sur une feuille. Les feuilles 'très cachées' ne sont visibles que par le code VBA, donc pour l'utilisateur c'est la même chose que le tableau qui est toujours là et actif dans la mémoire.

0

"il n'y a aucun moyen ...", >>> oui peut faire!

quelques exemples: listbox/ComboListBox (sur une feuille) = array ...

Pour tableau variant 2D: range() = matrice.

Ou stocker dans un commandbarMenu (ceux-ci peuvent être faites multidimensionnelle)

ou whateverthat garde après classeur rechargeant ...

Questions connexes