Aide facile VBA Excel

13 réponses
Avatar
Raymond Poulain
Bonjour

J'ai hésité à poster ce message sur le newsgroup d'Excel, mais celui-ci est
plus directement concerné, même si ma question sera très facile pour vous.

Je voudrais dans une cellule Excel 2000 enlever les 2 derniers caractères,
au moment où la macro se trouve sur la cellule en question.
J'ai essayé avec l'éditeur automatique, en mode relatif ou absolu, mais cela
ne marche pas (il ne transcrit que le résultat, c'est à dire le contenu de la
cellule coupée... mais comme le contenu de la cellule change à chaque boucle
de la macro...).
J'ai essayé l'aide, mais n'ai pas trouvé!

Qui peut me donner un coup de main?

Merci d'avance

A+

Raymond

3 réponses

1 2
Avatar
Patrice Henrio
Tu copies tes valeur dans une feuille 2.
Tu définis la zone de copie comme étant tableau
(sélectionner toutes tes valeurs, Insertion/nom/définir, Tableau)
Tu crées une macro qui va recopier toutes les cellules de la feuille 2 sur
la feuille 1 en retirant le ", " de la fin
Pour cela
Outils/Macro/Visual basic editor
Tu insères un module
Insertion/module
Tu colles le code suivant dans ce module :

Option Explicit
Public Sub efface()
Dim C As Range, S As String
For Each C In ThisWorkbook.Sheets("feuil2").Range("Tableau")
S = C
If Right(S, 2) = ", " Then S = Left(S, Len(S) - 2)
ThisWorkbook.Sheets("feuil1").Cells(C.Row, C.Column) = S
Next
End Sub

Il ne te reste plus qu'à lancer la sub :
Outils/macro/macros/efface

Bien entendu tu adaptes à ton cas avec tes noms de feuilles

Tout cela peut-être encore plus automatisé en supprimant la feuille 2 à la
fin de la sub.




"Gloops" a écrit dans le message de news:
434c1479$0$1742$
Bon, alors il s'agit d'un transfert entre deux fichiers.

Alors essaie de tout me dire d'un coup ...
Le fichier source, il est de quel type ? Qu'est-ce qu'il y a dedans ?
Tu transfères tout, ou une partie ?
Une feuille, ou plusieurs ?
En une fois, ou en plusieurs fois ?
Elle sort d'où, cette virgule ?

Ah il y a une macro. Qu'est-ce qu'elle fait, au juste ?
Elle est longue ? Peut-être qu'on peut voir ?
______________________________________________
Raymond Poulain a écrit, le 11/10/2005 17:13 :
Oh non, c'est infiniment simple: dans l'autre fichier dont je copie une
cellule, il y a une formule (que je ne peux changer)... c'est pour cela
que je "copie-valeurs", mais la présence de la virgule ne joue pas (j'ai
essayé avec d'autres caractères).
Ici il ne s'agit que d'une banale instruction VBA que je ne connais pas
car la macro existante a été générée automatiquement par l'éditeur Excel
et elle marche... sauf que esthétiquement il y a une cellule qui se
termine par ', '. (N.B.: oui il y a beaucoup d'autres cellules copiées de
la même façon, certaines avec ', ' placé au hasard, jamais à la fin, mais
c'est la seule :





avec ce problème "esthétique").

A+ Ray





Avatar
Gloops
Patrice Henrio a écrit, le 12/10/2005 11:38 :

Tu copies tes valeur dans une feuille 2.



J'aimerais bien voir un exemple des données à la source, par exemple
l'exemple dont tu as donné la transposition "Hugo" puis "Mallarmé,
Proust et Raimbaud, ". Ces virgules m'intriguent.
Ce sont des données copiées d'ailleurs, non ? Un traitement de textes ?
Peut-être peut-on faire l'économie de la feuille 2.
As-tu essayé ma macro ? Essaie-la directement sur la feuille 2, pour voir.

Tu définis la zone de copie comme étant tableau
(sélectionner toutes tes valeurs, Insertion/nom/définir, Tableau)



Donc tu donnes un nom de champ à la zone.
1. Attention au nom tableau, assez passe-partout, à considérer comme mot
réservé ; import peut convenir il me semble
2. Y a-t-il autre chose sur la feuille ? Sinon il y a déjà un nom :
Worksheet.UsedRange

Tu crées une macro qui va recopier toutes les cellules de la feuille 2 sur
la feuille 1 en retirant le ", " de la fin
Pour cela
Outils/Macro/Visual basic editor
Tu insères un module
Insertion/module
Tu colles le code suivant dans ce module :

Option Explicit
Public Sub efface()
Dim C As Range, S As String
For Each C In ThisWorkbook.Sheets("feuil2").Range("Tableau")
S = C
If Right(S, 2) = ", " Then S = Left(S, Len(S) - 2)
ThisWorkbook.Sheets("feuil1").Cells(C.Row, C.Column) = S
Next
End Sub



Attention avec Right, il faut vérifier que la chaîne comporte bien
effectivement au moins deux caractères, sinon on se retrouve en erreur,
et ce n'est pas géré.


Il ne te reste plus qu'à lancer la sub :
Outils/macro/macros/efface

Bien entendu tu adaptes à ton cas avec tes noms de feuilles



Si tu veux faire quelque chose d'adaptable il y a la solution de mettre
en tête

Dim FeuilleSource as Worksheet, FeuilleCible As Worksheet

Set FeuilleSource = ThisWorkbook.Worksheets("Feuil2")
Set FeuilleCible = ThisWorkbook.Worksheets("Feuil1")

Comme ça si en cours de route apparaît le besoin d'avoir plusieurs
références à l'une de ces feuilles, l'adaptation n'a à se faire qu'une
fois, au début, bien facile à trouver.

Après ça donne
For Each C in FeuilleSource.Range("Tableau")

ce qui d'ailleurs correspond aussi à
For Each C in ThisWorkbook.Names("Tableau").RefersToRange
avec l'avantage qu'ainsi on ne risque pas de se tromper de feuille ;

cela étant ce sera peut-être aussi simple de parler de
FeuilleSource.UsedRange


Tout cela peut-être encore plus automatisé en supprimant la feuille 2 à la
fin de la sub.



Application.DisplayAlerts = False
'pour ne pas demander confirmation à l'utilisateur
ThisWorkbook.Worksheets("Feuil2").Delete
Application.DisplayAlerts = True

Mais alors pourquoi la créer ?
Avatar
Patrice Henrio
"Gloops" a écrit dans le message de news:
434d67ac$0$1013$
Patrice Henrio a écrit, le 12/10/2005 11:38 :

Tu copies tes valeur dans une feuille 2.



J'aimerais bien voir un exemple des données à la source, par exemple
l'exemple dont tu as donné la transposition "Hugo" puis "Mallarmé, Proust
et Raimbaud, ". Ces virgules m'intriguent.
Ce sont des données copiées d'ailleurs, non ? Un traitement de textes ?
Peut-être peut-on faire l'économie de la feuille 2.
As-tu essayé ma macro ? Essaie-la directement sur la feuille 2, pour voir.

Tu définis la zone de copie comme étant tableau
(sélectionner toutes tes valeurs, Insertion/nom/définir, Tableau)



Donc tu donnes un nom de champ à la zone.
1. Attention au nom tableau, assez passe-partout, à considérer comme mot
réservé ; import peut convenir il me semble
2. Y a-t-il autre chose sur la feuille ? Sinon il y a déjà un nom :
Worksheet.UsedRange

Tu crées une macro qui va recopier toutes les cellules de la feuille 2
sur la feuille 1 en retirant le ", " de la fin
Pour cela
Outils/Macro/Visual basic editor
Tu insères un module
Insertion/module
Tu colles le code suivant dans ce module :

Option Explicit
Public Sub efface()
Dim C As Range, S As String
For Each C In ThisWorkbook.Sheets("feuil2").Range("Tableau")
S = C
If Right(S, 2) = ", " Then S = Left(S, Len(S) - 2)
ThisWorkbook.Sheets("feuil1").Cells(C.Row, C.Column) = S
Next
End Sub



Attention avec Right, il faut vérifier que la chaîne comporte bien
effectivement au moins deux caractères, sinon on se retrouve en erreur, et
ce n'est pas géré.


Il ne te reste plus qu'à lancer la sub :
Outils/macro/macros/efface

Bien entendu tu adaptes à ton cas avec tes noms de feuilles



Si tu veux faire quelque chose d'adaptable il y a la solution de mettre en
tête

Dim FeuilleSource as Worksheet, FeuilleCible As Worksheet

Set FeuilleSource = ThisWorkbook.Worksheets("Feuil2")
Set FeuilleCible = ThisWorkbook.Worksheets("Feuil1")

Comme ça si en cours de route apparaît le besoin d'avoir plusieurs
références à l'une de ces feuilles, l'adaptation n'a à se faire qu'une
fois, au début, bien facile à trouver.

Après ça donne
For Each C in FeuilleSource.Range("Tableau")

ce qui d'ailleurs correspond aussi à
For Each C in ThisWorkbook.Names("Tableau").RefersToRange
avec l'avantage qu'ainsi on ne risque pas de se tromper de feuille ;

cela étant ce sera peut-être aussi simple de parler de
FeuilleSource.UsedRange


Tout cela peut-être encore plus automatisé en supprimant la feuille 2 à
la fin de la sub.



Application.DisplayAlerts = False
'pour ne pas demander confirmation à l'utilisateur
ThisWorkbook.Worksheets("Feuil2").Delete
Application.DisplayAlerts = True

Mais alors pourquoi la créer ?





Je cherchais à faire quelque chose de plus simple pour un débutant.
L'utilisation de la feuille2 est en phase de test pour vérifier à partir de
l'original si tout se passe comme on le voulait.
J'utilise régulièrement ce genre de chose pour éviter les catastrophes genre
"plantage et je n'ai pas sauvegardé ma base".
De toutes façons, il y a une infinité de façon de traiter ce problème qui ne
m'en parait pas un, ne serait-ce qu'avec les fonctions standard de Excel
sans passer par la programmation.
J'avais même imaginé, puisqu'il semblait que seul le côté inesthétique des
cellules contenant ", " choquait, d'utiliser un format conditionnel : si les
cellules contiennent le texte incriminé, on l'écrit en blanc (sur blanc).
Mais il est vrai que l'on n'en sait pas beaucoup sur le problème lui-même.
Et comme tu l'as dit à plusieurs reprises, il serait préférable de faire
tout le traitement lors de l'importation.
1 2