Votre question

VBA EXCEL : Copier des lignes sous condition d'un classeur à un autre

Tags :
  • Microsoft Excel
  • Programmation
Dernière réponse : dans Programmation
4 Juin 2008 10:39:26

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 !

Autres pages sur : vba excel copier lignes condition classeur

4 Juin 2008 16:10:42

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 ! :sol: 

Bonne continuation
4 Juin 2008 16:20:30

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
Contenus similaires
4 Juin 2008 17:11:09

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
5 Juin 2008 08:21:35

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
5 Juin 2008 13:26:54

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
5 Juin 2008 14:10:39

salut gillou_gre

cela me met pour ShallExecute "erreur de compilation : sub ou function non définie"
5 Juin 2008 16:02:44

Re,

Met un point d'arrêt sur la ligne ShellExecute (placer le curseur sur la ligne + presser F9), lance à nouveau la macro et observe les valeurs des différents paramètres, il y en a sûrement un qui ne lui convient pas.

Bon débogage
5 Juin 2008 16:08:02

re,

je l'ai fait mais quand je lance la macro rien ne se produit...
5 Juin 2008 17:44:00

Tu veux dire que l'exécution n'arrive pas jusqu'au point d'arrêt ? Dans ce cas, place ton point d'arrêt sur la première ligne ("For r = 7 To Infinite") et regarde ce qu'il se passe au fur et à mesure.

Dis m'en plus et je pourrais t'aider plus (© Sarko ;) )
6 Juin 2008 08:19:54

salut,

Je connais mal le débogage mais j'essaye!

j'ai mis un point d'arrêt sur for r = 7 to infinite

je lance la macro avec le signe lecture, la ligne ci-dessous se surligne en jaune et plus rien par la suite en réappuyant sur lecture

quel est le problème docteur ?
11 Juin 2008 15:14:42

en fait ShellExecute est le problème
"fonction ou sub non définie"
11 Juin 2008 15:22:28

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 ?
11 Juin 2008 15:24:57

ç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...
11 Juin 2008 15:37:29

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 ?
11 Juin 2008 15:56:39

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...
16 Juin 2008 08:11:09

ROOOO c'est bon ! c'était infinite qu'il ne connaissait pas !
maitenant ça marche !

il me reste plus qu'a faire en sorte que ça ne marche pas pour les cases vides parce que là ça m'envoie des mails même aux cases vides...
18 Novembre 2008 17:38:31

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
28 Juin 2009 16:48:56

Bonjour,
je me permet de relancer ce topic car j'ai le meme message d'erreur que cité precedemment:
"erreur d'execution '9': Indice en dehors de la plage"

Or ce message s'affiche en continue et ne semble avoir aucun lien avec Word...etc
Si qqun sait comment m'aider ...

Merci d'avance !!
Angron.
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS