Format numérique personnalisé - VBA

Bonsoir,

Essayant de combler mes fort nombreuses lacunes en VBA j'ai essayé de faire une procédure qui pourra, in fine, me servir dans le cadre de mes activités professionnelles.

Le but de cette procédure est de transférer des informations d'un classeur dans une variable tableau puis de les restituer pour former une écriture comptable.

Le problème que je rencontre est le suivant :

Sachant que mon tableau est déclaré comme variant, comment personnaliser, lors de la réécriture dans la feuille, les formats numériques ?

Actuellement j'ai des nombres sous la forme "123456.78". le but étant d'avoir "123 456,78".

Je précise que je ne désire pas formater directement les cellules mais transmettre un format via VBA

Je vous remercie par avance de vos bons conseils !

49test-vba.xlsm (20.08 Ko)

Bonjour,

A l'écriture, pour tes Colonnes 3 et 4 ... tu pourrais tester:

Départ.Offset(LigFeuille - 1, Col - 1) = Format(Tab_Ecrit(Lig, Col), "#,###.00")

Bonjour James,

Hélas...hélas....

J'avais déjà testé un format similaire.... mais cela me donne sur la feuille une valeur ... texte !

Re,

Dommage ...

Je t'avoue n'avoir jamais rencontré cette question ...

Dès que j'ai un moment ... j'essayerai de creuser ...

Par avance...... MERCI !

Bonjour,

Ca te donne du texte parce que ta macro inscrit une valeur texte et non un numérique, ce qui est totalement indépendant du format appliqué.

Dans ta boucle il faut mettre un numérique dans le variant avec par exemple cdbl(ta_valeur_en_texte)

Enfin j'imagine parce que sans fichier...

eric

eriiic a écrit :

Enfin j'imagine parce que sans fichier...

Bonsoir eriiic

Si si.... il y a un fichier dans mon message !

Ah, désolé, je n'avais pas bien fait attention.

Il est où ton pb ?

Parce qu'en N ta macro met bien des numériques.

Sur excel un texte s'aligne à gauche, un numérique à droite

Si tu vois des . à la place de la , voulue c'est que ton séparateur décimal paramétré sur ton système est le .

Ou alors je n'ai pas compris ton pb...

Au passage pour copier une plage pas besoin de boucles.

Enlève ton Redim et

Tab_Ecrit = [A1].Resize(LigTab, 4).Value

suffit.

Pareil pour écrire un tableau. Fait tes calculs en mémoire dans le tableau et : [F1].Resize(LigTab, 4)=Tab_Ecrit

une seule écriture plutôt qu'une par cellule. C'est un gain de temps phénoménal.

eric

Bonjour Eric !

Tout d'abord mille mercis pour le temps consacré à me répondre d'une part et au savoir transmis dans ta réponse d'autre part.

Mon apprentissage "VBA" commence bien !

eriiic a écrit :

Il est où ton pb ?

Mon problème est, qu'au travers de cette procédure, je voulais me former à l'usage des tableaux de type "variant".

En l’occurrence le mien contient du texte et des valeurs numériques en colonne 3 et 4. Lors de la réécriture du tableau dans la feuille, les valeurs numériques ne sont pas formatées et comme je ne désire pas laisser le soin à l'utilisateur de la faire, je cherche la manière d'écrire dans la cellule une valeur 123 456,78 et non pas 123456,78

eriiic a écrit :

Pareil pour écrire un tableau. Fait tes calculs en mémoire dans le tableau et : [F1].Resize(LigTab, 4)=Tab_Ecrit

une seule écriture plutôt qu'une par cellule. C'est un gain de temps phénoménal.eric

Ce conseil judicieux me pose toutefois un souci.

En effet si la colonne 3 ET la colonne 4 d'une ligne de mon tableau sont égales à 0, je dois "sauter" la ligne afin de ne pas l'écrire dans ma feuille. Et là.... je ne sais pas faire !

La solution passe par une boucle dans un nouveau tableau et ensuite la réécriture ?

Bonjour,

Personnellement, je pense que pour le format c'est le type variant qui bloque ...

En utilisant le type range, tu peux surmonter l'obstacle ...

56test-vba-v2.xlsm (20.24 Ko)

Bonjour,

Je dirais que le format n'a pas besoin d'être dans la macro.

Tu mets le format correct une fois pour toute sur la feuille.

Avec Tab_Ecrit = [A1].Resize(LigTab, 4).value sur mon essai le format n'est pas changé.

Pour le tableau si tu dois supprimer une ligne tu peux faire une boucle qui décale les suivantes vers le haut. Ca sera toujours beaucoup plus rapide de travailler en mémoire que sur la feuille (au moins x100).

Ou bien utiliser une autre variable Resultat que tu remplies au fur et à mesure que tu balaies le premier tableau.

eric

Salut Eric ...

Perso, ce que j'ai compris de l'objectif de JFL au sujet du format ... c'est qu'il veut soit transporter la propriété soit modifier la propriété de chaque élément de l'array ...

Eric et James ..... merci pour vos apports !

En essayant de combiner vos deux propositions, je rencontre de nouveaux problèmes ....!

Par exemple, lors du remplissage de mon premier tableau j'ai essayé de mettre en place l'apport d'Eric

Tab_Ecrit = Départ.Resize(LigTab, 4).Value

au lieu de passer par une boucle.

Mais si je change la déclaration de mon tableau en Range, sur la ligne proposée par Eric j'ai une erreur d'exécution '13' Incompatibilité de type

Salut james

Ce que j'ai compris c'est qu'il veut un format 123 456.78 (avec séparateur de millier)

Mais même sur son fichier d'origine, comme il lit .value je n'ai pas de modification du format déjà mis sur la feuille en M:N.

Idem pour une lecture de plage complète.

Donc je crois que je n'ai pas compris son pb exact

eric

Edit : pour lire une plage la variable doit être Variant

eriiic a écrit :

Ce que j'ai compris c'est qu'il veut un format 123 456.78 (avec séparateur de millier)

Absolument !

Mais lors de la réécriture de mon tableau sur la feuille.... les valeurs numériques ne sont pas au format souhaité puisqu'elles apparaissent sous la forme 123456,78.

Certes je peux modifier le format directement sur la zone de la feuille... mais le but premier de cet "exercice" était d'apprendre à transférer sur une feuille une valeur numérique ET un format.

eriiic a écrit :

Edit : pour lire une plage la variable doit être Variant

Je vais admettre cela..... mais c'est totalement abscons pour moi !

Par variable, vous évoquez la variable "Départ" ou la variable tableau "Tab_Ecrit" ?

Salut JFL,

As-tu jeté un oeil au fichier Test VBA V2 ...???

car j'aimerais comprendre ce qui ne correspond pas à ta demande ...

Mais lors de la réécriture de mon tableau sur la feuille.... les valeurs numériques ne sont pas au format souhaité puisqu'elles apparaissent sous la forme 123456,78.

Je crois qu'on tourne en rond là.

C'est parce que par défaut les colonnes sont au format Standard.

Tu peux appliquer le format que tu veux par macro (utiliser l'enregistreur de macro pour le récupérer).

Ca serait [M:N].NumberFormat = "#,##0.00") et c'est proche la première réponse qui t'a été proposée par James. Elle ne fonctionne que si tes valeurs sont numériques (et elles le sont bien) et non en texte.

Donc pas de soucis sur ton classeur avec cette proposition, c'est là où je décroche...

Mais le plus souvent on met en forme sa feuille une fois pour toute sans s'embêter avec ça en macro.

Pas grand intérêt de surcharger le code avec des lignes qui ne serviront qu'une fois si on peut s'en passer. Tu y mettrais les largeurs de colonne, les encadrements, les couleurs, les attributs police aussi ?

On ne le fait que si on n'a pas le choix, mais peut-être est-ce le cas.

eric

eriiic a écrit :

C'est parce que par défaut les colonnes sont au format Standard.

Tu peux appliquer le format que tu veux par macro (utiliser l'enregistreur de macro pour le récupérer).

Ca serait [M:N].NumberFormat = "#,##0.00") et c'est proche la première réponse qui t'a été proposée par James. Elle ne fonctionne que si tes valeurs sont numériques (et elles le sont bien) et non en texte.

Donc pas de soucis sur ton classeur avec cette proposition, c'est là où je décroche...

Mais le plus souvent on met en forme sa feuille une fois pour toute sans s'embêter avec ça en macro.

Pas grand intérêt de surcharger le code avec des lignes qui ne serviront qu'une fois si on peut s'en passer. Tu y mettrais les largeurs de colonne, les encadrements, les couleurs, les attributs police aussi ?

On ne le fait que si on n'a pas le choix, mais peut-être est-ce le cas.eric

Je me range à votre avis la mise en forme directement sur la feuille.

James007 a écrit :

As-tu jeté un oeil au fichier Test VBA V2 ...???

car j'aimerais comprendre ce qui ne correspond pas à ta demande ...

Le fichier Test VBA V2 est une solution pertinente à mon besoin.

Je voulais juste cumuler cette proposition avec l'apport d'Eric en matière d'alimentation et de réécriture des tableaux (voir son post à ce sujet), mais visiblement ce n'est pas possible car la définition initiale du tableau en "range" est incompatible avec la préconisation d'Eric qui exige une définition en "variant"

En conclusion, je ferme ce post, sans omettre de vous remercier une fois de plus !

Re,

Pour ne pas déroger à la règle ...

Merci pour tes remerciements ...

Rechercher des sujets similaires à "format numerique personnalise vba"