OVH Cloud OVH Cloud

Opération sur une cellule sans perdre la formule ?

8 réponses
Avatar
Talboum
Bonjour,

Soyez indulgents, je d=E9bute :whistle:

J'ai des feuilles excel comportant des formules qui sont des
r=E9f=E9rences =E0 d'autres fichiers en g=E9n=E9ral, des montants.

Ces montants, je dois tous les diviser par 1000000 et les afficher en
format 0,0.

Par exemple :
Cellule A1 contient =3D('C:\[reference.xls]Onglet 1'!C217)
et donne comme valeur : 1 234 567,5

qui doit devenir : 1,2

MAIS sans perdre la r=E9f=E9rence, donc un truc du style :
=3D('C:\[reference.xls]Onglet 1'!C217)/1000000

J'aimerais une macro qui fasse cela soit sur une s=E9lection d'une
cellule, soit sur une s=E9lection d'une plage de cellules.

Pouvez-vous m'aider ?

Voici mon =E9bauche de script ... mais =E7a coince :

[code]
Sub inMillionEur()
If TypeName(Selection) <> "Range" Then Exit Sub
Application.ScreenUpdating =3D False
For Each cell In Selection
' Si la cellule est vide, passer =E0 la suivante
If IsEmpty(cell) Then GoTo NextCell
' Si la cellule ne contient pas de donn=E9e num=E9rique, passer =E0 la
suivante
If IsNumeric(cell) =3D False Then GoTo NextCell
' Si la cellule contient une formule
If cell.HasFormula Then
newValue =3D cell.Formula & "/1000000"
cell.Formula =3D newValue '-----> probl=E8me !!!!!
' si la cellule contient une valeur
Else
' Conversion
cell.Value =3D cell / 1000000
End If

' Formater la cellule
FormatCell:
cell.NumberFormat =3D "#,#0.0"


' Passer =E0 la cellule suivante
NextCell:
Next cell
Application.ScreenUpdating =3D True
End Sub
[/code]

Merci pour votre attention et votre aide.

Nathalie

8 réponses

Avatar
Daniel
Bonjour.
Essaie le format personnalisé : "# .0" (sans les ") soit dièse, espace,
espace, point, zéro.
Cordialement.
Daniel
"Talboum" a écrit dans le message de news:

Bonjour,

Soyez indulgents, je débute :whistle:

J'ai des feuilles excel comportant des formules qui sont des
références à d'autres fichiers en général, des montants.

Ces montants, je dois tous les diviser par 1000000 et les afficher en
format 0,0.

Par exemple :
Cellule A1 contient =('C:[reference.xls]Onglet 1'!C217)
et donne comme valeur : 1 234 567,5

qui doit devenir : 1,2

MAIS sans perdre la référence, donc un truc du style :
=('C:[reference.xls]Onglet 1'!C217)/1000000

J'aimerais une macro qui fasse cela soit sur une sélection d'une
cellule, soit sur une sélection d'une plage de cellules.

Pouvez-vous m'aider ?

Voici mon ébauche de script ... mais ça coince :

[code]
Sub inMillionEur()
If TypeName(Selection) <> "Range" Then Exit Sub
Application.ScreenUpdating = False
For Each cell In Selection
' Si la cellule est vide, passer à la suivante
If IsEmpty(cell) Then GoTo NextCell
' Si la cellule ne contient pas de donnée numérique, passer à la
suivante
If IsNumeric(cell) = False Then GoTo NextCell
' Si la cellule contient une formule
If cell.HasFormula Then
newValue = cell.Formula & "/1000000"
cell.Formula = newValue '-----> problème !!!!!
' si la cellule contient une valeur
Else
' Conversion
cell.Value = cell / 1000000
End If

' Formater la cellule
FormatCell:
cell.NumberFormat = "#,#0.0"


' Passer à la cellule suivante
NextCell:
Next cell
Application.ScreenUpdating = True
End Sub
[/code]

Merci pour votre attention et votre aide.

Nathalie
Avatar
bourby
Daniel wrote:
Bonjour.
Essaie le format personnalisé : "# .0" (sans les ") soit dièse, espace,
espace, point, zéro.
Cordialement.
Daniel
"Talboum" a écrit dans le message de news:

Bonjour,

Soyez indulgents, je débute :whistle:

J'ai des feuilles excel comportant des formules qui sont des
références à d'autres fichiers en général, des montants.

Ces montants, je dois tous les diviser par 1000000 et les afficher en
format 0,0.

Par exemple :
Cellule A1 contient =('C:[reference.xls]Onglet 1'!C217)
et donne comme valeur : 1 234 567,5

qui doit devenir : 1,2

MAIS sans perdre la référence, donc un truc du style :
=('C:[reference.xls]Onglet 1'!C217)/1000000

J'aimerais une macro qui fasse cela soit sur une sélection d'une
cellule, soit sur une sélection d'une plage de cellules.

Pouvez-vous m'aider ?

Voici mon ébauche de script ... mais ça coince :

[code]
Sub inMillionEur()
If TypeName(Selection) <> "Range" Then Exit Sub
Application.ScreenUpdating = False
For Each cell In Selection
' Si la cellule est vide, passer à la suivante
If IsEmpty(cell) Then GoTo NextCell
' Si la cellule ne contient pas de donnée numérique, passer à la
suivante
If IsNumeric(cell) = False Then GoTo NextCell
' Si la cellule contient une formule
If cell.HasFormula Then
newValue = cell.Formula & "/1000000"
cell.Formula = newValue '-----> problème !!!!!
' si la cellule contient une valeur
Else
' Conversion
cell.Value = cell / 1000000
End If

' Formater la cellule
FormatCell:
cell.NumberFormat = "#,#0.0"


' Passer à la cellule suivante
NextCell:
Next cell
Application.ScreenUpdating = True
End Sub
[/code]

Merci pour votre attention et votre aide.

Nathalie


Bonjour,


à signaler que ces formats,fort pratiques, ne changent que l'affichage:
la valeur cotenue dans la cellule n'est pas divisée.

Cordialement

Avatar
Daniel
Bonsoir.
Très juste. j'avais lu en travers. Pour me faire pardonner :

Sub test()
Dim c As Range, Formule As String
For Each c In Selection
If Left(c.Formula, 1) = "=" Then
c.Formula = "=(" & Right(c.Formula, Len(c.Formula) - 1) &
")/1000000"
c.NumberFormat = "0.0"
End If
Next c
End Sub

Cordialement.
Daniel
"bourby" a écrit dans le message de news:

Daniel wrote:
Bonjour.
Essaie le format personnalisé : "# .0" (sans les ") soit dièse, espace,
espace, point, zéro.
Cordialement.
Daniel
"Talboum" a écrit dans le message de news:

Bonjour,

Soyez indulgents, je débute :whistle:

J'ai des feuilles excel comportant des formules qui sont des
références à d'autres fichiers en général, des montants.

Ces montants, je dois tous les diviser par 1000000 et les afficher en
format 0,0.

Par exemple :
Cellule A1 contient =('C:[reference.xls]Onglet 1'!C217)
et donne comme valeur : 1 234 567,5

qui doit devenir : 1,2

MAIS sans perdre la référence, donc un truc du style :
=('C:[reference.xls]Onglet 1'!C217)/1000000

J'aimerais une macro qui fasse cela soit sur une sélection d'une
cellule, soit sur une sélection d'une plage de cellules.

Pouvez-vous m'aider ?

Voici mon ébauche de script ... mais ça coince :

[code]
Sub inMillionEur()
If TypeName(Selection) <> "Range" Then Exit Sub
Application.ScreenUpdating = False
For Each cell In Selection
' Si la cellule est vide, passer à la suivante
If IsEmpty(cell) Then GoTo NextCell
' Si la cellule ne contient pas de donnée numérique, passer à la
suivante
If IsNumeric(cell) = False Then GoTo NextCell
' Si la cellule contient une formule
If cell.HasFormula Then
newValue = cell.Formula & "/1000000"
cell.Formula = newValue '-----> problème !!!!!
' si la cellule contient une valeur
Else
' Conversion
cell.Value = cell / 1000000
End If

' Formater la cellule
FormatCell:
cell.NumberFormat = "#,#0.0"


' Passer à la cellule suivante
NextCell:
Next cell
Application.ScreenUpdating = True
End Sub
[/code]

Merci pour votre attention et votre aide.

Nathalie


Bonjour,


à signaler que ces formats,fort pratiques, ne changent que l'affichage: la
valeur cotenue dans la cellule n'est pas divisée.

Cordialement



Avatar
Talboum
Merci Daniel et Bourby,

Première question :

J'ai cependant encore un problème,

A savoir une fenêtre qui s'ouvre "update values" à la recherche de
mon fichier references.xls.
Fichier que je ne veucx évidemment PAS modifier ! Comment empêcher
cela ?

Deuxième question :

Je constate que quand je lance mes macros, je ne peux pas faire marche
arrière (undo) ...
Faut-il donc aussi programmer des macros de retour en arrière ?

Je n'ai pas l'habitude, je débute, merci donc pour votre patience.

Bonne journée,

Nathalie
Avatar
Daniel
Bonjour.
Pour le premier point, ça ne seproduit pas chez moi. Essaie :

Sub test()
Dim c As Range, Formule As String, Var
Var = ActiveWorkbook.UpdateLinks
ActiveWorkbook.UpdateLinks = 2
For Each c In Selection
If Left(c.Formula, 1) = "=" Then
c.Formula = "=(" & Right(c.Formula, Len(c.Formula) - 1) & _
")/1000000"
c.NumberFormat = "0.0"
End If
Next c
ActiveWorkbook.UpdateLinks = Var
End Sub

Pour le second, il faut écrire la macro inverse. En général, fais une
sauvegarde de ton classeur avant d'exécuter une macro de test.
Cordialement.
"Talboum" a écrit dans le message de news:

Merci Daniel et Bourby,

Première question :

J'ai cependant encore un problème,

A savoir une fenêtre qui s'ouvre "update values" à la recherche de
mon fichier references.xls.
Fichier que je ne veucx évidemment PAS modifier ! Comment empêcher
cela ?

Deuxième question :

Je constate que quand je lance mes macros, je ne peux pas faire marche
arrière (undo) ...
Faut-il donc aussi programmer des macros de retour en arrière ?

Je n'ai pas l'habitude, je débute, merci donc pour votre patience.

Bonne journée,

Nathalie
Avatar
Talboum
Encore merci Daniel :-)

Pour le premier point pareil ... il ouvre toujours une fenêtre 'Update
values' pour que je lui indique le fichier references.xls.

Pour le second point, je dois faire un truc du style :

Sub FaisLe
Application.onundo "Défaire ma macro FaisLe","NeLeFaisPas"
...
End Sub

Sub NeLeFaisPas
...
End Sub

C'est bien ça ?

:-)

Nathalie
Avatar
Daniel
Pour le premier point, je ne sais vraiment pas. Peux-tu mettre ton classeur
sur www.cjoint.com ?
Pour le second (à utiliser avec pruddence) :

Sub DefaisLe()
Dim c As Range, Formule As String
For Each c In Selection
If Left(c.Formula, 2) = "=(" And Right(c.Formula, 9) = ")/1000000"
Then
c.Formula = "=" & Mid(c.Formula, 3, Len(c.Formula) - 11)
End If
Next c
End Sub

Avec cette réserve qu'aucune formule initiale ne se terminait par /1000000.
Daniel
"Talboum" a écrit dans le message de news:

Encore merci Daniel :-)

Pour le premier point pareil ... il ouvre toujours une fenêtre 'Update
values' pour que je lui indique le fichier references.xls.

Pour le second point, je dois faire un truc du style :

Sub FaisLe
Application.onundo "Défaire ma macro FaisLe","NeLeFaisPas"
...
End Sub

Sub NeLeFaisPas
...
End Sub

C'est bien ça ?

:-)

Nathalie
Avatar
Talboum
Pour la question 1, c'est résolu. J'ai recommencé dans un fichier
propre et je n'ai plus eu de problème ... probablement des crasses qui
trainaient ... :-(

Pour la question 2. C'est nickel. Ton code me convient. Je l'adopte.

Je te remercie beaucoup et te souhaite une bonne journée.

A+

Nathalie