Copier et effacer ligne dun classeur à un autre
Bonjour,
En premier point, je voudrais savoir comment faire pour copier une ligne dans un autre classeur en fonction de la valeur d'une cellule. Et lorsque la valeur de la cellule change, que cette ligne soit effacée.
En deuxième point, toujours en fonction du premier classeur, lorsque des valeurs d'un menu déroulant sont choisies que cela mette un symbole dans une cellule du classeur 2, en fonction de la ligne recopiée du 1er point.
Je joins un exemple. Dans le classeur 1, je voudrais que toutes les lignes de A3 à J200 où L="NV", soient recopiées dans le classeur 2, de A3 à J200. Si la cellule en L affiche autre chose que NV je ne veux pas que la ligne soit copiée et si "NV" initialement mis est changé alors la ligne est effacée sur le classeur 2. C'est le 1er point.
En 2°, je voudrais qu'en fonction du choix des menus déroulants des colonnes O,P, Q et R, un "X" soit mis dans la cellule correspondante sur le classeur 2. Dans mon exemple, 02A du classeur 1, colonne O correspond à la colonne K du classeur 2, 02B à la colonne L, 02D, à la colonne M...
Dans mon exemple, j'ai tout mis manuellement, mais je souhaiterais que cela se fasse automatiquement.
Plusieurs classeurs seront reliés au classeur 2 (en fait un par semaine).
Merci par avance pour votre aide.
Salut Matt,
Je te propose un fichier assez brut (par exemple sans aucune mise en page finale) afin de te montrer ce qui est possible de réaliser en réponse à ta demande. Si ça t'intéresse d'aller plus loin, il y a pas mal de chose à mettre au point entre nous.
Pour cet exemple, j'ai réduit tes choix dans les colonnes O, P et Q de ton fichier 1 et seuls ces choix sont reportés dans le fichier 2.
Dans le fichier 2, je n'ai pas toujours trouvé la correspondance de tes titres des colonnes K à T avec les choix possibles dans tes anciennes colonnes O à S du fichier 1, alors je les ai remplacés avec des concordances exactes, de manière à ce que tu vois comment il faudrait si possible travailler.
Pour l'instant les deux fichiers doivent être ouverts conjointement. Par la suite, on pourrait voir ce qui est le plus logique (Exemple 1 : Tu travailles sur le fichier 1 et le fichier 2 est fermé. Lors de l'ouverture du fichier 2, les données sont automatiquement actualisées, même si le fichier 1 a été refermé entre-temps. Exemple 2 : Tu travailles sur le fichier 1 et tu décides toi quand tu veux effectuer les actualisations).
Effectue des tests en modifiant le nombre de lignes du fichier 1, en modifiant les choix dans les colonnes O à Q de ce même fichier et vois comment sont reportés les données dans le fichier 2, après avoir cliqué sur le bouton "Report". Puis dis-moi quoi
A te relire.
je te remercie ça fonctionne.
Il n'y a en effet pas toutes les concordances car j'ai mis en exemple des fichiers simplifiés. Ensuite ayant compris comment tu faisais, j'adapterai pour chaque cas.
Pour répondre à tes questions, je travaille essentiellement sur le classeur 1. Je pensais mettre un bouton pour, une fois le travail terminé, tout envoyé sur le classeur 2, si possible sans avoir besoin de l'ouvrir.
Pour expliquer rapidement l'intérêt de ces fichiers, il y a un par semaine qui répertorie un ensemble de dossiers à coder. Chaque fois qu'un dossier est codé il est mis en "V" pour validé et quand il n'est pas codé, il est mis en "NV" pour non validé, suivi de la cause de la non validation (02A, 02B... pour des courriers manquants, des actes manquants...). Ensute, j'envoie aux destinataires concernés, une fois par mois, ou plus souvent suivant les cas, des relances pour compléter les dossiers "NV".
Ce classeur 2, va me servir à récapituler les relances et à envoyer un fichier plus clair qu'un simple tri avec des filtres et en remplaçant nos codes par des formulations plus simples.
Il y a 52 fichiers qui renverront vers le classeur 2.
Pour finaliser ce classeur, il faudrait donc que chaque fois les lignes en "NV" viennent se coller sous la dernière ligne non vide. Ainsi je n'effacerai pas les données des semaines précédentes.
En continuant, un dossier n'est pas systématiquement corrigé et il faut parfois l'envoyer plusieurs fois. Je mettrai donc sur le classeur 2, une macro pour effacer les doublons (repère sur la colonne C qui ne varie pas). Pour cette macro de doublons, ça va dans un fonctionnement simple.
Je verrai, une fois que tout le début sera en place ce qu'il faut faire pour que les dossiers qui ne sont plus en "NV" dans le classeur 1 (ils seront alors en "VaR" pour validé après relance) soit totalement supprimés dans le classeur 2. Je pense qu'il faut recopier tous les fichiers en NV et en VaR puis par une recherche de doublons. Si la valeur en C est retrouvée plusieurs fois :
*Supprimer les lignes correspondantes en ne gardant que la première si toutes les lignes sont en "NV"
*Supprimer toutes les lignes avec une valeur en C identique, si l'une d'entre elle est en "VaR"
Encore merci pour l'aide apportée et dont j'aurai encore besoin.
Salut,
Tes explications sont assez touffues
J'ai modifié le code afin que le fichier 2 s'ouvre et se referme (modifié) en fin de macro sans que tu t'en aperçoives. Il faut que les deux fichiers soient dans le même dossier, autrement il faudra encore modifier certaines parties.
De plus les lignes sont rajoutées à la suite des autres dans le fichier 2 (si tu cliques 2 fois sur le bouton, tu auras deux fois la même série de lignes à la suite dans le classeur 2). Attention : plusieurs lignes de la macro ont été modifiées.
Je n'ai plus modifié le numéro de version dans le nom des fichiers car autrement il faut modifier tout le code à cause de cela.
Regarde tout ça et dis-moi quoi (essaie d'être concis et précis
c'est super c'est exactement ça.
Pour mes besoins, je vais donc faire étape par étape.
Je voudrais que si une ligne en NV du fichier 1 est modifiée en VaR alors toutes les lignes ayant la même valeur en colonne C soient supprimées du fichier 2 lors de l'exécution suivante de la macro.
A l'inverse, si cette ligne reste en NV alors elle reste sur le fichier 2 mais sans doublon.
Cela donne ce que j'ai fait manuellement sur les fichiers joints (la ligne 6 est en VaR et est supprimée du fichier 2, les autres restent en NV mais n'apparaissent qu'une fois sur le fichier 2).
Encore merci pour ton aide
je suis en train de tester le fichier depuis mon boulot et j'ai une erreur que je n'avais pas sur mon pc.. Impossible de comprendre ce qui cloche.
Lorsque je lance la macro, j'ai le message suivant :
Erreur d'exécution '9' :
L'indice n'appartient pas à la sélection
avec l'erreur sur la ligne suivante :
DerLig1 = Workbooks("Matt1_V1").Sheets("Feuil1").Range("C" & Rows.Count).End(xlUp).Row
Je n'ai pourtant pas modifier les fichiers, juste enregistrés sur mon pc et ouverts.
Merci de bien vouloir continuer à m'aider pour résoudre ce problème
Salut Matt,
Tu n'as pas fourni les fichiers indiqués. Je ne peux donc pas voir si mes nouvelles propositions correspondent exactement à ton attente. Mais je présume que oui. Je te laisse tester.
En ce qui concerne tes problèmes de lecture sur un autre PC, je dois t'avouer que j'ai également eu des soucis en essayant mes fichiers (créés sur Excel 2007) sur une version 2003 (au travail).
Je vais donc essayer de transformer mes codes afin qu'ils passent sur les deux versions. Mais fait déjà des essais sur ton PC privé.
Cordialement.
Salut,
j'ai désormais le message d'erreur suivant lorsque je lance la macro :
Erreur de compilation :
Variable non définie
sur cette partie du code :
'tri fichier 2
Windows("Matt2_V1.xls").Activate
Rows("3:65000").Select
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C3:C65000") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("Feuil1").Sort
.SetRange Range("A3:U65000")
.Orientation = xlTopToBottom
.Apply
End With
Je mets en pièce jointe les fichiers tels que je souhaiterais.
Les lignes en NV sont recopiées sur le fichier 2. Mais ces lignes peuvent être modifiées manuellement et devenir VaR. Dans cette condition, je souhaite qu'elles soient effacées du fichiers 2 et que seules les lignes en NV apparaissent une seule fois.
Par contre l'erreur signalée sur le post précédent ne se produit que sur mon pc de boulot sous XP alors que sur mon pc perso, je suis également sous XP et les 2 avec Excel 2003
Salut le forum
matt31 a écrit :Par contre l'erreur signalée sur le post précédent ne se produit que sur mon pc de boulot sous XP
alors que sur mon pc perso, je suis également sous XP et les 2 avec Excel 2003
Je trouve bizarre que tu dis qu'il fonctionne sur un poste, car le code suivant n'est pas
compatible sous Excel 2003, c'est une fonctionnalité. d'Excel 2007
ActiveWorkbook.Worksheets("Feuil1").Sort.SortFields.Add Key:=Range("C3:C65000"), _
SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormalMytå
bonsoir,
il est tard, et je n'ai pas été clair. Ce dernier code ne fonctionne pas du tout sous Excel 2003.
Je parlais des 2 fichiers précédemment qui fonctionnent sur mon pc sous XP et avec Excel 2003 et pas sur celui de mon boulot dans les mêmes conditions.
Salut Matt, Salut Mytå,
J'ai essayé de transformer ce code ce matin au travail, de manière à ce que ça passe sur une version 2003.
Il y a en plus une mise en forme des cellules du fichier 2.
A tester.
un très grand merci, chez moi cela fonctionne super bien.
Pour continuer avec ce dossier ultra complexe (du moins pour moi), comment faire pour que si cette macro est mise sur plusieurs fichiers indentiques, les lignes en NV, soient copiées les unes à la suite des autres pour chaque fichier? (ou pour être plus clair, sur la première cellule vide en A). Actuellement celles du fichier dont j'exécute la macro en 2° coup, se placent sur les 1° en partant de la dernière ligne remplie...
Toujours merci pour ton aide précieuse
Re,
Si je comprends bien, tu as plusieurs fichiers qui correspondent à mon fichier 1 depuis lesquels tu alimentes ce que j'ai appelé le fichier 2.
Mon code - placé dans le ou les fichiers 1 - exécute les mutations suivantes sur le fichier 2 :
- ouverture du fichier 2
- inscriptions des lignes marquées "NV" dans les fichiers 1, les unes à la suite des autres, dans leur ordre sur les fichiers 1
- tri des lignes en fonction de la colonne C
- suppression des doublons, toujours en fonction de la seule colonne C.
- suppression des lignes marquées VaR dans les fichiers 1
- fermeture du fichier 2
Apparemment, tu désires modifier cela.
Peux-tu alors me fournir un exemple d'un fichier 1A, un exemple d'un fichier 1B - tels qu'ils se présentent avant le lancement de leur macro respective - ainsi qu'un exemple de ce que tu désirerais dans le fichier 2 à la fin de ces macros ?
A te relire.
une fois de plus j'ai parlé trop vite. Cela fonctionne, j'avais simplement fait un copier/coller du fichier et oublié de changer une valeur en C. Du coup cela m'effaçait la ligne.
Je continue donc les questions pour finaliser le fichier et surtout je te remercie pour tout l'aide apportée.
Je crée un fichier (celui que tu as appelé Matt1_V1) pour chaque semaine de l'année. J'ai fait une macro qui génère tous les fichiers selon le modèle. Est-il possible de modifier ta macro pour qu'elle soit valable quel que soit le nom du fichier? Sachant que tous les classeurs seront dans le même dossier et que la feuille de destination sera toujours la même.
Oui, ça ne fait aucun doute ! ... ou, du moins, je l'espèrematt31 a écrit :Est-il possible de modifier ta macro pour qu'elle soit valable quel que soit le nom du fichier?
Tu nous la montres quand ?matt31 a écrit :J'ai fait une macro qui génère tous les fichiers selon le modèle.
Cordialement.
Je n'avais pas vu que le fichier n'avait été pris (trop volumineux...)
Voilà donc le fichier que j'utilise. J'ai enlevé les feuilles qui ne servaient pas et qui rendaient le classeur trop lourd. La macro en question s'appelle Go
Elle génère toutes les classeurs sur ce format et les nomme avec l'EM choisie en ligne 1 et avec le numéro de semaine correspondant.
Si c'est possible, j'aimerais insérer ta macro dans ce fichier pour avoir 52 fichiers identiques mais nommés différemment et qui copieront toutes les lignes en NV sur le même classeur.
Encore merci
Salut Matt,
Lorsque je vois les macros que tu as créées dans ton fichier "Fichier Hebdo", je me sens tout petit et je suis surpris que tu aies besoin de mon aide pour continuer ton projet.
Je n'ai pas trop cherché à comprendre tes macros mais - afin de tenter de t'aider - je voudrais savoir comment se nomment - comme exemples - deux de tes fichiers hebdomadaires créés sur la base de ce fichier "Fichier Hebdo".
Ceci afin de voir de quelle manière l'on pourrait - si je t'ai bien compris - inclure ma macro à ton "Fichier Hebdo" et faire référence à son nouveau nom hebdomadaire sous la forme d'une variable.
A te relire.
attention, toutes les macros de ce fichier ne sont pas de moi. Celles de l'incrémentation par double clic a été faite avec une aide comme la tienne.
Celle que j'ai faite pour la création automatique de fichier l'a été lors d'une formation que j'ai eu au boulot. Le thème était ACCESS (les bases) et comme le formateur était sympa, durant les pauses il me guidait pour cette macro.
Je n'ai aucune formation vba et je ne connais pas les termes à employer. Je cherche, je regarde des macros et j'essaie d'appliquer mais parfois je n'y arrive pas. Maintenant tu m'as appris plusieurs choses avec ta macro. J'ai essayé de la bidouiller mais je n'y arrive pas comme je veux (c'est parfois la difficulté quand on n'est pas le créateur original...)
En ligne 1 du fichier hebdo j'ai 2 cellules (fusion de plusieurs cellules). Dans la 1° j'indique le numéro de l'EM. Dans la 2°, le numéro de la semaine à laquelle je veux commencer. Je lance la macro et elle me nomme les fichiers "EM 68 - S 01.xls" jusqu'à "EM 68 - S 01.xls".
Ensuite si je change d'EM (j'en ai une 50aine) cela recommence : "EM 95 - S 01.xls"....
D'où le besoin de savoir si on peut insérer quelque chose dans ta macro.
Salut,
J'ai tenté de modifier le code de manière à ce que - si tu le places dans ton fichier de base - il devrait fonctionner quel que soit le nom des copies que tu en établis (une variable "Nom_de_ce_fichier" remplace l'ancien nom figé "Matt1_V1.xls").
Sub Report()
Dim DerLig1 As Integer, DerLig2 As Integer, i As Integer, Réf_VaR As Long, k As Integer, l As Integer
Dim Colonne_O As String, Colonne_P As String, Colonne_Q As String, Chemin As String, Nom_de_ce_fichier As String
Application.ScreenUpdating = False
Nom_de_ce_fichier = ThisWorkbook.Name
Chemin = ThisWorkbook.Path
Workbooks.Open Filename:=Chemin & "\Matt2_V1.xls"
Windows(Nom_de_ce_fichier).Activate
DerLig1 = Range("C" & Rows.Count).End(xlUp).Row
' report des cas du fichier 1 au fichier 2, y compris les codes des colonnes O, P, Q
For i = 3 To DerLig1
If Cells(i, 12) = "NV" Then
Range("A" & i & ":J" & i).Copy
Windows("Matt2_V1.xls").Activate
DerLig2 = Range("C" & Rows.Count).End(xlUp).Row
Range("A" & DerLig2 + 1).PasteSpecial
Windows(Nom_de_ce_fichier).Activate
Colonne_O = Cells(i, 15)
Select Case Colonne_O
Case Is = "02A"
Windows("Matt2_V1.xls").Activate
Range("K" & DerLig2 + 1) = "X"
Case Is = "02B"
Windows("Matt2_V1.xls").Activate
Range("L" & DerLig2 + 1) = "X"
Case Is = "02C"
Windows("Matt2_V1.xls").Activate
Range("M" & DerLig2 + 1) = "X"
Case Is = "02D"
Windows("Matt2_V1.xls").Activate
Range("N" & DerLig2 + 1) = "X"
End Select
Windows(Nom_de_ce_fichier).Activate
Colonne_P = Cells(i, 16)
Select Case Colonne_P
Case Is = "03A"
Windows("Matt2_V1.xls").Activate
Range("O" & DerLig2 + 1) = "X"
Case Is = "03B"
Windows("Matt2_V1.xls").Activate
Range("P" & DerLig2 + 1) = "X"
Case Is = "03C"
Windows("Matt2_V1.xls").Activate
Range("Q" & DerLig2 + 1) = "X"
End Select
Windows(Nom_de_ce_fichier).Activate
Colonne_Q = Cells(i, 17)
Select Case Colonne_Q
Case Is = "04A"
Windows("Matt2_V1.xls").Activate
Range("R" & DerLig2 + 1) = "X"
Case Is = "04B"
Windows("Matt2_V1.xls").Activate
Range("S" & DerLig2 + 1) = "X"
Case Is = "04C"
Windows("Matt2_V1.xls").Activate
Range("T" & DerLig2 + 1) = "X"
End Select
Windows(Nom_de_ce_fichier).Activate
End If
Next
''tri fichier 2
Windows("Matt2_V1.xls").Activate
DerLig2 = Range("C" & Rows.Count).End(xlUp).Row
Rows("2:" & DerLig2).Select
Selection.Sort Key1:=Range("C3"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
DataOption1:=xlSortNormal
Range("A3:T" & DerLig2).Borders.Weight = xlThin
'suppression des doublons du fichier 2
Cells(4, 3).Activate
Do Until ActiveCell = ""
If ActiveCell = ActiveCell.Offset(-1, 0) Then
ActiveCell.EntireRow.Delete
ActiveCell.Offset(-1, 0).Activate
End If
ActiveCell.Offset(1, 0).Activate
Loop
'suppression dans le fichier 2 des lignes marquées "VaR" dans le fichier 1
Windows(Nom_de_ce_fichier).Activate
For k = 3 To DerLig1
If Cells(k, 12) = "VaR" Then
Réf_VaR = Cells(k, 3)
Windows("Matt2_V1.xls").Activate
DerLig2 = Range("C" & Rows.Count).End(xlUp).Row
For l = 2 To DerLig2
Cells(l, 3).Activate
If ActiveCell = Réf_VaR Then
ActiveCell.EntireRow.Delete
ActiveCell.Offset(-1, 0).Activate
End If
Next
Windows(Nom_de_ce_fichier).Activate
End If
Next
Windows("Matt2_V1.xls").Activate
Cells(DerLig2, 1).Select
Windows("Matt2_V1.xls").Close SaveChanges:=True
End SubComme exemple, un fichier avec lequel j'ai fait des essais (nouveau nom selon tes indications).
Cordialement
Je te remercie, je pensais à ça mais je ne savais pas comment le faire.
Il me reste 2 petites choses pour terminer tout ça.
La première je devrais y arriver, c'est classer par ordre chrono en fonction de la cellule G, dès l'ouverture du fichier 2.
La deuxième, je ne sais pas si l'on peut, c'est ajouter à la copie des lignes des cellules A à J, uniquement la dernière cellule W (même si elle est vide et la mettre dans la ligne correspondante mais en U.
Je ne sais pas si je suis clair : copier de A à J (ça tu l'as fait) plus copier W et la mettre en U sur le 2° fichier.
Je te remercie encore une fois et ce ne sera pas la dernière.
Regarde ce nouveau code si ça te convient.matt31 a écrit :La deuxième, je ne sais pas si l'on peut, c'est ajouter à la copie des lignes des cellules A à J, uniquement la dernière cellule W (même si elle est vide et la mettre dans la ligne correspondante mais en U.
J'ai ajouté, à la fin du code, une mise en forme du fichier 2 au niveau du quadrillage (la toute première fois, il ne faut pas qu'il y ait - dans ce fichier 2 - des lignes vides quadrillées en dernier).
Pour ton autre problème, indique-nous si tu n'y arrives pas.
A te relire.