VBA EXCEL : Copier des lignes sous condition d'un classeur à un autre
Dernière réponse : dans Programmation
Bonjour, après de nombreuses heures sous google je viens vers vous parce que j'ai des éléments de réponses mais je n'arrive pas à les conjuguer !
J'aimerais copier d'un classeur nommé "EN COURS.xls" les lignes comportant la valeur "FCA" dans les cellules situées colonne A des lignes 7 à l'infini.
J'aimerais coller ces lignes dans un classeur nommé "FCA.xls" à partir donc de la ligne 7 (sans qu'il y ait d'espace entre chaque ligne).
Ce que j'ai fait pour le moment :
Sub FCA()
For i = 7 To Infinite
Windows("GROUPE.xls").Activate
If Range(A, 1) = "FCA" Then
Worksheets("EN COURS").Range("A" & i & ":E" & i).Copy
Windows("FCA.xls").Activate
Worksheets("FCA").Range("A" & i).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
End If
Next i
End Sub
mais ça ne colle rien dans FCA.xls et je ne vois pas pourquoi ?
où ais-je faux ?
merci !
J'aimerais copier d'un classeur nommé "EN COURS.xls" les lignes comportant la valeur "FCA" dans les cellules situées colonne A des lignes 7 à l'infini.
J'aimerais coller ces lignes dans un classeur nommé "FCA.xls" à partir donc de la ligne 7 (sans qu'il y ait d'espace entre chaque ligne).
Ce que j'ai fait pour le moment :
Sub FCA()
For i = 7 To Infinite
Windows("GROUPE.xls").Activate
If Range(A, 1) = "FCA" Then
Worksheets("EN COURS").Range("A" & i & ":E" & i).Copy
Windows("FCA.xls").Activate
Worksheets("FCA").Range("A" & i).PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _
False, Transpose:=False
End If
Next i
End Sub
mais ça ne colle rien dans FCA.xls et je ne vois pas pourquoi ?
où ais-je faux ?
merci !
Autres pages sur : vba excel copier lignes condition classeur
Lassé par la pub ? Créez un compte
Salut, Jirachi07
Le problème avec ton code est qu'il ne faut pas se contenter d'activer le classeur (Windows("x.xls").Activate), il faut aussi activer la feuille. Toutefois, cela fait perdre beaucoup de temps à l'exécution. Voila ce que je te propose:
Sub FCA()
j = 7
For i = 7 To 65536
If Application.Workbooks("GROUPE.xls").Worksheets("EN COURS").Range("A" & i).Value = "FCA" Then
Application.Workbooks("FCA.xls").Worksheets("FCA").Range("A" & j & ":E" & j).Value = Application.Workbooks("GROUPE.xls").Worksheets("EN COURS").Range("A" & i & ":E" & i).Value
j = j + 1
End If
Next i
MsgBox "Vous avez copié " & j - 7 & " lignes.", , "Traitement terminé"
End Sub
Cette procédure copie les valeurs. Si tu veux copier les formules, remplace les ".Value" par ".Formula" SAUF dans le test.
Ceci dit, tu peux aussi mettre un filtre sur la colonne A de la feuille "EN COURS" de "GROUPE.xls", filtrer sur "FCA" et copier/coller les lignes sélectionnées dans l'autre classeur... mais c'est plus classe avec une macro !
Bonne continuation
Le problème avec ton code est qu'il ne faut pas se contenter d'activer le classeur (Windows("x.xls").Activate), il faut aussi activer la feuille. Toutefois, cela fait perdre beaucoup de temps à l'exécution. Voila ce que je te propose:
Sub FCA()
j = 7
For i = 7 To 65536
If Application.Workbooks("GROUPE.xls").Worksheets("EN COURS").Range("A" & i).Value = "FCA" Then
Application.Workbooks("FCA.xls").Worksheets("FCA").Range("A" & j & ":E" & j).Value = Application.Workbooks("GROUPE.xls").Worksheets("EN COURS").Range("A" & i & ":E" & i).Value
j = j + 1
End If
Next i
MsgBox "Vous avez copié " & j - 7 & " lignes.", , "Traitement terminé"
End Sub
Cette procédure copie les valeurs. Si tu veux copier les formules, remplace les ".Value" par ".Formula" SAUF dans le test.
Ceci dit, tu peux aussi mettre un filtre sur la colonne A de la feuille "EN COURS" de "GROUPE.xls", filtrer sur "FCA" et copier/coller les lignes sélectionnées dans l'autre classeur... mais c'est plus classe avec une macro !
Bonne continuation
merci pour ta réponse
j'ai essayé mais ça me met "erreur d'execution 9, l'indice n'appartient pas à la selection"
la phrase suivante se fluote en jaune :
Application.Workbooks("FCA.xls").Worksheets("FCA").Range("A" & j & ":E" & j).Formula = Application.Workbooks("GROUPE.xls").Worksheets("EN COURS").Range("A" & i & ":E" & i).Value
une idée ?
[edit] autant pour moi dans ma grande bétise j'ai mis la macro dans GROUPE.xls au lieu de FCA.xls
cependant toute la ligne ne se copie pas les dernières colonnes sont vides alors que sur l'original des données s'y trouvent
j'ai essayé mais ça me met "erreur d'execution 9, l'indice n'appartient pas à la selection"
la phrase suivante se fluote en jaune :
Application.Workbooks("FCA.xls").Worksheets("FCA").Range("A" & j & ":E" & j).Formula = Application.Workbooks("GROUPE.xls").Worksheets("EN COURS").Range("A" & i & ":E" & i).Value
une idée ?
[edit] autant pour moi dans ma grande bétise j'ai mis la macro dans GROUPE.xls au lieu de FCA.xls
cependant toute la ligne ne se copie pas les dernières colonnes sont vides alors que sur l'original des données s'y trouvent
Dans ta première ébauche, tu as écrit:
Range("A" & i & ":E" & i).Copy
J'ai donc supposé que tu ne voulais copier que les 5 premières colonnes. Si ta sélection doit aller plus loin, remplace ":E" par ":J" (par exemple).
Par ailleurs, la macro devrait fonctionner quel que soit le classeur sur lequel tu la places. Par contre, les deux classeurs doivent être ouverts AVANT de lancer la macro.
Bonne continuation
Range("A" & i & ":E" & i).Copy
J'ai donc supposé que tu ne voulais copier que les 5 premières colonnes. Si ta sélection doit aller plus loin, remplace ":E" par ":J" (par exemple).
Par ailleurs, la macro devrait fonctionner quel que soit le classeur sur lequel tu la places. Par contre, les deux classeurs doivent être ouverts AVANT de lancer la macro.
Bonne continuation
Sublime ! tout marche ! merci beaucoup !!!
si je peux me premettre un deuxième question puisqu'il y avait une deuxième macro dans mes classeurs qui marchait hier... et qui marche plus aujourd'hui, ça me dépasse...
c'est pour envoyer un mail de rappel à ceux qui sont en retard dans les projets EN COURS sachant que - les noms sont en colonne G
- les dates en colonne I
- les mails en colonne H
- l'intitulé du retard en colonne D
quand la date est supérieur à la date d'aujoud'hui ça me prépare le mail sur outlook mais là quand j'éxecute la macro ça ne donne rien et hier ça marchait impec...
Sub MailRetard()
Dim Email As String, Subj As String
Dim Msg As String, URL As String
Dim r As Integer, x As Double
For r = 7 To Infinite
If Now() >= Cells(r, 9) Then
Email = Cells(r, 8)
Subj = "Retard"
Msg = ""
Msg = Msg & "Chèr(e) " & Cells(r, 7) & "," & vbCrLf & vbCrLf
Msg = Msg & "Vous êtes en retard sur le projet " & Cells(r, 4) & " devant se terminer le "
Msg = Msg & Cells(r, 9).Text & "." & vbCrLf & vbCrLf
Msg = Msg & "Nom et Prénom" & vbCrLf
Msg = Msg & "Statut"
' Replace spaces with %20 (hex)
Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")
' Replace carriage returns with %0D%0A (hex)
Msg = Application.WorksheetFunction.Substitute(Msg, vbCrLf, "%0D%0A")
' Create the URL
URL = "mailto:" & Email & "?subject=" & Subj & "&body=" & Msg
' Execute the URL (start the email client)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
' Wait two seconds before sending keystrokes
Application.Wait (Now + TimeValue("0:00:02"))
Application.SendKeys "%s"
End If
Next r
End Sub
si je peux me premettre un deuxième question puisqu'il y avait une deuxième macro dans mes classeurs qui marchait hier... et qui marche plus aujourd'hui, ça me dépasse...
c'est pour envoyer un mail de rappel à ceux qui sont en retard dans les projets EN COURS sachant que - les noms sont en colonne G
- les dates en colonne I
- les mails en colonne H
- l'intitulé du retard en colonne D
quand la date est supérieur à la date d'aujoud'hui ça me prépare le mail sur outlook mais là quand j'éxecute la macro ça ne donne rien et hier ça marchait impec...
Sub MailRetard()
Dim Email As String, Subj As String
Dim Msg As String, URL As String
Dim r As Integer, x As Double
For r = 7 To Infinite
If Now() >= Cells(r, 9) Then
Email = Cells(r, 8)
Subj = "Retard"
Msg = ""
Msg = Msg & "Chèr(e) " & Cells(r, 7) & "," & vbCrLf & vbCrLf
Msg = Msg & "Vous êtes en retard sur le projet " & Cells(r, 4) & " devant se terminer le "
Msg = Msg & Cells(r, 9).Text & "." & vbCrLf & vbCrLf
Msg = Msg & "Nom et Prénom" & vbCrLf
Msg = Msg & "Statut"
' Replace spaces with %20 (hex)
Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")
' Replace carriage returns with %0D%0A (hex)
Msg = Application.WorksheetFunction.Substitute(Msg, vbCrLf, "%0D%0A")
' Create the URL
URL = "mailto:" & Email & "?subject=" & Subj & "&body=" & Msg
' Execute the URL (start the email client)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
' Wait two seconds before sending keystrokes
Application.Wait (Now + TimeValue("0:00:02"))
Application.SendKeys "%s"
End If
Next r
End Sub
Salut, Jirachi07
Je ne vois pas d'erreur dans ton code. De toutes façons, s'il fonctionnait hier et que tu n'as rien changé, c'est probablement que l'erreur vient des données ou de ton logiciel de messagerie.
Petite remarque: à la place de Application.WorksheetFunction.Substitute(), sache qu'il existe la fonction Replace() en VBA qui fait exactement la même chose et qui s'emploie de la même façon. Autant utiliser les outils intégrés...
Bonne continuation
Je ne vois pas d'erreur dans ton code. De toutes façons, s'il fonctionnait hier et que tu n'as rien changé, c'est probablement que l'erreur vient des données ou de ton logiciel de messagerie.
Petite remarque: à la place de Application.WorksheetFunction.Substitute(), sache qu'il existe la fonction Replace() en VBA qui fait exactement la même chose et qui s'emploie de la même façon. Autant utiliser les outils intégrés...
Bonne continuation
Salut, Jirachi07
Dans ce cas, il faut déclarer la fonction comme ceci:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Ceci est à placer au tout début du module. Si tu veux utiliser ShellExecute dans plusieurs modules différents, remplace "Private" par "Public".
C'est mieux ?
Dans ce cas, il faut déclarer la fonction comme ceci:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
Ceci est à placer au tout début du module. Si tu veux utiliser ShellExecute dans plusieurs modules différents, remplace "Private" par "Public".
C'est mieux ?
ça me met "erreur de compilation, nom ambigu détecté : shellexecute"
[edit] c'était en doublon ! en fait la déclaration était déjà faite en private
je l'ai donc modifié en public et en un seul exemplaire
quand je clique sur lecture de la macro, shellexecute ne pose plus problème mais rien ne se passe, outlook ne s'ouvre pas...
[edit] c'était en doublon ! en fait la déclaration était déjà faite en private
je l'ai donc modifié en public et en un seul exemplaire
quand je clique sur lecture de la macro, shellexecute ne pose plus problème mais rien ne se passe, outlook ne s'ouvre pas...
ShellExecute est-il déclaré plus d'une fois ? Fais une recherche sur "function shellexecute" en sélectionnant "projet en cours" dans les options. Si elle est déclarée plusieurs fois de la même façon, n'en laisse qu'une seule active avec l'instruction "Public" au début.
Après cela, sélectionne le menu "Débogage" et clique sur "Compiler <nom_de_ton_fichier>" (permet de vérifier les "grosses" erreurs: fonctions non déclarées, propriété inconnue...).
C'est mieux ?
Après cela, sélectionne le menu "Débogage" et clique sur "Compiler <nom_de_ton_fichier>" (permet de vérifier les "grosses" erreurs: fonctions non déclarées, propriété inconnue...).
C'est mieux ?
J'ai
Public Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
*Grand Trait*
Sub MailRetard()
Dim Email As String, Subj As String
Dim Msg As String, URL As String
Dim r As Integer, x As Double
For r = 7 To Infinite
If Now() >= Cells(r, 10) Then
Email = Cells(r, 9)
Subj = "Retard"
Msg = ""
Msg = Msg & "Chèr(e) " & Cells(r, 8) & "," & vbCrLf & vbCrLf
Msg = Msg & "Vous êtes en retard sur le projet " & Cells(r, 5) & " devant se terminer le "
Msg = Msg & Cells(r, 9).Text & "." & vbCrLf & vbCrLf
Msg = Msg & "NOM" & vbCrLf
Msg = Msg & "STATUT"
' Replace spaces with %20 (hex)
Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")
' Replace carriage returns with %0D%0A (hex)
Msg = Replace(Msg, vbCrLf, "%0D%0A")
' Create the URL
URL = "mailto:" & Email & "?subject=" & Subj & "&body=" & Msg
' Execute the URL (start the email client)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
' Wait two seconds before sending keystrokes
Application.Wait (Now + TimeValue("0:00:02"))
Application.SendKeys "%s"
End If
Next r
End Sub
quand je compile il n'y a rien qui s'affiche, aucuns problèmes a priori, mais rien ne se produit non plus...
Public Declare Function ShellExecute Lib "shell32.dll" _
Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, _
ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, _
ByVal nShowCmd As Long) As Long
*Grand Trait*
Sub MailRetard()
Dim Email As String, Subj As String
Dim Msg As String, URL As String
Dim r As Integer, x As Double
For r = 7 To Infinite
If Now() >= Cells(r, 10) Then
Email = Cells(r, 9)
Subj = "Retard"
Msg = ""
Msg = Msg & "Chèr(e) " & Cells(r, 8) & "," & vbCrLf & vbCrLf
Msg = Msg & "Vous êtes en retard sur le projet " & Cells(r, 5) & " devant se terminer le "
Msg = Msg & Cells(r, 9).Text & "." & vbCrLf & vbCrLf
Msg = Msg & "NOM" & vbCrLf
Msg = Msg & "STATUT"
' Replace spaces with %20 (hex)
Subj = Application.WorksheetFunction.Substitute(Subj, " ", "%20")
Msg = Application.WorksheetFunction.Substitute(Msg, " ", "%20")
' Replace carriage returns with %0D%0A (hex)
Msg = Replace(Msg, vbCrLf, "%0D%0A")
' Create the URL
URL = "mailto:" & Email & "?subject=" & Subj & "&body=" & Msg
' Execute the URL (start the email client)
ShellExecute 0&, vbNullString, URL, vbNullString, vbNullString, vbNormalFocus
' Wait two seconds before sending keystrokes
Application.Wait (Now + TimeValue("0:00:02"))
Application.SendKeys "%s"
End If
Next r
End Sub
quand je compile il n'y a rien qui s'affiche, aucuns problèmes a priori, mais rien ne se produit non plus...
bonjour,
j'ai un peu le me
même souci que Jirachi07 au début de ce post (pas l'histoire des mails, mais l'histoire de recopie de lignes) , par contre moi je ne recherche pas dans une cellule un "mot"(FCA pour Jirachi07), mais tous les chiffres supérieur à zéro.
de plus si dans la recopie des lignes vers la seconde feuille cela pouvait également recopier la forme de ces mêmes lignes ce serait top.
ps: pour mes essai je suis parti avec exactement les memes noms de classeur et de feuilles que Jirachi07.
merci d'avance à tout ceux qui pourrons m'aider.
christophe
j'ai un peu le me
même souci que Jirachi07 au début de ce post (pas l'histoire des mails, mais l'histoire de recopie de lignes) , par contre moi je ne recherche pas dans une cellule un "mot"(FCA pour Jirachi07), mais tous les chiffres supérieur à zéro.
de plus si dans la recopie des lignes vers la seconde feuille cela pouvait également recopier la forme de ces mêmes lignes ce serait top.
ps: pour mes essai je suis parti avec exactement les memes noms de classeur et de feuilles que Jirachi07.
merci d'avance à tout ceux qui pourrons m'aider.
christophe
Lassé par la pub ? Créez un compte
- Contenus similaires :
Tags :
- ForumVba excel condition supprimer lignes
- ForumExcel vba selection lignes avec condition
- ForumVba copier lignes avec condition
- ForumVba excel copier vers un autre classeur
- ForumCopier lignes apres autofilter vba excel
- ForumCopier coller avec condition vba excel
- ForumVba excel recherche dans classeur
- ForumVba excel creer un classeur
- ForumVba excel save tous les classeur
- ForumVba excel ouvrir classeur
- Voir plus