[VBA] String *n (Mémoire)

Kiseki

XLDnaute Occasionnel
Bonjour,

Sauriez-vous me confirmer de l'utilisation de la mémoire par rapport à :

Code:
As string
As string * 5

Sachant que :

Code:
Nom | Caractéristique | Taille (o)
String (Fixe) |65536 Caractères | Nombre de caractères
String (Var) |2^31Caractères | 10+ Nombre de caractères

?
 

Jam

XLDnaute Accro
Re : [VBA] String *n (Mémoire)

Re,

A la relecture de ton intrigante question, je dirai que String*5 < String car
String*5 = 5 octets max quand String = 10 octets minimum.
Maintenant je ne suis pas certain de la réponse n'étant pas informaticien à la base.
 

Kiseki

XLDnaute Occasionnel
Re : [VBA] String *n (Mémoire)

Bonjour Kjin, Jam,

C'est tout à fait ça Jam, maintenant que j'y regarde encore je me rend compte que ma feuille est pourtant explicite.

Merci,


Kjin, je crois que ce n'est pas ton jour, je demande juste une confirmation car voir "string * n" dans un code est rare, hors on peux l'utiliser dans bien des cas.

Je pense être poli pourtant, bien d'autre te colle un mur de texte sans dire merci non plus sans forme de politesse.

Mais je suppose que ce n'est simplement pas le bon moment ^^.
 

TempusFugit

XLDnaute Impliqué
Re : [VBA] String *n (Mémoire)

Bonjour

Je suis allé voir dans l'aide VBE d'Excel 2003 et voici ce que j'ai pu lire
String, type de données


Il existe deux types de chaînes : les chaînes de longueur variable et les chaînes de longueur fixe.

Les chaînes de longueur variable peuvent contenir environ 2 milliards (2^31) de caractères.


Les chaînes de longueur fixe peuvent contenir de 1 à environ 64 Ko (2^16) de caractères.

Ce qui vrai pour Excel 2003, l'est-il pour Excel 2007 et Excel 2010 ?

Donc en résumé:
Dim chaine As String * 20
limite la taille de chaine à 20 caractères, c'est bien çà ?
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : [VBA] String *n (Mémoire)

Dim chaine As String * 20
limite la taille de chaine à 20 caractères, c'est bien çà ?
Oui ça c'est clair. 20 octets.
Maintenant ça ne veux pas dire que VB utilise toujours pour chaque String de longueur variable la place nécessaire en mémoire pour loger sa longueur maxi possible, à moins peut être qu'elle soit déclarée Static
Cordialement.
 

Kiseki

XLDnaute Occasionnel
Re : [VBA] String *n (Mémoire)

Bonjour,

Oui,

Code:
Dim T as string *5
T = "Orange"
msgbox T 'Orang

Les caractères au-delà sont effacés.

En gros le "String * n" est plus intéressant si on peux limiter le nombre de caractère, on gagne jusqu'à 10 octets de mémoire.

Si je l'ai bien compris moi-même.


J'ai regarder ce matin dans mon bouquin avec comme exemple des codes postaux, qui ne dépasserai donc pas les 5 caractères, soit 5 octets de gagné facilement.

Un string variable prendra donc toujours 10 octets supplémentaire.



Par comparaison à un type variant que l'on évite, c'est un procédé très intéressant à connaître.

Encore mieux si on imagine une variable tableau, ça peux représenter un gain relativement énorme.
 
Dernière édition:

Jam

XLDnaute Accro
Re : [VBA] String *n (Mémoire)

Bonjour à tous,

On peut rajouter les points suivants:
- La variable, dès lors qu'elle est initialisée, occupe sa place maximum en mémoire en fonction de son type déterminé. D'où l'importance de typer ses variables pour limiter la place occupée en mémoire et aussi simplifier la gestion de ces variables (ce n'est pas le sujet ici).
- L'espace n'est réservé que lorsque le programme exécute l'instruction de déclaration de la variable. Une constante occupera un emplacement mémoire pendant toute la durée du programme contrairement à une variable apparaissant dans une procédure ou fonction.

à moins peut être qu'elle soit déclarée Static
Je ne pense pas que l'instruction Static ait une quelconque influence sur la taille de la mémoire. Elle permet juste de conserver la valeur d'une variable pendant l'exécution du code.

Ce qui vrai pour Excel 2003, l'est-il pour Excel 2007 et Excel 2010 ?
Oui. Un Integer occupera toujours le même nombre d'octet en mémoire.

Cdlt,
 

Jam

XLDnaute Accro
Re : [VBA] String *n (Mémoire)

Salut Kiseki,

La gestion de la mémoire sous Excel, n'est pas forcément de la première importance. Il faut mieux dans ce cas passer par des langages de programmation plus pointus sur la gestion mémoire comme le C ou C++. Néanmoins il convient effectivement de bien typer ses variables pour optimiser les traitements, le moteur VB étant nettement moins performants qu'un programme compilé.
Quand aux string de longueur fixe, le principal souci est de gérer...leur taille. En effet, si tu attribues à une chaîne une longueur de 5 par exemple, alors si cette variable="a" en fait il faudra lire a+4 caractères. Ceci pourra engendrer des traitements supplémentaires afin de retraiter correctement le contenu de cette variable. Les traitements étant consommateur de temps...il faudra donc choisir en temps et optimisation mémoire. Ou quand le mieux est l'ennemi du bien ;)

Cdlt
 

Dranreb

XLDnaute Barbatruc
Re : [VBA] String *n (Mémoire)

Je ne pense pas que l'instruction Static ait une quelconque influence sur la taille de la mémoire. Elle permet juste de conserver la valeur d'une variable pendant l'exécution du code.
Je ne suis pas sûr que tu ait tort car je ne sais pas exactement comment il gère les contenus de String même Static.
Ce qui est sûr, en revanche, c'est qu'une variable est ordinairement réservée dynamiquement. En particulier, déclarée dans une procédure qui n'est pas en train de s'exécuter, elle ne prend aucune place. Alors que si elle est Static, de la place lui est réservée à demeure au même titre que les instructions de la procédure. Alors il se pourrait, dans ce dernier cas, si c'est un String, qu'il soit en plus obligé de lui réserver à demeure la place maxi possible.
 

Kiseki

XLDnaute Occasionnel
Re : [VBA] String *n (Mémoire)

Oui, c'est en fonction des cas, mais je pense quand même qu'il ne faut pas l'oublier.

Imaginons une colonne de 35000 ligne contenant des référence AlphaNuméric de 20 caractères ou moins à mettre dans une variable tableau.

35000 * [La différence d'octet] = Grosse différence.


Code:
T as String * 20 'Complète par des espaces pour arriver à 20 caractères
T = "[30 caractères]" '20 octets et manque la fin
T = "[20 caractères]" '20 octets
T = "[15 caractères]" '20 octets
T = "[10 caractères]" '20 octets
T = "[5 caractères]" '20 octets
T = "[1 caractères]" '20 octets


Code:
T as String 'Nombre de caractère +10
T = "[30 caractères]" '40 octets
T = "[20 caractères]" '30 octets
T = "[15 caractères]" '25 octets
T = "[10 caractères]" '20 octets
T = "[5 caractères]" '15 octets
T = "[1 caractères]" '11 octets


En somme si on peux le placer, le bénéfice sera proportionnel au nombre de variables.



Nous pouvons calculer la vitesse d'exécution d'une procédure, pourrions-nous calculer la mémoire utilisée ?
 

Kiseki

XLDnaute Occasionnel
Re : [VBA] String *n (Mémoire)

Je viens de faire quelque teste de vitesse sur 10 000 cellules.

1) En affectant une plage à la variable, j’extraie les 7 premiers caractères '1,125 secondes

2) En *20 j’extraie les :
7 premiers caractères '1,484375 secondes
5 premiers caractères '1,59375 secondes
Sans rien extraire '1,53125 secondes

3) EN * 7 directement pour extraire les 7 premiers caractères '1,46875 secondes



En gros ce ne serait intéressant que si on ne fait pas référence à une plage et que l'on puissent limiter.
Permet de rajouter un ou plusieurs espace de fin.
Permet d'économiser de la mémoire.
Permet de garder un même nombre de caractères.
Permet de prendre le début d'un string (left() serait remplacé)


Je peux aussi me tromper.


Maintenant reste à voir si la mémoire utiliser est si importante ou non ? Un ordinateur du travail aurait 256-512mo de RAM en général ?

Dans ce sens la gestion de mémoire me semble en effet trivial si on n'utilise pas énormément de variable.

10000 variable string (10000 ligne dans le tableau) * 20o (Tableau variant pour l'assigner à une plage) = 200 000o soit 0,2mo ?


Avant que ça ne servent à quelque chose il faudrait 1 000 000 de variable pour prendre 20mo de mémoire ?
 

Discussions similaires

Réponses
3
Affichages
245

Statistiques des forums

Discussions
312 194
Messages
2 086 069
Membres
103 110
dernier inscrit
Privé