Tom's Guide > Forum > Programmation > VBA EXCEL : Copier des lignes sous condition d'un classeur à un autre

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

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

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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 !


Message édité par Jirachi07 le 04-06-2008 à 10:40:41
Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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

Répondre à gillou_gre

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


Message édité par Jirachi07 le 04-06-2008 à 16:24:09
Répondre à Jirachi07

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

Répondre à gillou_gre

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


Message édité par Jirachi07 le 05-06-2008 à 08:23:03
Répondre à Jirachi07

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

Répondre à gillou_gre

salut gillou_gre

cela me met pour ShallExecute "erreur de compilation : sub ou function non définie"

Répondre à Jirachi07

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

Répondre à gillou_gre

re,

je l'ai fait mais quand je lance la macro rien ne se produit...

Répondre à Jirachi07

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 ;))

Répondre à gillou_gre

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 ?

Répondre à Jirachi07

en fait ShellExecute est le problème
"fonction ou sub non définie"

Répondre à Jirachi07

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 ?

Répondre à gillou_gre

ç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...


Message édité par Jirachi07 le 11-06-2008 à 15:29:32
Répondre à Jirachi07

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 ?

Répondre à gillou_gre

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...

Répondre à Jirachi07

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...

Répondre à Jirachi07

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

Répondre à hyundai67

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.

Répondre à Angron
Tom's Guide > Forum > Programmation > VBA EXCEL : Copier des lignes sous condition d'un classeur à un autre
Aller à :

Il y a 566 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Liens