Fusionner plusieurs sub

Résolu/Fermé
Didier - 15 juil. 2013 à 16:14
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 - 17 juil. 2013 à 20:34
Bonjour,

J'ai un fichier dont je veux générer automatiquement différentes versions dans lesquelles seront supprimées certaines certaines lignes et colonnes selon le service destinataire (j'ai une colonne pour chaque destinataire où je met la valeur 4 si cela a déjà été transmis, comme cela je lui transmet uniquement ce qu'il n'a pas encore eu et supprime les lignes déjà transmises, ici colonne n°22).

J'ai réussi à le faire pour un destinataire, mais je n'arrive pas à le faire 3 fois dans la même sub.

Mon problème est que je lui dit de le faire de la ligne 3 à 300 (le nombre de ligne du fichier pouvant varier) et donc j'ai mis un Exit Sub quand il détecte une cellule vide pour ne pas tourner en boucle (j'ai bien évidemment mis ce test sur une colonne qui est toujours remplie quand la ligne existe). Je voudrais donc lui dire que si la ligne est vide c'est qu'il a finit et qu'il passe à la création suivante (donc recommencer à zéro mais avec d'autres paramètres).

Je précise que j'ai essayé de réintégrer le code complet à la place du exit sub, mais je dois me mélanger les pinceaux et je me retrouve avec des conflits de boucle.

(précision je suis sur Excel 2003)

Merci d'avance ;)


Dim c As String
Dim b, d As Integer

Sub 1()
Dim objWorkbookCible As Workbook
Dim objworkbooksource As Workbook
Set objworkbooksource = ActiveWorkbook
Worksheets(7).Copy
Set objWorkbookCible = ActiveWorkbook
MaDate = Format(Date, "YYYY-MM-DD")
ActiveWorkbook.SaveAs Filename:="C:\Dossier1\" & "Transmission 1 " & MaDate & ".xls"

For b = 3 To 300
Cells(b, 7).Select
c = Selection.Value
If c = "" Then
ActiveSheet.Columns(6).EntireColumn.Delete
ActiveSheet.Columns(26).EntireColumn.Delete
ActiveSheet.Columns(25).EntireColumn.Delete
ActiveSheet.Columns(24).EntireColumn.Delete
ActiveSheet.Columns(23).EntireColumn.Delete
ActiveSheet.Columns(22).EntireColumn.Delete
Exit Sub
End If
Cells(b, 22).Select
d = Selection.Value
If d = 4 Then
ActiveSheet.Rows(b).EntireRow.Delete
b = b - 1
End If
Next
End Sub



12 réponses

Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
16 juil. 2013 à 12:48
Bonjour,
Simplement le mettre sur https://www.cjoint.com/ et poster le lien !

1
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
16 juil. 2013 à 23:14
Bonjour,
Lancer la procédure par touche [Ctrl+Shift+W].
Au passage j'ai adapté vos procédures voir module [lepingou] avec procédure principale [classeurparunité] (les anciennes sont dans le module [Module1]).
Votre fichier : https://www.cjoint.com/?3Gqxnv3FJbf

1
melanie1324 Messages postés 1505 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 31 janvier 2018 154
15 juil. 2013 à 16:29
coucou,

comme je n'ai pas tout compris, je vais te donner un bout de solution :

Dim c As String
Dim b, d As Integer

Sub 1()
Dim objWorkbookCible As Workbook
Dim objworkbooksource As Workbook
Set objworkbooksource = ActiveWorkbook
Worksheets(7).Copy
Set objWorkbookCible = ActiveWorkbook
MaDate = Format(Date, "YYYY-MM-DD")
ActiveWorkbook.SaveAs Filename:="C:\Dossier1\" & "Transmission 1 " & MaDate & ".xls"


b= 3

Cells(b, 7).Select

do while b< 300
if cells(b,7) ="" then
ActiveSheet.Columns(6).EntireColumn.Delete
ActiveSheet.Columns(26).EntireColumn.Delete
ActiveSheet.Columns(25).EntireColumn.Delete
ActiveSheet.Columns(24).EntireColumn.Delete
ActiveSheet.Columns(23).EntireColumn.Delete
ActiveSheet.Columns(22).EntireColumn.Delete

else
Cells(b, 22).Select
d = Selection.Value
If d = 4 Then
ActiveSheet.Rows(b).EntireRow.Delete
b = b - 1
End If
b=b+1
loop
End Sub
0
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
15 juil. 2013 à 23:13
Bonjour,
Juste au passage, il me semble que la [source] et [cible] font référence au même classeur.... !
Set objworkbooksource = ActiveWorkbook 
Worksheets(7).Copy 
Set objWorkbookCible = ActiveWorkbook


0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Bonjour,

Tout d'abord merci d'avoir jeté un oeil sur mon cas ;)

Donc pour préciser, le code que j'ai mis marche très bien, le seul problème c'est que je veux le faire 3 fois en générant à chaque fois un fichier où je vais supprimer des lignes et colonnes différentes (pour les colonnes je lui ai mis manuellement et pour les lignes c'est la partie qui va chercher la valeur en colonne 22). Le tout en passant à la tâche suivante quand il arrive en bas du tableau (donc quand il détecte une ligne vide)

melanie1324 : dans ta réponse le problème est qu'il va me supprimer des colonnes à chaque fois qu'il détecte une ligne vierge, du coup à la fin toutes mes colonnes à partir de la 6ème seront supprimée. (j'ai rajouté un End if avant le b=b+1 à la fin)

Le pingou : possible, c'est un bout de code que j'ai récupéré sur un forum et là j'avoue que je ne comprends pas tout ^^

Je crois que le plus simple serait de vous montrer le tableau mais je ne vois pas où on peu joindre un fichier excel (peut être faut il être enregistré ?)
0
Tiens je ne connaissais pas ce site de partage de fichier, merci ^^

Donc j'ai mis le fichier, il est dispo à cette adresse :
http://cjoint.com/?0Gqoo7X3uFd

Bien entendu j'ai remplacé le contenu de mes feuilles par des suites de caractères au hasard vue que c'était un document de travail.

Donc dedans il y a 4 sub : les 3 que je voudrais fusionner en une seule et celle de melanie1324 que j'ai nommé test.
0
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
16 juil. 2013 à 15:32
Bonjour,
Merci pour le fichier.
A première vue vous avez beaucoup de cellules fusionnées ce qui n'est pas souhaitable (difficulté de traitement).
En survolant vos procédures il n'est pas possible de déterminer à qu'elle feuille elles sont appliquées, pouvez-vous le préciser !

0
Pour les cellules fusionnées, je ne vais pas pouvoir faire autrement malheureusement :/

Les procédures sont appliquées à la feuille 2013, mais de toute façon pour l'exemple j'ai copié toutes les feuilles à l'identique ;)
0
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
Modifié par Le Pingou le 16/07/2013 à 15:43
Bonjour,
En relisant votre premier poste, je suppose que vous désirez, sur la base de la feuille [2013], créer 3 nouveaux classeurs avec une seule feuille formatée avec les informations nécessaire à chacune des 3 unités. Et ceci en une seule commande .... !
Est-ce bien cela..... ?


Salutations.
Le Pingou
0
Exactement, pour l'instant je suis obligé de le faire indépendamment en exécutant l'une après l'autre les 3 macros, mais j'aimerais pouvoir le faire en un seul clic ^^
0
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
16 juil. 2013 à 16:02
Bonjour,
Merci, c'est clair, patience.

0
Bonjour,

Je viens juste d'avoir le temps de regarder.

et bien, comment dire, euh : LA CLASSE !!!!

Maintenant je vais m'amuser à lire le code pour comprendre comment c'est possible de faire une macro qui marche nickel ^^

Merci beaucoup !!!
0
Le Pingou Messages postés 12048 Date d'inscription mercredi 11 août 2004 Statut Contributeur Dernière intervention 26 avril 2024 1 427
17 juil. 2013 à 20:34
Bonjour,
Merci.
En marge, les 3 procédures sont utilisables séparément sans modification, il suffit de la lancer directement par un bouton commande ...¨
Salutations
Le Pingou
0