écraser ligne déjà existente par la nouvelle copiée macro xls
Le Pingou Messages postés 12361 Date d'inscription Statut Contributeur Dernière intervention -
Je vous explique mon problème:
Je copie certaine cellule de ma feuille nommée:"FTD".
Je l'ai copie dans une autre feuille intitulée:"HISTORIC"
Les données se copient à la première ligne vide.
Ce que je veux, c'est lors d'une nouvelle copie, Si les informations en colonne A et B sont identique, effacer la ligne en question et la remplacer par la nouvelle.
Voici ma macro de base:
Sub SAUVEGARDER()
Dim Source As String
Dim Cible As String
Source = "FTD"
Cible = "HISTORIC"
'Transfert données de la fiche ModFaxture vers la fiche Client
Dim LigneEncours As Long
'Chargement du nom des feuilles origine et destination
'Calcul de la ligne courante
LigneEncours = Worksheets(Cible).Range("A" & Rows.Count).End(xlUp).Row + 1
'Copie des valeurs
With Worksheets(Cible)
.Range("A" & LigneEncours) = Worksheets(Source).Range("A2").Value
.Range("B" & LigneEncours) = Worksheets(Source).Range("F2").Value
.Range("C" & LigneEncours) = Worksheets(Source).Range("E40").Value
.Range("D" & LigneEncours) = Worksheets(Source).Range("H40").Value
.Range("E" & LigneEncours) = Worksheets(Source).Range("I40").Value
.Range("F" & LigneEncours) = Worksheets(Source).Range("J40").Value
.Range("G" & LigneEncours) = Worksheets(Source).Range("K40").Value
End With
'
End Sub
Quelqu'un peut-il m'aider svp?
Merci d'avance.
- écraser ligne déjà existente par la nouvelle copiée macro xls
- Darkino nouvelle adresse - Guide
- Partager photos en ligne - Guide
- Telecharger macro convertir chiffre en lettre excel - Télécharger - Tableur
- Extreme download nouvelle adresse - Accueil - Outils
- Mètre en ligne - Guide
24 réponses
Le souci est de remplacer une ligne existante dans HISTORIC lorsque les valeurs copiées depuis FTD présentent les mêmes données en colonnes A et B, plutôt que d’ajouter une nouvelle ligne. Une solution préconisée consiste à parcourir les lignes déjà présentes dans la feuille cible et à comparer A et B avec les valeurs sources (A2 et F2); si une correspondance est trouvée, on retient le numéro de ligne correspondant. Ensuite, on écrase cette ligne avec les nouvelles valeurs (A2, F2, E40, H40, I40, J40, K40); sinon, on écrit sur la première ligne vide comme prévu. Le mécanisme s’appuie sur une boucle For pour déterminer l’indice de ligne à mettre à jour et sur l’utilisation du bloc With pour modifier les colonnes A à G.
Juste au passage, je comprends : Si les informations en colonne A et B sont identique aux valeurs sources A2 et F2 alors écraser la ligne...
Ceci impose de contrôler toutes les lignes existantes dans le fichier cible en réalisant une boucle sur les valeurs A et B.
Essayer avec ceci pour le bloc With...
With Worksheets(Cible)
For c = 2 To LigneEncours - 1
If (.Range("A" & c) = Worksheets(Source).Range("A2").Value And .Range("B" & c) = Worksheets(Source).Range("F2").Value) Then
liok = c
Exit For
End If
liok = c
Next c
.Range("A" & liok) = Worksheets(Source).Range("A2").Value
.Range("B" & liok) = Worksheets(Source).Range("F2").Value
.Range("C" & liok) = Worksheets(Source).Range("E40").Value
.Range("D" & liok) = Worksheets(Source).Range("H40").Value
.Range("E" & liok) = Worksheets(Source).Range("I40").Value
.Range("F" & liok) = Worksheets(Source).Range("J40").Value
.Range("G" & liok) = Worksheets(Source).Range("K40").Value
End With
Eh bien pour cela il faut savoir où est le classeur en question ainsi que la feuille concernée et si possible le nom du classeur.... !
Salutations.
Le Pingou
Ce que je veux c'est lors de l'enregistrement des données dans MC 02_2015, je veux que ces mêmes données s'enregistre dans FDT en même temps
Merci pour les informations.
Donc la feuille [HISTORIC] des 2 classeurs est rigoureusement identique concernant les données et la structure Oui / Non ?
Note, nous ne sommes pas dans le même bureau alors un petit bonjour c'est plus convenable ...
Petite confirmation le premier classeur est bien celui qui a les 2 feuilles [FDT] et [HISTORIC]
Merci de votre réponse.
En faite les deux classeur ont la même structure. Le maitre est FTD. Dedans jy rentre des données que je sauvegarde avec le nom du technicien et le mois. Cependant les infos sont rentrees semaine par semaine d'ou la necessite de faire une sauvegarde dans les deux documents. En effet FTD aura les donnée de tout les techniciens si modification à la semaine.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionMerci, une proposition demain en fin de journée.
J'ai réalisé un petit montage alors vos 2 exemples sont les bienvenu, les compresser en ZIP et le mettre sur https://www.cjoint.com/ et poster le lien
Ci joint le lien https://www.cjoint.com/c/EBqxYcK9pEZ
La macro b permet de faire la sauvegarde entre les feuilles FTD et HISTORIC des deux classeur.
Enfin une sauvegarde des donnée à la semaine est il possible à regarder?
Vraiment merci pour votre aide, c'est tellement rare de rencontrer des gens serviable
Merci pour le fichier. Une fois était suffisant, je suppose que c'est 2 fois le même.
Pour la prochaine, éviter d'insérer un point accoler au lien car il a tendance à si ajouter et ainsi le lien devient erroné...donc non valide.
Eh bien là, c'est désolant, je ne trouve pas trace de ma proposition concernant : Voici ma macro de base: Sub SAUVEGARDER() et en plus aucune macro de ce nom dans les 30 modules qui sont pratiquement vide.... !
J'ai pensé que vous me donneriez une explication par rapport à mon message de ce matin.
De plus impossible de faire quoi que ce soit avec des fichiers dont la majorité des feuilles sont masqués.
Salutations.
Le Pingou
C'est en ordre pour les feuilles masquées.
Par rapport au macro quasi vide ...
Je reprends :
je ne trouve pas trace de ma proposition concernant : Voici ma macro de base: Sub SAUVEGARDER() et en plus aucune macro de ce nom dans les 30 modules qui sont pratiquement vide.... !
1.- Je fais référence à ma proposition du message 1
2.- Selon : Voici ma macro de base: Sub SAUVEGARDER(), elle est introuvable dans les 30 modules dont seul 9 contiennent des procédures.
Pa simple de comprendre comment fonctionne votre application, cependant est-ce que ce serait correct selon fichier joint : https://www.cjoint.com/?3BsqCnqluI0
Merci pour ce fichier. Cependant ce que je veux dans la mesure du possible c'est un historic avec les numéro de semaine avec le mëme type de tableau que celui dans la feuille historic. Une sorte de recap hebdomaire genre en S6 il y'a 4 jour travaillé 2GD 1PR et ceux pour chaque technicien.
Cdt,
Ne serait-il pas plus simple de réaliser un petit exemple manuellement avec petit commentaire directement dessus et ensuite le mettre sur ci-joint.com.
Vous ne m'avez pas répondu à : ceci
Voici ce que je souhaite dans la feuille HISTORIC_SEMAINE https://www.cjoint.com/c/EBsszogI8qi
Beaucoup de module c'et vrai on était créé par rapport au tests que j'effectué.
J'espère que ce nouveau fichier vous aidera.
EN attente de vous lire.
Ma proposition traite les 2 feuilles [HISTO....] via le bouton [Mise à....] , le lien : https://www.cjoint.com/c/EBtrockPjd1
Merci infiniment pour ce petit bijoux que tu m'as fait. ce dernier fonctionne à la perfection!!!!!!
Une dernière chose, par technicien va se créer une FDT. Ces FDT sont sauvegardées dans C:\FDT\SALARIE\dossier du tech\fichier du tech.xlsm.
Si je viens modifier des valeurs sur ce fichier, je veux pouvoir les sauvegarder sur la FDT source...
Est ce possible?
Cdt,
Eh bien non, en faisant un test plus poussée, il se trouve que les montants en colonne [I] de la feuille [HISTORIC_SEMAINE] sont incorrects et en plus les valeurs de la dernière semaine de la feuille [FTD] sont simplement ignorées par la procédure (faute d'instruction de ma part).
Dans la journée la correction... !
Ton professionnalisme est très apprécié.
Dans la correction pourrais tu y incorporer SI CELA EST POSSIBLE la condition que si une modification s'effectue sur un classeur nommé avec le nom de n'importe quelle technicien celle ci soit prise en compte dans le classeur source FDT?
EN TE REMERCIANT.
CDT,
Voici la version corrigée : https://www.cjoint.com/?3BupXPNCGWS
Pour la condition peux ton la traduite sous une forme de macro supplémentaire?
De plus serait faire une macro permettant d'une part d'ouvrir une feuille depuis m'importe qu'elle autre feuille. Et enfin une macro supprimant les valeur d'une ligne de n'importe quelle feuille?
En attente de te lire.
Cdt,
Pour la condition peux ton la traduite sous une forme de macro supplémentaire?
C'est incompréhensible.
De plus serait faire une macro permettant d'une part d'ouvrir une feuille depuis m'importe qu'elle autre feuille.
Pas besoin de macro, Il suffit d'insérer un lien hypertexte qui ponte vers la feuille choisi
Et enfin une macro supprimant les valeurs d'une ligne de n'importe quelle feuille?
Cela on le réalise sans macro en sélectionnant la plage des valeurs et ensuite Delete
Lors de l'exécution de la macro sauvegarde dans une FDT TECH à la fin demander avant de quitter d'exécuter cette macro.
Cdt
Il serait bien que vous décriviez le travail que vous devez réaliser, ou le concept de l'application car là il me semble que c'est du coup par coup... ou je me trompe.
Partons d'une feuille FTD vièrge. A la fin de la première semaine, une création d'une FDT par technicien est faite avec l'enregistrement des données de facon hebdomadaire et mensuel. Lors de la deuxième semaine la FDT est remplie via celle déjà créé et non de la FDT source. le HIc c'est que l'historique générale se trouve dans la FDT source, d'où l'importance de créer une macro me permettant de sauvegarder les données modifiées sur les FDT techniciens vers la FDT source.
Sinon tout le reste est ok.
Cdt,
Merci pour l'explication.
Dans ce cas vous faite le chemin inverse soit du fichier technicien vers l'historique du fichier source en utilisant ma proposition, il faut juste attribuer les bonnes références aux 3 objets [Worhsheet].
En parcourant les divers codes et leur niveau d'écriture dans les modules, j'estime que ce doit être faisable par vos soins.
La procédure de préférence dans le fichier technicien.
Suite à ta réponse d'hier, j'ai fait une petit modification sur la macro et ceci m'indique toujours une erreur.
Voila ce que j'ai fait:
Sub Renseigner_HISTORIC_global_semaine1()
Dim shso As Worksheets
Dim shcigl
Dim c As Integer, deli As Integer, li As Integer, liok As Integer
Dim chemin$, Salarie$, Fichier$
chemin = "C:\FDT\SALARIE\"
client = Sheets("FTD").Range("A2").Value
Fichier = client & " " & Format(Sheets("FTD").Range("F2"), "MM_YYYY")
Const coefGr = 84: Const coefPR = 18
Workbooks.Open FileName:=("C:\FDT\FDT.xlsm")
Set shso = "chemin" & "Fichier" & Sheets("FTD")
shcigl = Workbooks("FDT").Sheets("HISTORIC")
If shso.Range("H40") = "0" Then
MsgBox "Pas de code projet, donc de jour(s) travaillé(s)/de Client et de projet!", vbCritical: Exit Sub
ElseIf shso.Range("A2") = "" Then
MsgBox "Aucun Nom de Salarié en Cellule A2!", vbCritical: Exit Sub
End If
' *** copier les valeurs ou mise à jour des valeurs existantes
With shcigl
deli = .Cells(Rows.Count, 1).End(xlUp).Row
If deli > 5 Then
For c = 6 To deli
If (.Range("A" & c) = shso.Range("A2").Value And .Range("B" & c) = shso.Range("F2").Value) Then
liok = c
Exit For
End If
liok = c + 1
Next c
Else
liok = deli + 1
End If
.Range("A" & liok) = shso.Range("A2").Value
.Range("B" & liok) = shso.Range("F2").Value
.Range("C" & liok) = shso.Range("E40").Value
.Range("D" & liok) = shso.Range("H40").Value
.Range("E" & liok) = shso.Range("I40").Value
.Range("F" & liok) = shso.Range("J40").Value
.Range("G" & liok) = shso.Range("K40").Value
.Range("H" & liok) = (shso.Range("J40").Value * coefGr) + (shso.Range("K40").Value * coefPR)
.Range("I" & liok) = .Range("C" & liok) + .Range("H" & liok)
End With
Renseigner_HISTORIC_semaine shso, coefGr, coefPR
Set shso = Nothing
Set shcigl = Nothing
End Sub
Sub Renseigner_HISTORIC_semaine(shso, coefGr, coefPR)
Dim shcism
Dim tbl(1 To 10) As Variant, ccu As Variant
Dim c As Integer, deli As Integer, li As Integer, liok As Integer
Dim smc As Integer, smde As Integer, sm As Integer
Dim fism As Boolean
shcism = worbooks("FDT").Sheets("HISTORIC_SEMAINE")
' *** cumuler et copier les valeurs ou mise à jour des valeurs existantes
smde = Application.Min(shso.Range("c9:c39"))
ccu = Array(0, 5, 8, 9, 10, 11)
smc = smde: fism = False
For li = 9 To 39
If shso.Cells(li + 1, 3).Value <> smc Then fism = True
For c = 1 To 5
tbl(c + 3) = tbl(c + 3) + shso.Cells(li, ccu(c))
Next c
tbl(9) = (tbl(7) * coefGr) + (tbl(8) * coefPR)
tbl(10) = tbl(4) + tbl(9)
If fism Then
If tbl(5) <> 0 Then
tbl(1) = shso.Range("A2").Value
tbl(2) = shso.Range("F2").Value
tbl(3) = smc
With shcism
deli = .Cells(Rows.Count, 1).End(xlUp).Row
If deli > 5 Then
For c = 6 To deli
If (.Range("A" & c) = tbl(1) And .Range("B" & c) = tbl(2) And .Range("C" & c) = tbl(3)) Then
liok = c
Exit For
End If
liok = c + 1
Next c
Else
liok = deli + 1
End If
shcism.Range("A" & liok).Resize(1, UBound(tbl)) = tbl
End With
End If
Erase tbl
smc = smc + 1: fism = False
End If
Next li
MsgBox " Les 2 feuilles [HISTORIQUE MENSUEL/SEMAINE] sont à jour!"
Set shcism = Nothing
End Sub
Sans le message d'erreur, impossible de vous répondre.
Avez-vous mis la procédure dans le classeur technicien Oui / Non ?
Salutations.
Le Pingou
Oui la procédure a été mise dans le classeur technicien.
Vous trouverez en pièce jointe les deux imprimes avec le message d'erreur et la ligne qui pose problème.
https://www.cjoint.com/c/EBvsi0qPMzU
Cdt,
Eh bien c'est normal, comme la procédure est dans le classeur technicien qui est la source des données, sa référence est simplement la feuille de ce classeur soit : Sheets("FTD").
Par contre la cible est le classeur [FDT.xlsm] qui se trouve dans le répertoire et là c'est correct avec [Workbooks("FDT").Sheets("HISTORIC")] par contre la ligne de code doit être [Set shcigl = Workbooks("FDT").Sheets("HISTORIC")] .
Autre point : les noms des variables dans la ligne de définition [Dim chemin$, Salarie$, Fichier$] doivent être identique dans la procédure et ce n'est pas le cas, par exemple [chemin$] différent de [chemin].
Pour finir je me pose une question, si vous avez dans le classeur technicien 2 feuille [Histo...] alors vous devez aussi les mettre à jour tout comme celles du classeur [FDT.xlsm] Oui ou Non ?
Si Oui alors le réaliser dans la même procédure !
J'ai suivi votre facon de faire. Problème: Bon déjà j'ai enlevé mes variables Fichier, client et chemin car elle ne me servait plus à rien. Cependant quand j'éxécute la macro il me dit que la ligne Set shso = sheets("FTD") est incompatibility et la surligne en jaune.
Sub Renseigner_HISTORIC_global_semaine1()
Dim shso As Worksheets
Dim shcigl As Worksheets
Dim c As Integer, deli As Integer, li As Integer, liok As Integer
Const coefGr = 84: Const coefPR = 18
Set shso = Sheets("FTD")
Set shcigl = Workbooks("FDT").Sheets("HISTORIC")
If shso.Range("H40") = "0" Then
MsgBox "Pas de code projet, donc de jour(s) travaillé(s)/de Client et de projet!", vbCritical: Exit Sub
ElseIf shso.Range("A2") = "" Then
MsgBox "Aucun Nom de Salarié en Cellule A2!", vbCritical: Exit Sub
End If
' *** copier les valeurs ou mise à jour des valeurs existantes
With shcigl
deli = .Cells(Rows.Count, 1).End(xlUp).Row
If deli > 5 Then
For c = 6 To deli
If (.Range("A" & c) = shso.Range("A2").Value And .Range("B" & c) = shso.Range("F2").Value) Then
liok = c
Exit For
End If
liok = c + 1
Next c
Else
liok = deli + 1
End If
.Range("A" & liok) = shso.Range("A2").Value
.Range("B" & liok) = shso.Range("F2").Value
.Range("C" & liok) = shso.Range("E40").Value
.Range("D" & liok) = shso.Range("H40").Value
.Range("E" & liok) = shso.Range("I40").Value
.Range("F" & liok) = shso.Range("J40").Value
.Range("G" & liok) = shso.Range("K40").Value
.Range("H" & liok) = (shso.Range("J40").Value * coefGr) + (shso.Range("K40").Value * coefPR)
.Range("I" & liok) = .Range("C" & liok) + .Range("H" & liok)
End With
Renseigner_HISTORIC_semaine shso, coefGr, coefPR
Set shso = Nothing
Set shcigl = Nothing
End Sub
Sub Renseigner_HISTORIC_semaine1(shso, coefGr, coefPR)
Dim shcism
Dim tbl(1 To 10) As Variant, ccu As Variant
Dim c As Integer, deli As Integer, li As Integer, liok As Integer
Dim smc As Integer, smde As Integer, sm As Integer
Dim fism As Boolean
Set shcism = worbooks("FDT").Sheets("HISTORIC_SEMAINE")
' *** cumuler et copier les valeurs ou mise à jour des valeurs existantes
smde = Application.Min(shso.Range("c9:c39"))
ccu = Array(0, 5, 8, 9, 10, 11)
smc = smde: fism = False
For li = 9 To 39
If shso.Cells(li + 1, 3).Value <> smc Then fism = True
For c = 1 To 5
tbl(c + 3) = tbl(c + 3) + shso.Cells(li, ccu(c))
Next c
tbl(9) = (tbl(7) * coefGr) + (tbl(8) * coefPR)
tbl(10) = tbl(4) + tbl(9)
If fism Then
If tbl(5) <> 0 Then
tbl(1) = shso.Range("A2").Value
tbl(2) = shso.Range("F2").Value
tbl(3) = smc
With shcism
deli = .Cells(Rows.Count, 1).End(xlUp).Row
If deli > 5 Then
For c = 6 To deli
If (.Range("A" & c) = tbl(1) And .Range("B" & c) = tbl(2) And .Range("C" & c) = tbl(3)) Then
liok = c
Exit For
End If
liok = c + 1
Next c
Else
liok = deli + 1
End If
shcism.Range("A" & liok).Resize(1, UBound(tbl)) = tbl
End With
End If
Erase tbl
smc = smc + 1: fism = False
End If
Next li
MsgBox " Les 2 feuilles [HISTORIQUE MENSUEL/SEMAINE] sont à jour!"
Set shcism = Nothing
End Sub