OVH Cloud OVH Cloud

copie incrémentielle d'une cellule contenant une fonction

24 réponses
Avatar
Elie Chayo
Bonsoir,
Pour =C3=A9liminer des caract=C3=A8res sp=C3=A9ciaux d'une cellule "1 127,6=
2 =C3=A2=E2=80=9A=C2=AC ", j'ai essay=C3=A9 "rechercher/remplacer" mais les=
chiffres affich=C3=A9s sont faux souvent multipli=C3=A9s par 1000.
J'ai pens=C3=A9 =C3=A0 utiliser la fonction gauche en copiant la 1ere cellu=
le de la colonne contenant ces signes sur une autre colonne, puis de faire =
copie incr=C3=A9mentielle de la formule. La manoeuvre manuelle r=C3=A9ussit=
parfaitement. mais traduit dans une macro:

"'copier la cellule H6 sans les signes puis copie incr=C3=A9mentielle
Range("O6").Select
ActiveCell.FormulaR1C1 =3D "=3DLEFT(RC[-7],LEN(RC[-7])-4)"
Range("O6").Select
Selection.AutoFill Destination:=3DRange("O6:60"), Type:=3DxlFillDefa=
ult

J'ai d=C3=A9clanch=C3=A9 une macro pour cette fonction et j'ai les m=C3=AAm=
es lignes. Le lancement de la macro bloque sur la derni=C3=A8re ligne et le=
d=C3=A9bogage indique:
"la m=C3=A9thode "Range" de l'objet'_Global' a =C3=A9chou=C3=A9"
Pouvez-vous me dire ce qui ne marche pas.
Eventuellement que pensez-vous d'une boucle pour copier avec cette m=C3=AAm=
e fonction les cellules successivement?
Merci

10 réponses

1 2 3
Avatar
Elie Chayo
Le mercredi 19 avril 2017 13:35:13 UTC+3, MichD a écrit :
Si à la fin de la procédure, tu désires copier le rés ultat de la colonne O vers la colonne H,
il manque une ligne de code...
Regarde la dernière ligne de la procédure!
'--------------------------------------------------------------
Sub test1()
Dim Rg As Range, DerLig As Long
'Rg est une variable "OBJECT" de type RANGE.
With ActiveSheet
'Détermine la dernière ligne occupée de la colonne H
'la colonne H contient les données
DerLig = .Range("h" & .Rows.Count).End(xlUp).Row
'Détermine la plage à traiter
Set Rg = .Range("o6:o" & DerLig)
End With
'D'un seul coup copie la formule sur toute la plage
With Rg
.Formula = "=LEFT(" & Rg(1).Offset(, -7).Address(0, 0) & _
"," & Len(Rg(1).Offset(, -7).Value) - 4 & ")"
'Remplace les formules par la valeur seulement
.Value = .Value
.Cut Rg.Offset(, -7) '<<<<======= Ligne ajoutée
End With
End Sub
'--------------------------------------------------------------
MichD

Toujours là! Je suis presque gêné!
La dernière macro a bloqué; Regarde
http://www.cjoint.com/c/GDtkzgIZbaC
Avatar
MichD
La formule s'écrit sur une seule ligne, mais comme cette dernière est longue, le service de
messagerie l'a transposée sur 2 lignes. Tu dois la remettre sur une seule ligne dans Excel où
utiliser cette syntaxe.
.Formula = "=LEFT(" & Rg(1).Offset(, -7).Address(0, 0) & _
"," & Len(Rg(1).Offset(, -7).Value) - 4 & ")"
MichD
Avatar
Elie Chayo
Le mercredi 19 avril 2017 13:58:10 UTC+3, MichD a écrit :
La formule s'écrit sur une seule ligne, mais comme cette derniè re est longue, le service de
messagerie l'a transposée sur 2 lignes. Tu dois la remettre sur une seule ligne dans Excel où
utiliser cette syntaxe.
.Formula = "=LEFT(" & Rg(1).Offset(, -7).Address(0, 0) & _
"," & Len(Rg(1).Offset(, -7).Value) - 4 & ")"
MichD

Bonsoir MichD,
Maintenant cela fonctionne bien. J'ai supprimé des lignes que j'avais qui empéchaient la fin de la macro.
Je vais maintenant transposer les lettres pour avoir le même résu ltat pour les colonnes I et K . Tu as résolu le problème de la tr anscription erronée des chiffres.
Idem pour appliquer aux 2 autres feuilles en changeant le nom de la feuille . Et enfin copier/coller toutes les données des 2 dernières feuil les sur la fenêtre résultat que j'ai ouvert en premier.
Merci d'avoir accepté de m'aider de nouveau; si je n'y arrive pas, je sais à qui m'adresser.
Avatar
MichD
Bonjour,
Voici le bout de macro qui te permet de traiter les 3 colonnes "H", "i", "J". de la feuille
active (celle qui est à l'écran).
'-----------------------------------------------------------------
Sub test1()
Dim Rg As Range, DerLig As Long
Dim Elt As Variant, Col(), X As Long
'Rg est une variable "OBJECT" de type RANGE.
'Variable de type tableau contenant les 3 colonnes à traiter.
'Tu peux mettre toutes les colonnes que tu veux. Attention, si les
'Colonnes ne sont pas adjacentes, il faudra adapter la valeur de
'la variable X dans la formule "oFFSET" plus bas.
Col = Array("H", "i", "J")
'pour chaque colonne contenu dans le tableau "Col
For Each Elt In Col
With ActiveSheet
'Détermine la dernière ligne occupée de la colonne H
'la colonne H contient les données
DerLig = .Cells(.Rows.Count, Elt).End(xlUp).Row
'Détermine la plage à traiter
'La lettre "o" est la colonne où se retrouve temporairement les
'données suite à la l'utilisation de la formule.
'La même colonne est utilisée pour les 3 colonnes à traiter
'puisque la macro s'applique à une colonne à la fois.
Set Rg = .Range(.Cells(6, "o"), .Cells(DerLig, "o"))
End With
'D'un seul coup copie la formule sur toute la plage
With Rg
.Formula = "=LEFT(" & Rg(1).Offset(, -7 + X).Address(0, 0) & _
"," & Len(Rg(1).Offset(, -7 + X).Value) - 4 & ")"
'Remplace les formules par la valeur seulement
.Value = .Value
.Cut Rg.Offset(, -7 + X)
End With
X = X + 1
Next
End Sub
'-----------------------------------------------------------------
MichD
Avatar
MichD
Pourquoi se compliquer la vie quand on peut faire simple :
La macro pour la feuille Camille :
'-------------------------------------------------------
Sub Mise_En_Page_Feuille_Camille()
Application.ScreenUpdating = False
With ActiveSheet
With .Range("G:I")
.Replace " €", "", xlPart
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace ",", ".", xlPart
.NumberFormat = "# ### ##0.00 €"
End With
With .Range("J:J")
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace "(", "", xlPart
.Replace ")", "", xlPart
.Replace ",", ".", xlPart
End With
With .Range("F:F")
.Replace ",", ".", xlPart
End With
.Range("C:F").Delete
.Range("B5") = "SRD"
.Range("A:B").EntireColumn.AutoFit
End With
Application.ScreenUpdating = False
End Sub
'-------------------------------------------------------
Ton fichier avec la macro dans le module1
http://www.cjoint.com/c/GDuxMqmRWzi
MichD
Avatar
Elie Chayo
Le vendredi 21 avril 2017 02:39:24 UTC+3, MichD a écrit :
Pourquoi se compliquer la vie quand on peut faire simple :
La macro pour la feuille Camille :
'-------------------------------------------------------
Sub Mise_En_Page_Feuille_Camille()
Application.ScreenUpdating = False
With ActiveSheet
With .Range("G:I")
.Replace " €", "", xlPart
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace ",", ".", xlPart
.NumberFormat = "# ### ##0.00 €"
End With
With .Range("J:J")
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace "(", "", xlPart
.Replace ")", "", xlPart
.Replace ",", ".", xlPart
End With
With .Range("F:F")
.Replace ",", ".", xlPart
End With
.Range("C:F").Delete
.Range("B5") = "SRD"
.Range("A:B").EntireColumn.AutoFit
End With
Application.ScreenUpdating = False
End Sub
'-------------------------------------------------------
Ton fichier avec la macro dans le module1
http://www.cjoint.com/c/GDuxMqmRWzi
MichD

Bonjour MichD,
Alors tu as fait fort! En si peu de lignes, avoir le résultat.
Je regrettais de ne pas avoir continué il y a 15 ans la pratique du VB A, et pensais m'y remettre pour faire travailler le cerveau, mais là j e crois que je vais abandonner cette idée.
Je vais appliquer cette même macro aux 3 autres feuilles et les concat éner
Merci mille fois
Avatar
MichD
Je viens de m'apercevoir que la macro fait disparaître la colonne "Quantité" suite à une
inattention. Voici la correction.
Comme le format semble similaire à la procédure que j'avais faite pour l'autre fichier que tu
avais soumis, la procédure servant à la compilation devrait fonctionner sur cette feuille.
Évidemment, cette feuille doit être dans le même classeur que le précédent. (copier-coller)
'----------------------------------------------------------
Sub Mise_En_Page_Feuille_Camille()
Application.ScreenUpdating = False
With ActiveSheet
With .Range("G:I")
.Replace " €", "", xlPart
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace ",", ".", xlPart
.NumberFormat = "# ### ##0.00 €"
End With
With .Range("J:J")
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace "(", "", xlPart
.Replace ")", "", xlPart
.Replace ",", ".", xlPart
End With
With .Range("F:F")
.Replace ",", ".", xlPart
End With
.Range("C:E").Delete
.Range("B5") = "SRD"
.Range("A:B").EntireColumn.AutoFit
End With
Application.ScreenUpdating = True
End Sub
'----------------------------------------------------------
MichD
Avatar
Elie Chayo
Le vendredi 21 avril 2017 14:01:57 UTC+3, MichD a écrit :
Je viens de m'apercevoir que la macro fait disparaître la colonne "Q uantité" suite à une
inattention. Voici la correction.
Comme le format semble similaire à la procédure que j'avais fai te pour l'autre fichier que tu
avais soumis, la procédure servant à la compilation devrait fon ctionner sur cette feuille.
Évidemment, cette feuille doit être dans le même classeur que le précédent. (copier-coller)
'----------------------------------------------------------
Sub Mise_En_Page_Feuille_Camille()
Application.ScreenUpdating = False
With ActiveSheet
With .Range("G:I")
.Replace " €", "", xlPart
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace ",", ".", xlPart
.NumberFormat = "# ### ##0.00 €"
End With
With .Range("J:J")
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace "(", "", xlPart
.Replace ")", "", xlPart
.Replace ",", ".", xlPart
End With
With .Range("F:F")
.Replace ",", ".", xlPart
End With
.Range("C:E").Delete
.Range("B5") = "SRD"
.Range("A:B").EntireColumn.AutoFit
End With
Application.ScreenUpdating = True
End Sub
'----------------------------------------------------------
MichD

Bonjour MichD,
Je suis content que tu m'aies relancé car je n'ai plus osé t'en p arler.
Le fichier que tu m'as envoyé avec la macro fonctionnait à mervei lle; J'ai voulu d'abord lancer le début de macro pour ouvrir le classe ur résultat et y déplacer les 3 feuilles. Puis appliquer le bout de macro en le rajoutant à la suite; en la lançant le résult at n'était pas celui attendu; une colonne a disâru et les signes ne sont pas disparus.Je me suis dit que j'allais appliquer le bout de macro uniquement aux 2 autres feuilles séparément; cela ne marche pas. et je revenais en ce moment pour reprendre le fichier et la macro et bien vérifier la structure de Camille par rapport aux 2 autres. Je vois ton message.
J'ai pris beaucoup de ton temps et en suis conscient. Moi-même qui sui s en déplacement au Proche Orient pendant encore 3 semaines, j'attenda is avec impatience l'ouverture des sessions de déclarations fiscales l e 12 avril pour commencer, puisque je fais certaines comptabilités. Et voilà que 10 jours sont passés, et je m'acharne à trouver.
je vais essayer ton bout de macro. Sinon, je vais me déclarer incomp étent et finir manuellement. Je ne m'en sers qu'une fois par mois et c 'est par esprit de recherche que je voulais y arriver.
Merci encore. quelque soit le résultat, je reviens dire ce qui en est.
Avatar
Elie Chayo
Le dimanche 23 avril 2017 17:37:00 UTC+3, Elie Chayo a écrit :
Le samedi 22 avril 2017 13:13:46 UTC+3, Elie Chayo a écrit :
Le vendredi 21 avril 2017 14:01:57 UTC+3, MichD a écrit :
> Je viens de m'apercevoir que la macro fait disparaître la colonn e "Quantité" suite à une
> inattention. Voici la correction.
>
> Comme le format semble similaire à la procédure que j'avais faite pour l'autre fichier que tu
> avais soumis, la procédure servant à la compilation devrait fonctionner sur cette feuille.
> Évidemment, cette feuille doit être dans le même class eur que le précédent. (copier-coller)
>
> '----------------------------------------------------------
> Sub Mise_En_Page_Feuille_Camille()
> Application.ScreenUpdating = False
> With ActiveSheet
> With .Range("G:I")
> .Replace " €", "", xlPart
> .Replace " ", "", xlPart
> .Replace "+", "", xlPart
> .Replace ",", ".", xlPart
> .NumberFormat = "# ### ##0.00 €"
> End With
> With .Range("J:J")
> .Replace " ", "", xlPart
> .Replace "+", "", xlPart
> .Replace "(", "", xlPart
> .Replace ")", "", xlPart
> .Replace ",", ".", xlPart
> End With
> With .Range("F:F")
> .Replace ",", ".", xlPart
> End With
> .Range("C:E").Delete
> .Range("B5") = "SRD"
> .Range("A:B").EntireColumn.AutoFit
> End With
> Application.ScreenUpdating = True
> End Sub
> '----------------------------------------------------------
>
> MichD
Bonjour MichD,
Je suis content que tu m'aies relancé car je n'ai plus osé t' en parler.
Le fichier que tu m'as envoyé avec la macro fonctionnait à me rveille; J'ai voulu d'abord lancer le début de macro pour ouvrir le cl asseur résultat et y déplacer les 3 feuilles. Puis appliquer le b out de macro en le rajoutant à la suite; en la lançant le ré sultat n'était pas celui attendu; une colonne a disâru et les sig nes ne sont pas disparus.Je me suis dit que j'allais appliquer le bout de m acro uniquement aux 2 autres feuilles séparément; cela ne marche pas. et je revenais en ce moment pour reprendre le fichier et la macro et b ien vérifier la structure de Camille par rapport aux 2 autres. Je vois ton message.
J'ai pris beaucoup de ton temps et en suis conscient. Moi-même qui suis en déplacement au Proche Orient pendant encore 3 semaines, j'att endais avec impatience l'ouverture des sessions de déclarations fiscal es le 12 avril pour commencer, puisque je fais certaines comptabilités . Et voilà que 10 jours sont passés, et je m'acharne à trouv er.
je vais essayer ton bout de macro. Sinon, je vais me déclarer inco mpétent et finir manuellement. Je ne m'en sers qu'une fois par mois et c'est par esprit de recherche que je voulais y arriver.
Merci encore. quelque soit le résultat, je reviens dire ce qui en est.

Bonjour,
je viens dire où j'en suis. Pas encore le miracle. Je me suis aper çu que la feuille que tu avais traitée après mon envoi, n'av ait pas la même structure que celles que j'avais pour les autres noms. J'avais supprimé 2 colonnes car avec les précédentes macros , les colonnes devaient être adjacentes.J'ai donc
-enregistré les fichier csv en xls
-appliqué cette macro (la tienne) à laquelle j'ai rajouté quelques lignes au début:
__________________________________________________________________
Sub Mise_En_Page_Feuille()
'
Windows("camille.xls").Activate
Sheets("camille").Select
Range("J4").Select
Selection.Cut
Range("H4").Select
ActiveSheet.Paste
Range("G:G,J:J").Select
Range("J1").Activate
Selection.Delete Shift:=xlToLeft
'
Application.ScreenUpdating = False
With ActiveSheet
With .Range("G:I")
.Replace " €", "", xlPart
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace ",", ".", xlPart
.NumberFormat = "# ### ##0.00 €"
End With
With .Range("J:J")
.Replace " ", "", xlPart
.Replace "+", "", xlPart
.Replace "(", "", xlPart
.Replace ")", "", xlPart
.Replace ",", ".", xlPart
End With
With .Range("F:F")
.Replace ",", ".", xlPart
End With
.Range("C:E").Delete
.Range("B5") = "SRD"
.Range("A:B").EntireColumn.AutoFit
End With
Application.ScreenUpdating = True
End Sub
_________________________________________________________________________ ______
Cela fonctionne individuellement car je voulais regrouper de suite les fe uilles sous un classeur "résultat" puis y modifier chacune mais cela n 'a pas marché.
je vais donc auparavant ouvrir les classeurs et les feuilles reçues avec ce bout de macro "Demarrage"
______________________________________
Sub demarrage()
' ouverture des fichiers
ChDir "D:Mes documentsBourse"
Workbooks.Open Filename:= _
"D:Mes documentsBourseresultat.xls"
ChDir "C:usersElichaDesktopessai macro"
Workbooks.Open Filename:= _
"C:usersElichaDesktopessai macrocamille.xls"
ChDir "C:usersElichaDesktopessai macro"
Workbooks.Open Filename:= _
"C:usersElichaDesktopessai macroelie.xls"
ChDir "C:usersElichaDesktopessai macro"
Workbooks.Open Filename:= _
"C:usersElichaDesktopessai macroepoux.xls"
End Sub
___________________________________________________
ensuite modifier ces feuilles avec la macro du dessus (la tienne)
et enfin déplacer chaque feuille avec ceci
____________________________________
'Déplacer les 3 en dernier sur résultat.xls
Windows("elie.xls").Activate
Sheets("elie").Select
Sheets("elie").Move After:=Workbooks("Resultat.xls").Sheets(1)
Windows("camille.xls").Activate
Sheets("camille").Select
Sheets("camille").Move After:=Workbooks("Resultat.xls").Sheets(2)
Windows("epoux.xls").Activate
Sheets("epoux").Select
Sheets("epoux").Move After:=Workbooks("Resultat.xls").Sheets(3)
____________________________________________________
est-ce que cela te parait correct?
Bonne fin de dimanche

je viens de tester dans l'ordre:
1/ macro "Demarrage"
2/ macros "mise en page'; il y en a 3, une pour chaque feuille (seule les 2 premières lignes changent
3/ macro "deplacer"
j'obtiens un classeur avec les 3 feuilles.
Cela fait beaucoup de manip mais le résuktat est là.
je vais embellir la présentation des feuilles avant de les déplac er.
Avatar
MichD
Désolé, mais sans fichier, je ne peux pas voir où tu es rendu...
Ce qui est simple,
A ) place toutes les feuilles dont tu as besoin dans le même classeur.
Pour ce faire, ouvre tous les classeurs où sont tes données.
À tour de rôle, fais un clic droit sur chacun des onglets des feuilles.
Choisis la commande "Déplacer ou copier"
Dans la fenêtre ouvrante,
1 - dans la liste déroulante, choisis le classeur où tu veux copier la feuille
2- dans le bas de la fenêtre, coche l'option "créer une copie"
3- un clic sur OK
Tu répètes cela pour chacune des feuilles à copier.
B ) Lorsque toutes les feuilles ont été réunies dans le même classeur,
Je suppose qu'elles ont la même disposition, utilise la macro que j'ai
faite, dans le premier classeur que tu as publié.
C ) TU DOIS MANUELLEMENT INSÉRER UNE FEUILLE VIDE À L'EXTRÊME DROITE
DANS LE CLASSEUR. C'est sur cette feuille que les données seront compilées.
D ) Lance la macro suivante pour que toutes les données se retrouvent sur la même feuille.
'-----------------------------------------------------------
Sub Copier_Les_Feuilles_Sur_Une_Feuille_Compilation()
Dim Sh As Worksheet, DerLig As Long, Dest As Worksheet
Dim Total As Double, LastRow As Long
Set Sh = Sheets(Sheets.Count)
For Each F In ActiveWindow.SelectedSheets
With F
If Sh.Range("A1") = "" Then
.UsedRange.Copy Sh.Range("A1")
Sh.Range("i1") = ""
Else
DerLig = Sh.Cells.Find("*", LookIn:=xlFormulas, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row + 2
.UsedRange.Copy Sh.Range("A" & DerLig)
Sh.Range("i" & DerLig) = ""
End If
End With
Next
With Sh
DerLig = .Cells.Find("*", LookIn:=xlFormulas, _
SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
With .Range("i1")
.Value = "Total : " & Format(Evaluate("=sum(" & Sh.Name & "!" & Sh.Range("i2:i" &
DerLig).Address(0, 0) & ")"), "# ### ##0.00 €")
.NumberFormat = "# ### ##0.00 €"
.Font.Bold = True
.Font.Size = 18
.EntireColumn.AutoFit
End With
.Range("J:J").EntireColumn.AutoFit
.Range("A:B").EntireColumn.AutoFit
.Range("I:I").EntireColumn.AutoFit
.Range("C:F").ColumnWidth = 14
End With
End Sub
'-----------------------------------------------------------
MichD
1 2 3