Macro excel rechercher et remplacer une ligne [Résolu]

Signaler
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
-
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
-
Bonjour,

Besoin d'un petit coup de main malgré mes recherche sur les forum.
Je ne comprends pas pourquoi mon code ne fonctionne pas.... alors je vais essayer d'expliquer au mieux mais je suis novice en la matière.

Fonctionnement du code:
Soit il crée une ligne sur la feuille "SuiviClient" avec le nom de l'onglet de la feuille active
Soit il recherche et modifie la ligne si le nom de l'onglet existe

Problemes:
1/Il ne trouve pas le nom de l'onglet s'il existe et ne le modifie pas
2/Il remplace la ligne existante par une autre ligne avec un nom d'onglet différent au lieu de passer sur la ligne suivante (Row + 1)


Je ne suis pas sur d'etre bien clair alors je mets le bout du code

Merci pour votre aide


Set WsDestination = Sheets("SuiviClient")
Set WsDepart = ActiveSheet

NomOnglet = ActiveSheet.Range("G3").Value & ActiveSheet.Range("I3").Value

nomcherche = NomOnglet


Sheets("SuiviClient").Activate

With ActiveSheet.Range("B3:B20")
Set cellule = .Find(nomcherche, LookIn:=xlValues)
If Not cellule Is Nothing Then cellule.ClearContents
'Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select
ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

Set C = Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then
Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select

'MsgBox "on créé la ligne"
ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

Else

'Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 0).Select

'ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
'ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
'ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
'ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
'ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
'ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
'ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
'ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

End If

Set C = Nothing
End With
Activer:
shAct.Select

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub


Configuration: Windows / Chrome 80.0.3987.122

11 réponses

Messages postés
28085
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 avril 2020
2 243
Bonjour,

A l'avenir, merci d'Ajouter le langage dans les balises de code pour avoir la coloration syntaxique .
Explications disponibles ici : https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

Tu dis

mon code recherche une ligne sur une autre feuille

mais.. tu fais ta recherche sur ActiveSheet.. donc sur la feuille courante...

Au cas où, voici un exemple d'utilisation de find :
https://www.commentcamarche.net/faq/36886-fonction-find-dans-vba-recherche-de-donnees-sous-excel


Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
Bonjour,

Merci de votre réponse et je vais remettre le code avec coloration et j'ai fait le trie....
Je ne comprends toujours ou est l'erreur.

Effectivement, j'utilise ActiveSheet pour utiliser la feuille courante mais ma macro travaille sur l'autre feuille......

Mais avec ce code, j'ai l'impression qu'il trouve la ligne et qu'il créé une nouvelle ligne en dessous de la ligne trouver!!! du coup cela efface la ligne du dessous alors que je ne veux pas....peux etre ca qui cloche?



Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select




J'aurais besoin que le code recherche une ligne et si elle la trouve elle remplace cette ligne et si elle ne le trouve pas elle cree une nouvelle ligne mais sur la dernière ligne trouvé et pas sur la ligne juste dessous.

Merci pour votre aide, c 'est tres sympa

Sub Rectangle28_Cliquer()
On Error Resume Next
Dim shAct As Worksheet
Set shAct = ActiveSheet
Dim C As Range
Dim NomFeuil As String, NexistePas As Boolean, Caractere As String
Dim Code As String
Dim Objet As OLEObject
Dim X As String
Dim NextLine As Long
Dim WsDepart As Worksheet
Dim WsDestination As Worksheet

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Set WsDestination = Sheets("SuiviClient")
Set WsDepart = ActiveSheet

NomOnglet = ActiveSheet.Range("G3").Value & ActiveSheet.Range("I3").Value   
nomcherche = NomOnglet 'Range("H1").Value 'Nom client

Sheets("SuiviClient").Activate


Set C = Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then
Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select

        'MsgBox "on créé la ligne"
ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

Else

Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 0).Select

ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

End If

    Set C = Nothing
'End With
Activer:
shAct.Select

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub


EDIT :
Correction du LANGAGE dans les balises de code.
Les macro Excel.. c'est du BASIC ... pas du CSHARP
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
J'avance un peu lol

en fait comment dire à la ligne du code ci dessous de rechercher la dernière ligne libre?

Mais peut etre que le probleme ne vient pas de la? arfff

Merci pour votre réponse

Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select
Messages postés
28085
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 avril 2020
2 243
On reprend.. car je ne suis pas sûr que tu saches ce que font chaque ligne de code ( que tu dois certainement copier/coller sans savoir ce qu'elles font... )

Donc
Au départ tu indiques
Set WsDestination = Sheets("SuiviClient")
Set WsDepart = ActiveSheet


puis plus bas tu écris :
Sheets("SuiviClient").Activate

au passage, vu que tu as déclarer la variable WsDestination .. autant l'utiliser
WsDestination.Activate


Le problème est donc là......
Tu ACTIVES la feuille WsDestination ..... et vu son nom.. je suppose que c'est la feuille DANS LAQUELLE tu veux mettre les informations que tu cherches (je suppose dans la feuille WsDepart )

Et vu que tu fais ta recherches de la façon suivante
Set C = Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)

Elle s'effectue dans la colonne B de la feuille ACTIVE.

Si tu veux chercher dans la feuille WsDepart il faut mettre
Set C = WsDepart.Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)


Je t'invite également à éviter les instruction SELECT .. et d'utiliser directement les coordonnées des cellules.
Donc:

    LastRow = WsDestination.Cells(WsDestination.Rows.Count, "B").End(xlUp).Row + 1
   
   WsDestination.cells(LastRow ,2).Value = WsDepart.Range("d15").value  'Date de l'évenement



NB: Le langage pour les balises de code correspondant aux macros.. c'est le BASIC pas le CSHARP.


Cordialement,
Jordane
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
Merci beaucoup pour ton aide...

Pour répondre à ta question "Si tu veux chercher dans la feuille WsDepart il faut mettre"
Alors non c'est bien dans la feuille de destination que je veux rechercher donc j'ai remplacé par "WsDestination".

Mais le probleme persiste toujours.
Je crée une ligne et ca fonctionne
Je créé une seconde ligne ca fonctionne aussi

Je lance à nouveau le code avec le nom de la ligne deja existant et la problème ca me remplace la ligne juste en dessous de la ligne selectionnée.
En fait je voudrais que la ligne selectionnée soit remplacé.

Set C = WsDestination.Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then
LastRow = WsDestination.Cells(WsDestination.Rows.Count, "B").End(xlUp).Row + 1
WsDestination.Cells(LastRow, 2).Value = NomOnglet
WsDestination.Cells(LastRow, 3).Value = WsDepart.Range("d15").Value
'ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
'ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
'ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
'ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
'ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
'ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer
'-------------------------------------------------------------------------------------------------------------------------
End If
Set C = WsDestination.Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then

 LastRow = WsDestination.Cells(WsDestination.Rows.Count, "B").End(xlUp).Row + 1
        '----MsgBox "on créé la ligne"

WsDestination.Cells(LastRow, 2).Value = NomOnglet
WsDestination.Cells(LastRow, 3).Value = WsDepart.Range("d15").Value
'ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
'ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
'ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
'ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
'ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
'ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

Else


 LastRow = WsDestination.Cells(WsDestination.Rows.Count, "B").End(xlUp).Row + 0
WsDestination.Cells(LastRow, 2).Value = NomOnglet
WsDestination.Cells(LastRow, 3).Value = WsDepart.Range("d15").Value
'ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
'ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
'ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
'ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
'ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
'ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer


End If
    Set C = Nothing
'End With
Activer:
shAct.Select
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
585
bonjour, que signifie "lancer à nouveau le code avec le nom de la ligne déjà existant"?
peux-tu être plus précis et plus concret?
il faut éviter d'utiliser "active" et "select", donc aussi activecell.
alex141077
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2 > yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020

Quand je crée un devis 1, devis 2, devis 3,etc.... mon code va créer une ligne pour chaque devis et coller des informations sur la meme ligne dans la feuille "suiviClient".
Quand j'apporte des modifications sur le devis N°1 par exemple, etc... je voudrais que la macro retrouve la ligne du devis1 est apporte les modifications sur cette ligne dans la feuille "suiviClient".
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
en fait ce qui cloche ceux sont ces lignes de code :

Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select

et

Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 0).Select
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
585
pour moi, cela cloche car tu utilises Select et que tu ne précises pas dans quel onglet tu travailles. est-ce ton seul soucis? cela donne-t'il un message d'erreur?
en fait, qu'attends-tu de cette instruction? l'instruction ne nous permet pas nécessairement de deviner ce que tu veux obtenir, d'autant plus que tu écris que cela cloche.

pour le nom de l'onglet:
NomOnglet = WsDepart .Name
alex141077
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2 > yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020

En fait cela me dépasse un peu...mes connaissances sont largement dépassées et je ne comprends pas trop ce que tu me demandes comme renseignements.

Ws départ correspond à la feuille active qui change de nom pour chaque nouvelle feuille. Donc j'avais pensé déclarer des variable.
Sinon il n'y a pas de messages d'erreur. c'est juste que la macro ne réalise pas ce que je souhaite.

Je remets mon code car j'ai fait du trie dedans car a force de bidouiller je m'y perd vraiment.

Sub Rectangle28_Cliquer()
On Error Resume Next
Dim shAct As Worksheet
Set shAct = ActiveSheet
Dim C As Range
Dim NomFeuil As String, NexistePas As Boolean, Caractere As String
Dim Code As String
Dim Objet As OLEObject
Dim X As String
Dim NextLine As Long
Dim WsDepart As Worksheet
Dim WsDestination As Worksheet

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Set WsDestination = Sheets("SuiviClient")
Set WsDepart = ActiveSheet

NomOnglet = ActiveSheet.Range("G3").Value & ActiveSheet.Range("I3").Value   'ActiveSheet.Name
nomcherche = NomOnglet

Sheets("SuiviClient").Activate


Set C = Columns("B:B").Find(What:=nomcherche, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then
Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1).Select

        'MsgBox "on créé la ligne"
ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

Else

Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 0).Select

ActiveCell.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
ActiveCell.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
ActiveCell.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
ActiveCell.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
ActiveCell.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
ActiveCell.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
ActiveCell.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
ActiveCell.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

End If

    Set C = Nothing

Activer:
shAct.Select

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Messages postés
28085
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
6 avril 2020
2 243
Je crois que le plus simple serait que tu nous mettes un fichier à disposition
http://www.commentcamarche.net/faq/29493-utiliser-cjoint
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
Bonjour,

Voila mon fichier avec les explications dessus

https://www.cjoint.com/c/JCcfmLbTptT

Merci pour votre aide
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
585
serait-il possible que ta macro soit dans un autre fichier, que tu n'as pas partagé?
suggestion, non testée:
Option Explicit

Sub Rectangle28_Cliquer()
Dim shAct As Worksheet
Dim C As Range
Dim NomOnglet As String
Dim WsDepart As Worksheet
Dim WsDestination As Worksheet

On Error Resume Next

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Set shAct = ActiveSheet
Set WsDestination = Sheets("SuiviClient")
Set WsDepart = ActiveSheet

NomOnglet = WsDepart.Range("G3").Value & ActiveSheet.Range("I3").Value   'ActiveSheet.Name
Set C = WsDestination.Columns("B:B").Find(What:=NomOnglet, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then
    'MsgBox "on créé la ligne"
    Set C = WsDestination.Range("B" & Range("B" & Cells.Rows.Count).End(xlUp).Row + 1)
End If
C.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
C.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
C.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
C.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
C.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
C.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
C.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
C.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer
shAct.Select

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
Bonjour,

Merci beaucoup pour ton code. J'ai tester et le soucis persiste toujours...

Je lance la macro qui crée la ligne DEVIS 142 dans la feuille "SuiviClient" = Ok
Je lance la macro qui crée la ligne DEVIS 143 mais qui me supprime la ligne DEVIS 142.

De plus la macro crée les nouvelles lignes uniquement sur la ligne 86?????
Je ne vois pas pourquoi car dans le code il n'y a aucune instruction pour la ligne 86???

Deuxièmement, je ne vois pas d'instruction pour rechercher une ligne existante par exemple DEVIS 142 et remplacer la ligne par un nouveau DEVIS142...

Merci pour ton aide
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
585
et ainsi?
Option Explicit

Private Sub Rectangle28_Cliquer()
Dim C As Range
Dim NomOnglet As String
Dim WsDepart As Worksheet
Dim WsDestination As Worksheet

On Error Resume Next

Application.DisplayAlerts = False
Application.ScreenUpdating = False

Set WsDestination = Sheets("SuiviClient")
Set WsDepart = ActiveSheet

NomOnglet = WsDepart.Range("G3").Value & ActiveSheet.Range("I3").Value   'ActiveSheet.Name
Set C = WsDestination.Columns("B:B").Find(What:=NomOnglet, LookIn:=xlValues, LookAt:=xlPart)
If C Is Nothing Then
    'MsgBox "on créé la ligne"
    Set C = WsDestination.Range("B" & WsDestination.Range("B" & WsDestination.Cells.Rows.Count).End(xlUp).Row + 1)
End If
C.Value = NomOnglet 'WsDepart.Range("H9").Value 'N°devis
C.Offset(0, 1).Value = WsDepart.Range("d15") 'Date de l'évenement
C.Offset(0, 2).Value = WsDepart.Range("H9") ' Nom client
C.Offset(0, 3).Value = WsDepart.Range("E15") 'Lieu de l'évenement
C.Offset(0, 4).Value = WsDepart.Range("B19") 'Type de prestation
C.Offset(0, 5).Value = WsDepart.Range("G19") 'Nombre de personne
C.Offset(0, 6).Value = WsDepart.Range("N1") 'acompte versé
C.Offset(0, 7).Value = WsDepart.Range("Q1") 'Reglement restant à payer

Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
Les nouvelles lignes se créent parfaitement.

J'ai bien la ligne DEVIS 142 (Ligne 3)et la ligne DEVIS 143 (Ligne 4)

Quand je veux modifier le DEVIS 142 par exemlpe sur ma feuille DEVIS 142 je change le prix, si je relance la macro, la modification ne se fait pas sur (Ligne3) de la feuille "SuiviClient"...
Je pense que ca doit etre une histoire de "...Row + 0"?
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
585
chez moi, quand je modifie un devis et refais tourner la macro, la ligne du devis se modifie dans "suiviclient". bizarre, non?
Messages postés
37
Date d'inscription
vendredi 5 avril 2013
Statut
Membre
Dernière intervention
2 mars 2020
2
Ah Oui si ca fonctionne très bien...Milles excuses!!!!

Génial ca fonctionne!!!!

Merci pour ton aide tu es top!!!!
yg_be
Messages postés
10378
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
6 avril 2020
585
la ligne 18 fait la recherche, et, si trouvé, mémorise la position dans C.
si pas trouvé, la ligne 21 memorise dans C la position de la ligne en dessous de la dernière ligne non vide.
et ensuite, on remplit les cellules de la ligne où se trouve C.