2017-08-31 2 views
0

Je me demandais s'il existe un moyen de conserver certaines valeurs stockées dans un tableau après la fin du code et la fermeture du fichier Excel.Array gardant les valeurs après la fin du code

L'idée serait d'avoir un tableau contenant certaines valeurs. Lors de l'exécution du code, je peux ou non modifier certaines de ses valeurs et quand je ferme le fichier je voudrais que ce tableau subsiste et garde ses valeurs. Ce que je veux dire par là, c'est que quand je rouvrirais le fichier et que j'exécuterais le code, toutes les autres variables seraient ré-initialisées (et de toute évidence recevraient des valeurs par défaut), mais ce tableau spécial aurait toutes ses valeurs stocké (donc je ne le re-déclarerais évidemment pas dans ce code). Une façon d'éviter ce problème serait de stocker toutes les valeurs contenues dans le tableau dans une feuille de calcul et chaque fois que le code est exécuté à nouveau, les remettre dans un nouveau tableau. Mais je me demande s'il y a un moyen de le faire sans utiliser une feuille de calcul.

+0

Essayez [Propriété Workbook.CustomDocumentProperties (Excel)] (https://msdn.microsoft.com/fr-fr/vba/excel-vba/articles/workbook-customdocumentproperties-property-excel). Je ne l'ai jamais utilisé, mais cela peut fonctionner pour votre but. – YowE3K

Répondre

3

On a tendance à penser à une feuille de calcul comme le cœur et l'âme d'Excel et est donc peu disposés à faire "un gros effort" pour stocker un seul tableau. Du point de vue d'Excel, une feuille n'est rien de plus qu'un tableau, ne prenant que quelques octets de mémoire alors qu'elle est vide. Je dirais qu'une feuille de travail VeryHidden est précisément ce que vous demandez, en fait très similaire aux variables de document de Word. Comme alternative, je pourrais suggérer d'utiliser l'une des propriétés intégrées, telles que les mots-clés ou les commentaires, pour stocker une chaîne qui peut être divisée en un tableau. Ce serait probablement plus à votre goût mais je pense qu'il est inférieur parce que l'utilisateur peut le modifier, à moins que ce soit quelque chose que vous pouvez utiliser à votre avantage.

Techniquement, et à toutes fins utiles, une feuille de travail VeryHidden est précisément ce que vous demandez. Votre résistance est basée sur la psychologie, pas sur la raison - du moins, c'est ainsi que je me suis convaincu, et je peux dire qu'être plus libéral avec le nombre de feuilles de travail que je crée m'a donné plus de libertés sans coût perceptible.

+0

Merci. Je pense que la meilleure option dans mon cas est une feuille cachée (ou très cachée peut-être). Je m'attendais à trouver un moyen de conserver une variable ** array ** stockée dans le fichier mais apparemment, comme l'a montré @David G, ce n'est pas possible. Y a-t-il une différence entre une feuille très cachée et cachée à part le fait que l'on soit totalement inaccessible à partir de l'interface utilisateur? Comme la mémoire-sage peut-être? – Seb

+1

Un classeur avec toutes ses données (et ses feuilles) est en fait une collection de fichiers XML. Vous pouvez vérifier cela par vous-même, renommez simplement 'fichier.xlsx' en' fichier.zip' et décompressez-le. Le stockage de vos données dans une feuille (cachée) sera le même que le stockage dans les propriétés du document quand il s'agit de la mémoire. C'est du texte, stocké dans des fichiers XML. La feuille cachée vous donnera naturellement plus d'outils. –

+0

Non. La seule différence est l'accessibilité au clavier. – Variatus

1

Soit stocker des informations, comme vous l'avez mentionné, dans une feuille (cachée), ou utiliser Document Variables.

De la documentation:

Sub AddDocumentVariable() 
ActiveDocument.Variables.Add Name:="Age", Value:=12 
End Sub 

Ces variables seront disponibles même si votre code a terminé ou le classeur a été fermé et ouvert à nouveau.

Edit: (pour Excel, le code trouvé here)

Sub test() 
Dim wb As Workbook 
Dim docProps As DocumentProperties 
Dim docProp As DocumentProperty 
     Set wb = ActiveWorkbook 
     Set docProps = wb.CustomDocumentProperties 

    With docProps 
      .Add Name:="CustomNumber", _ 
         LinkToContent:=False, _ 
         Type:=msoPropertyTypeNumber, _ 
         Value:=1000 
      .Add Name:="CustomString", _ 
         LinkToContent:=False, _ 
         Type:=msoPropertyTypeString, _ 
         Value:="This is a custom property." 
      .Add Name:="CustomDate", _ 
         LinkToContent:=False, _ 
         Type:=msoPropertyTypeDate, _ 
         Value:=Date 
    End With 
     For Each docProp In docProps 
      Debug.Print docProp.Name, docProp.Value 
    Next 

End Sub 
+0

Merci pour cette avance. Il semble que ce n'est valable que pour les documents Word. J'essaie de trouver la même chose pour Excel. – Seb

+0

Ajout d'un exemple de code pour Excel. –

+0

C'est exactement ce que je recherche mais pour une variable tableau. Comme expliqué dans le message que vous avez lié, si le type est array, il n'y a pas msoPropertyType pour cela. Donc je devrais créer une variable pour stocker chaque élément de mon tableau (36 dans mon cas ... pourrait être pire cependant). Par conséquent, la meilleure solution semble être d'utiliser une feuille (très) cachée – Seb