Syntaxe VBA : transformer Nb en String

zebanx

XLDnaute Accro
Bonsoir à tous,

J'arrive à transformer les nombres en chiffre par une formula.local = "= TEXTE(….)" sur chaque cellule mais y a-t-il un moyen plus simple d'y arriver s'il vous plait et dans le but de conserver à l'identique la présentation de départ comme dans les trois exemples joints ? (Cstr ?)

Les formules en colonne E, F, G correspondent à celles reprises pour les formula.local.
Et je souhaite bien faire une boucle sur les cellules des colonnes A à C (ie : par exemple, pour un besoin de publipostage, il faut : texte + préservation présentation primaire en format nombre).

Vous remerciant par avance pour vos propositions et vous souhaite une bonne soirée -)

zebanx
 

Pièces jointes

  • question sur conversion nb en txt.xls
    17 KB · Affichages: 47
Dernière édition:

zebanx

XLDnaute Accro
Bonjour Staple1600,

Je te remercie pour ton retour et ce document.
Premier essai, ça n'a pas fonctionné mais on va continuer à regarder.

C'est pas passionnant, je m'en doutais (!), peu utile en dehors de ce cas de transfert vers une autre appli- de MS.
Car transformer presque tous les nombres en texte dans un tableau sous excel, c'est un peu venir mettre du "mont blanc chocolat" dans un tiramisu et le présenter en dessert du jour, ça le fait pas...

L'intérêt principal était, pour rappel, de connaitre une syntaxe adéquate transformant rapidement un "num" en "string" et en conservant le format affiché pour le nombre.
Et une écriture en boucle de ce type fait son job sur une récente tentative :
-----
For i = 2 To derligne
For j = LBound(z, 1) To UBound(z, 1)
If IsNumeric(Cells(i, z(j, 1)).Value) Then
Cells(i, z(j, 1)).FormulaLocal = "=Texte(" & Cells(i, z(j, 1)).Value & ";""# ###.00"" &"" €"")"
End If
Next j
Next i

Il y a 2 ou 3 présentations de chiffres (date, # ###.00 €...), ça fera 3 boucles avec les arrays (colonne) à définir, on va se contenter de cela !

Bonne journée,
zebanx
 

Staple1600

XLDnaute Barbatruc
Re


Je fais de nombreux publipostages Word+Excel, et la solution des champs de fusion paramétrés fonctionne bien.
Mais les données dans Excel sont au format Standard
C'est Word qui se charge des formats selon les besoins.

Voila pourquoi je préfère laisser Word faire le boulot
VB:
Sub test()
Data = Array(Date, 100.5, 123)
For i = LBound(Data) To UBound(Data) & Chr(13)
a = a & Format(Data(i), "dddd dd mmmm yyyy") & Chr(13)
a = a & Format(Data(i), "#,##0.00 €") & Chr(13)
a = a & CStr(Data(i)) & Chr(13)
Next
MsgBox a
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonsoir zebanx, JM,

La question ne me paraît pas un vrai problème.

En effet on met ce qu'on veut dans un tableau.

Pour la restitution dans les cellules il faut qu'elles soient au format Texte :
Code:
Private Sub Worksheet_change(ByVal Target As Range)
Dim P As Range, t, ub%, i&, j%
Set P = [A1].CurrentRegion 'à adapter
t = P.Resize(P.Rows.Count + 1) 'tableau, plus rapide, au moins 2 éléments
ub = UBound(t, 2)
For i = 1 To UBound(t) - 1
  For j = 1 To ub
    t(i, j) = IIf(IsDate(t(i, j)), Format(t(i, j), "dd-mm-yyyy"), P(i, j).Text) 'on met ce qu'on veut
Next j, i
t(1, 1) = "TEXTE"
'---restitution---
Application.EnableEvents = False
With [E1].Resize(P.Rows.Count, ub) 'E1 à adapter
  .NumberFormat = "@" 'format Texte
  .Interior.ColorIndex = 6 'jaune
  .Value = t
  .Offset(P.Rows.Count).Resize(Rows.Count - P.Rows.Count - .Row + 1).Clear 'RAZ dessous
End With
Application.EnableEvents = True
End Sub
Bonne fin de soirée.
 

Pièces jointes

  • question sur conversion nb en txt(1).xls
    68.5 KB · Affichages: 39
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour zebanx, JM,

Si l'on veut restituer le tableau dans un fichier Texte :
Code:
Private Sub Worksheet_change(ByVal Target As Range)
Dim P As Range, t, ub%, i&, j%, chemin$
Set P = [A1].CurrentRegion 'à adapter
t = P.Resize(P.Rows.Count + 1) 'tableau, plus rapide, au moins 2 éléments
ub = UBound(t, 2)
For i = 1 To UBound(t) - 1
  For j = 1 To ub
    t(i, j) = IIf(IsDate(t(i, j)), Format(t(i, j), "dd-mm-yyyy"), P(i, j).Text) 'on met ce qu'on veut
Next j, i
t(1, 1) = "TEXTE"
'---restitution dans un fichier Texte---
chemin = ThisWorkbook.Path & "\Fichier Texte.txt" 'à adapter
Application.ScreenUpdating = False
With Workbooks.Open(chemin).Sheets(1)
  .Cells.Clear
  With .[A1].Resize(P.Rows.Count, ub)
    .NumberFormat = "@" 'format Texte
    .Value = t
  End With
  .Parent.Close True
End With
End Sub
Fichier (2) + Fichier Texte à télécharger dans le même dossier (le bureau).

A+
 

Pièces jointes

  • question sur conversion nb en txt(2).xls
    82.5 KB · Affichages: 32
  • Fichier Texte.txt
    0 bytes · Affichages: 32

zebanx

XLDnaute Accro
Bonjour job75, staple1600

@Staple1600
Intéressant l'utilisation de format(,) &chr(13)-> merci

@job75
Merci pour ta double réponse.
La partie "P(i,j).text" du #5 fonctionne très bien quelque soit le format affiché.
C'est exactement ce que je recherchais pour éviter de faire des boucles à chaque changement de format de présentation dans la colonne (date, ...00, ...00 €...).

Je n'avais pas besoin pour le publipostage de transférer directement le tableau dans un fichier texte (#6).
Par habitude, la source de donnée utilisée est en effet ce fichier XLS dont les éléments sont tous en format texte, ce qui est le cas avec l'utilisation de ton code (et reprise du tableau complet dans une feuille tampon dédiée).

Mais grâce à vos deux syntaxes, j'ai un retour clair, synthétique et "finalisant" sur la manière de procéder.:cool:

Bonne journée à tous les deux
zebanx
 

job75

XLDnaute Barbatruc
Re,

Notez que la lecture de la propriété .Text prend du temps, testez avec cette macro :
Code:
Sub Tests()
Dim nombre, cellule As Range, t, n&, texte$
nombre = -10
Set cellule = [A1]
cellule.NumberFormat = "0.00"
cellule = nombre
'---format nombre---
t = Timer
For n = 1 To 1000000
texte = Format(nombre, "0.00")
Next
MsgBox Timer - t, , "Format-nombre" '0,9 seconde chez moi sur Win 10 - Excel 2013
'---format cellule---
t = Timer
For n = 1 To 1000000
texte = Format(cellule, "0.00")
Next
MsgBox Timer - t, , "Format-cellule" '3,2 secondes
'---propriété .Text---
t = Timer
For n = 1 To 1000000
texte = cellule.Text
Next
MsgBox Timer - t, , "Propriété .Text" '13,2 secondes
End Sub
A+
 

zebanx

XLDnaute Accro
Re-Staple1600

Oui désolé de ne pas avoir fait un retour sur le sujet.
Le problème venait de ma saisie. J'avais oublié un caractère sur la saisie des informations.
En étant un peu plus concentré, ça fonctionne comme tu me l'avais indiqué.

Reste après le nombre de champs à paramétrer. Tu sembles en avoir l'habitude, moi nettement moins.
Et je suis content de pouvoir utiliser un fichier excel déjà préparé pour une intégration directe.

Mais merci d'avoir insisté, le pdf que tu m'as transmis sera utile !
Et il est très explicite.
Les résultats transmis, par toi ou par Job75, sont très satisfaisantes pour un publipostage.
Ca me donne envie de m'y remettre un peu plus d'ailleurs !

bonne journée
zebanx

edit : @job75 : Avec application.format, autre sujet traité cette semaine, les résultats sont étonnants cette semaine. Et sous 2003, je suis sur la troisième partie (txt) à 5.7 secondes (et dans l'ordre : 0.51s, 3.10s et 5.7s)
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
311 725
Messages
2 081 941
Membres
101 848
dernier inscrit
Djigbenou