[VBA-Débutant] Recopie de ligne et total

Ginko-2k8

XLDnaute Nouveau
Bonjour à toutes et à tous,

Je suis devant un problème insondable pour mes maigres compétences en VBA.

J'ai récupéré un code qui me permet, si une condition (en l'occurence If Int(F_S.Range("H" & Lig_S)) > Int(Date - 7))est remplie de copier une ligne d'une feuille à une autre. Ce code marche impec.

J'ai tenté de modifié cette condition pour que la macro teste si la cellule contient le mot "perspective" au lieu d'une date.

J'ai bien défini ma variable

Set MotCherché = "perspective"

Là ou je bloque c'est pour intégrer dans le code la recherche :

car si je fait If Origine.Cells(L, 1).Value = MotCherché

ça ne marche pas. J'ai donc essayé de modifié la ligne que j'avais dans mon code qui fonctionne en faisant If (F_S.Range("H" & Lig_S).Value = MotCherché

F_S étant la feuille source et L_S la ligne source

mais ça ne marche pas quand meme :(

Je viens donc chercher quelques lumières, ce que je souhaite en gros c'est que la macro recherche dans une colonne précise un mot, et qu'elle copie la ligne entière dans une autre feuille ...

Deuxieme chose, quelqu'un a t-il un bout de code pour faire le total d'une série de ligne sur une colonne donnée ? je me débrouillerai pour l'adapter a mes besoins mais j'ai vraiment besoin d'un tit coup de pouce.

un ptit lien sur le fichier source (sans les données hélas, c'est un poil confidentiel), le code VBA est sur la feuille CDES

Merci d'avance et encore bravo pour ce site et toutes vos contributions !
 

Pièces jointes

  • SYNT.zip
    19.5 KB · Affichages: 29

cbea

XLDnaute Impliqué
Re : [VBA-Débutant] Recopie de ligne et total

Bonjour Ginko-2k8,

Peux-tu essayer ceci ?
Code:
MotCherche = "perspective"
If UCase(F_S.Range("H" & Lig_S).Value[COLOR="Red"])[/COLOR] Like "*" & UCase(MotCherche) & "*"

Pour le 2me problème, plusieurs solutions :
1/ Par boucle
Code:
For Lig = 1 to 10
   valTot = valTot + Range("A" & Lig).Value
Next Lig

2/ Avec une somme directe :
Code:
valTot = Application.WorksheetFunction.Sum(Range("A2:A10"))

3/ En mettant la formule dans la cellule :
Code:
Range("A11").Formula = "=SUM(A2:A10)"
 
Dernière édition:

Ginko-2k8

XLDnaute Nouveau
Re : [VBA-Débutant] Recopie de ligne et total

bon voilà ou j'en suis :

1) j'ai intégré ta suggestion dans mon code ce qui donne ceci (avec l'adaptation à la colonne concernée)

Code:
Private Sub WorkSheet_Open()

'definition des variables fichiers sources et destination'

Dim F_S As Worksheet 'Feuille source
Dim F_D As Worksheet 'Feuille Destination
Dim Lig_S As Long 'Ligne source
Dim Lig_D As Long 'Ligne destination

'Définition des feuilles

Set F_S = Sheets("CAEN.COM") 'feuille source = onglet(CAEN.COM)
Set F_D = Sheets("WORK IN PROGRESS") 'feuille destination = onglet(WORK IN PROGRESS)
Lig_D = F_D.Range("E65536").End(xlUp).Row + 1  ' max ligne en decrementation sur destination.
MotCherche = "perspective"


'Programme *****************************************

For Lig_S = F_S.Range("E65536").End(xlUp).Row To 2 Step -1
'en passant à la ligne précédente par décrémentation (-1)
'Quand la valeur est inférieure à 1, on passe à la ligne suivant Next Lig_S

[COLOR="Red"]If UCase(F_S.Range("E" & Lig_S).Value Like "*" & UCase(MotCherche) & "*") Then[/COLOR]
'E testé contient MotCherche
F_S.Rows(Lig_S).Copy Destination:=F_D.Rows(Lig_D)
'on copie la ligne source sur la ligne destination
Lig_D = Lig_D + 1
'on passe à la ligne destination suivante
'F_S.Rows(Lig_S).Delete
'on efface la ligne source

End If
Next Lig_S

End Sub

donc apparement il manquait une parenthèse sur la ligne cela ne donne pas de message d'erreur que si on la met après le "*" et avant le Then, sinon message d'erreur. Est ce le bon endroit ? (ce qui me semble être le cas).
En tout cas, une fois comme ça, je n'ai pas de message d'erreur mais je n'ai aucune ligne de copié dans mon onglet Work in progress.

Est ce que le fait que les cellules de cette colonne soient avec des liste de choix peut poser un problème (grosso modo, les commerciaux ont 3 choix : commande, perspective, identification)? Je me pose de plus en plus cette question car ce code que j'avais récup ne fonctionne pas non plus, alors qu'il est sensé collé parfaitement à ce que je cherche à faire :

Code:
Private Sub WorkSheet_Open()
Dim MotCherche, L, C, InL, InC, OutL
Dim Origine, Destination
Set Origine = Workbooks(1).Sheets(1)
Set Destination = Workbooks(1).Sheets(2)
MotCherche = "perspective"
InL = Origine.ActiveCell.SpecialCells(xlCellTypeLastCell).Row
InC = Origine.ActiveCell.SpecialCells(xlCellTypeLastCell).Column
OutL = Destination.ActiveCell.SpecialCells(xlCellTypeLastCell).Row
For L = 1 To InL
  If Origine.Cells(L, 1).Value = MotCherché Then
    For C = 1 To InC
      Destination.Cells(OutL, C).Value = Origine.Cells(L, C).Value
      
      Next
      OutL = OutL + 1
    End If
  Next

End Sub

Sinon je vais testé les sommes de suite, mais j'ai compris comment ça fonctionnait donc je pense que ça va être ok.

Merci encore de ton aide !
 
Dernière édition:

cbea

XLDnaute Impliqué
Re : [VBA-Débutant] Recopie de ligne et total

Pour le 1er cas, j'avais oublié une parenthèse dans mon exemple :
Code:
If UCase(F_S.Range("E" & Lig_S).Value[COLOR="Red"])[/COLOR] Like "*" & UCase(MotCherche) & "*" Then
Si cela ne fonctionne toujours pas, peux-tu joindre un fichier ?
 

Ginko-2k8

XLDnaute Nouveau
Re : [VBA-Débutant] Recopie de ligne et total

excellent , en fait c'est bien la position de la parenthèse qui faisait que je n'avais rien dans ma feuille, là ca marche impec !!! t'es un chef ;)

Sinon, j'avais dansl l'idée d'utiliser une de tes suggestions pour faire la somme d'une colonne :

Code:
valTot = Application.WorksheetFunction.Sum(Range("A2:A10"))

celle la me plait bien car je comprends a peu près ce qu'elle fait.

Mais j'ai un doute dans comment l'intégrer dans mon code , et surtout comment faire pour que le resultat s'affiche dans une cellule bien définie.

je pensait la mettre a la fin de ma boucle de copie de ligne, mais je ne sais pas définir la cellule cible qui doit afficher le resultat ...

En tout cas merci mille fois pour ton aide !

Une toute derniere chosei, comment se fait-ce que mon code d'origine (celui pour copier les ligne en fonction de la date)ne copie pas toute la ligne alors que le tiens copie tout bien comme il faut ??

Peut etre qu'en modifiant
Code:
If UCase(F_S.Range("E" & Lig_S).Value) Like "*" & UCase(MotCherche) & "*" Then
en
Code:
If UCase(F_S.Range("H" & Lig_S).Value) Like "*" & UCase(Recherche) & "*" Then

si je définie Recherche = (Date - 7).

Qu'en penses tu ? je ne suis pas très sur de moi car je ne comprends pas bien pourquoi ta syntaxe marche avec UCase, et pas la mienne sans :)
 
Dernière édition:

Ginko-2k8

XLDnaute Nouveau
Re : [VBA-Débutant] Recopie de ligne et total

sans problème, je te joins le fichier tel qu'il est architecturé actuellement (j'ai du enlever des onglet et des données, mais ca ne me posera pas de soucis je pense de les réintégrer dans le code)

Le code qui ne semble pas fonctionner correctement est dans CDES

Celui qui copie tout presque bien est dans WORK IN PROGRESS

Par contre j'ai fait un peu dans la facilité, car j'ai dupliqué le code qui copie les ligne d'une feuille sur ma feuille Work in progress, de manière à ce que chaque feuille soit copiée l'une à la suite de l'autre.

Mais j'ai une petite erreur à la fin de la procédure

Erreur d'exécution '9'

L'indice n'appartient pas à la selection.

Je n'arrive pas à trouver où j'ai fait une erreur ... alors peut -etre cela viens t-il d'une de mes feuilles de données ...

Merci encore de ton aide, je ne peux malheureusement pas être connecté tout le temps car l'accès internet de mon bureau est derriere un firewall et je n'ai pas encore l'accès, donc je fait le va-et-vient entre mon bureau et la salle technique ou ils ont un accès internet indépendant du reseau de l'entreprise :D
 

Pièces jointes

  • SYNTH-WIP.zip
    31.5 KB · Affichages: 27

cbea

XLDnaute Impliqué
Re : [VBA-Débutant] Recopie de ligne et total

J'ai simplifié les procédures en évitant de recopier des parties de procédures autant de fois qu'il y avait de feuilles.

J'ai corrigé le test sur la date.
En fait, il faut comparer les dates en mettant
Code:
If CLng(F_S.Range("H" & Lig_S)) > CLng(Date - 7) Then

Peux-tu faire un test pour voir si cela fonctionne ?

Merci
 

Pièces jointes

  • SYNTH-WIP_v1.zip
    24.3 KB · Affichages: 39

Ginko-2k8

XLDnaute Nouveau
Re : [VBA-Débutant] Recopie de ligne et total

je check ça de suite, par contre aurait tu la gentillesse, sans vouloit abuser, de m'expliquer un peu ce que font ces instructions ? J'aime bien assimiler les choses, et là, tu me mâches le boulot, faut quand même que j'apprenne aussi, non ???? ;)

[EDIT]
Alors la parties dans perspectives marche impec , donc ton code est OK , chapeau bas !


PAr contre je me retrouve avec un souci que je venais juste d'avoir pour la macro de la feuille CDES : en mettant a jour les données des différents feuillets avec les derniers que j'ai eu de mes commerciaux, la macro me sort des lignes qui ne sont pas comprises dans Date - 7, et qui ne sont pas des commandes...

Je me demande si finalement, il ne serait pas plus simple de tester d'abord si la colonne E contient "Commande" ou Perspective" et ensuite de faire un tri sur la date.

Déjà parce que la formule que tu as eu la bonté de me montrer fonctionne parfaitement (du moment que mes gentils commerciaux utilisent la colonne E pour le type d'affaire ;) ) et surtout, et là je viens de m'apercevoir de mon erreur à la base, c'est que je vais avoir des perspectives qui sont incluses dans Date - 7, donc à la base mon argument de sélection n'est pas valable.

Qu'en penses tu ?
 
Dernière édition:

cbea

XLDnaute Impliqué
Re : [VBA-Débutant] Recopie de ligne et total

Pas de souci, voici les explications :
Dans la feuille "CDES" :
Code:
    ' Boucle sur toutes les feuilles du classeur
    For Each wsFeuil In ThisWorkbook.Worksheets
        If wsFeuil.Name <> "START" And wsFeuil.Name <> "PERSPECTIVE DATA" And _
            wsFeuil.Name <> "WORK IN PROGRESS" And wsFeuil.Name <> "CDES" Then
    
            Call CopieLigneCDE(wsFeuil)
        End If
    Next wsFeuil
Il s'agit d'une boucle sur toutes les feuilles du classeur.
Cette procédure permet d'éviter de dupliquer x fois le code se trouvant dans la procédure CopieLigneCDE.

La procédure "CopieLigneCDE" s'exécute pour toutes les feuilles sauf pour les feuilles "START", "PERSPECTIVE DATA", "WORK IN PROGRESS" et "CDES".

La procédure "CopieLigneCDE" permet de copier les lignes de la feuille de données vers la feuille destination en vérifiant que la date soit supérieure à la date du jour - 7.

Idem pour la feuille "WORK IN PROGRESS" mais cette fois, la vérification porte sur "*perspectives*".


Comment se déclenche la mise à jour des feuilles "CDES" et "WORK IN PROGRESS" ?
 

Ginko-2k8

XLDnaute Nouveau
Re : [VBA-Débutant] Recopie de ligne et total

donc comme je te le disais plus haut, l'exécution dans WORK IN PROGRESS marche impec, j'ai bien tout sauf quand l'info n'est pas dans la colonne E, mais c'est pas grave ça.

Par contre quand j'exécute sur CDES, là il me sort des lignes qui ne sont pas dans la range Date - 7, et je n'ai aucune ligne concernant les commandes prises alors que j'ai des projet identifiés au 15/02/2008 qui sont copiés. Je test en modifiant la colone E et en copiant le code de WORK IN PROGRESS voir si j'arrive à mon résultat ;)

[EDIT] voilà, ça marche beaucoup mieux en utilisant la meme methode que dans WORK IN PROGRESS. j'ai bien tout mes commandes et uniquement ça ! Je vais en rester la pour ces parties, car c'est le plus gros du travail , le reste je peux le faire à la main avec les bonnes formules.

Une dernière question et je pense que je pourrais voler de mes propres ailes pour ce projet :

J'aurai souhaiter que sur ma page START j'ai deux bouton pour lancer les importations de données, malheureusement je ne comprends pas comment marchent ces satanées boutons ... tu aurais un tuyau svp ?

En tout cas,mille merci pour ton aide, j'ai beaucoup appris aujourd'hui !!
 
Dernière édition:

Ginko-2k8

XLDnaute Nouveau
Re : [VBA-Débutant] Recopie de ligne et total

Oups, en fait ton code marche, c'est juste que je n'avais pas de commandes comprises dans la tranche de dates concernées ;) Encore désolé.

Ptites questions pour plus tard : Je peux imbriquer ma condition de date et ma condition de contenu de cellule dans la meme macro afin de faire un tri plus poussé ? ou il vaut mieux que je fasse une Sub séparée, pour que la macro traite d'abord le contenu de cellule puis ensuite la validité de date ?


Ensuite, cette partie là :

Code:
  If wsFeuil.Name <> "START" And wsFeuil.Name <> "PERSPECTIVE DATA" And _
            wsFeuil.Name <> "WORK IN PROGRESS" And wsFeuil.Name <> "CDES" Then
supporte combien d'occurence d'exclusion de feuille ?
 
Dernière édition:

cbea

XLDnaute Impliqué
Re : [VBA-Débutant] Recopie de ligne et total

1/ Tu peux imbriquer les 2 conditions :
Code:
        If IsDate(F_S.Range("H" & Lig_S)) And UCase(F_S.Range("E" & Lig_S).Value) Like "*" & UCase(MotCherche) & "*" Then
            'évite les erreurs si titre
            If CLng(F_S.Range("H" & Lig_S)) > CLng(Date - 7) Then

2/ Tu peux mettre autant d'exclusions que tu veux.
 

Discussions similaires

Réponses
6
Affichages
330

Statistiques des forums

Discussions
312 113
Messages
2 085 422
Membres
102 886
dernier inscrit
eurlece