Pb macro excel

Fermé
Utilisateur anonyme - 11 mai 2010 à 12:29
 Utilisateur anonyme - 29 mai 2010 à 22:47
Bonjour,

J'ai une macro qui me permet de masquer certaines lignes d'un tableau de la Feuil3 en fonction de la valeur de la cellule D4 de la Feuil1 : Macro1

En utilisant l'enregistreur de macro afin de copier coller le résultat de cette macro (ie les lignes restant affichées) sur une autre feuille donnée, j'obtiens la Macro2

Je voudrai combiner ces deux macros afin de pouvoir coller directement les lignes restant affichées selon le service sur une autre feuille. J'utilise la Macro3

Pourquoi ça ne marche pas ?

Merci d'avance

Elsie

A voir également:

32 réponses

Utilisateur anonyme
11 mai 2010 à 12:29
Sub Macro1()
Dim i As Integer
Dim cel As Range
Dim x
Application.ScreenUpdating = False
Sheets(3).Select
x = Sheets(1).Range("D4")
[A2:A10000].EntireRow.Hidden = True
For i = 10000 To 2 Step -1
If Range("A" & i) = x Then
Range("A" & i).EntireRow.Hidden = False
End If
Next i
Application.ScreenUpdating = True
End Sub
0
Utilisateur anonyme
11 mai 2010 à 12:30
Sub Macro2()
Range("A2:D15").Select
Selection.Copy
Sheets(4).Select
Range("A2").Select
ActiveSheet.Paste
End Sub
0
Utilisateur anonyme
11 mai 2010 à 12:31
Sub Macro3()
Dim i As Integer
Dim cel As Range
Dim x
Dim y
Application.ScreenUpdating = False
Sheets(3).Select
x = Sheets(1).Range("D4")
y = Sheets(1).Range("K1").Value
[A2:A10000].EntireRow.Hidden = True
For i = 10000 To 2 Step -1
If Range("A" & i) = x Then
Range("Ai:Di").Select
Selection.Copy
Sheets(y).Select
Range("A2").Select
ActiveSheet.Paste
End If
Next i
Application.ScreenUpdating = True
End Sub
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
11 mai 2010 à 12:49
Salut,
C'est un devoir de classe ou vous avez 2 pseudos?????
0
Utilisateur anonyme
11 mai 2010 à 14:11
Bonjour pijaku,

J'ai renvoyée deux fois le même post car je ne sais pas pourquoi mais il ne s'affichait pas ce matin .
Pour ce qui est de ma réponse à Mike ben en fait Elsie et Laure c'est moi confère mon pseudo elsielaure.

Le doublon a été supprimé.

Merci pour ton aide
bon je vais lire ta réponse

Elsie
0
Bonjour,

J'ai essayé d'appliquer ta macro , ça me met cette ligne en jaune :
.Range("Ai:Di").copy Sheets(y).Range("A65536").End(xlUp).Offset(1, 0)

en fait je ne veux rien masquer du tout dans le tableau de la Feuil3.
je voudrai à partir du tableau de la Feuil3 obtenir d'autres tableaux qui reprennent en fait quelques lignes de celui de la Feuil3 en fonction des valeurs D4 et K1 de la Feuil1...

Merci d'avance

Elsie
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
Modifié par pijaku le 11/05/2010 à 15:33
Alors on récapitule :
En feuille 1 :
- D4 = valeur permettant de ne sélectionner que les lignes intéressantes. Cette valeur se retrouvera Feuille 3 colonne A
- K1 : y est inscrit le nom de la feuille de destination, là ou on va coller les données sélectionnées
En feuille 3 colonne A : la liste ou on doit chercher la valeur contenue en Feuille1 D4
Le code :

Sub copie_lignes_selon_selection() 
Dim i, derlig As Integer 
Dim nomfeuil As String 
Dim val 
With Sheets("Feuil1") 
val = .Range("D4").Value 
nomfeuil = .Range("K1").Value 
End With 
With Sheets("Feuil3") 
derlig = .Range("A65536").End(xlUp).Row 
For i = 2 To derlig 
If .Cells(i, 1).Value = val Then 
.Range(.Cells(i, 1), .Cells(i, 4)).Copy Sheets(nomfeuil).Range("A65536").End(xlUp).Offset(1, 0) 
End If 
Next i 
End With 
End Sub
0
Re,

Je ne sais pas pourquoi mais ça me met : With Sheets("Feuil1") en jaune alors j'ai remplacé par With Sheets(1) puis With Sheets("Feuil3") en jaune, j'ai remplacé par With Sheets(3)
et enfin ça en jaune : .Range(.Cells(i, 1), .Cells(i, 4)).Copy Sheets(nomfeuil).Range("A65536").End(xlUp).Offset(1, 0)

là je ne sais pas quoi remplacer...

en fait dans la cellule K1 on a le numéro de la feuille où doivent être collée les valeurs
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
11 mai 2010 à 16:18
dans la déclaration des variables (je ne sais pas si cela va changer quelque chose) change :
Dim nomfeuil As String par Dim nomfeuil As Integer
Si cela ne fonctionne pas, fais une copie de ton classeur, sans données confidentielles, poste la sur cjoint.com et viens copier ici le lien que tu auras créé.
0

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

Posez votre question
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
11 mai 2010 à 17:56
Salut,

A quoi joues tu exactement, tu ouvres des discussions multiples avec des pseudos différents sur le même sujet que nous devons fermer,
tu demandes que l'on te modifie un code que je t'ai écrit sur une autre discussion pour une action spécifique et rien à voir avec ta demande.
De quoi s'agit-il exactement, pour voir si je m'intéresse
0
Bonsoir,

Je me suis expliquée et excusée pour le doublon de ma question. Mon 1er post n'apparaissait pas, j'en ai envoyé un 2nd ... au final il y en a eu deux.

Je pensais pouvoir adapter les macros que tu avais écris pour moi la dernière fois à cette nouvelle problématique. Le tableau que j'avais conçu en y mettant les macros a été refusé...donc j'ai proposé autre chose...mais faut croire que je ne m'y connais même pas assez pour les modifier correctement....

Elsie
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
11 mai 2010 à 20:51
re-
Mike n'hésite pas à continuer ce sujet si tu veux. Tu l'as commencé donc... c'est toi qui voit.
Bonne soirée
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
11 mai 2010 à 22:21
Salut Pijaku,

Ces temps ci, j'ai peu de temps à moi et limite mes interventions sur des sujets rapidement traités.
Ce qui m'a poussé à intervenir est la reconnaissance de mon code que j'avais dû revoir à plusieurs reprises pour causes de données évolutives.
Je ne sais pas exactement ce que veut faire Elsielaure comme pour la première demande d'ailleurs.
Il faudrait qu'elle expose clairement ce qu'elle cherche à faire avec un fichier exemple annoté ici j'ai ça et voudrai obtenir ce résultat etc ...cela nous fera gagner beaucoup de temps en écrivant un code spécifique aux nouvelles exigences.
Cordialement
Mike-31
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
Modifié par pijaku le 12/05/2010 à 07:50
salut Mike,
Si cela ne te dérange pas, et si j'ai un peu de temps aujourd'hui je vais regarder ce classeur que Laure nous a joint.
Bonne journée
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
12 mai 2010 à 10:49
Salut Pijaku,

Pas de problème, d'après le fichier joint qui se présente un peu comme celui que j'ai traité précédemment, en D4 la valeur correspond à un service, mais après que doit faire le code et sur quelle feuille !
ou fauit il ajouter une cellule pour sélectionner le feuille !
A+
Mike-31
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
Modifié par Mike-31 le 12/05/2010 à 23:46
Re,

Si tu répondais aux post ce serait plus facile.
Bien que tu ai posé la question à mon ami Pijaku, ces deux lignes permettent justement d'accélérer le code et suppriment les déplacements sur la feuille et le scintillement de la feuille dû aux déplacements
Application.ScreenUpdating = True
Application.ScreenUpdating = False

Pour ton code si tu expliquais clairement ce que tu veux faire, à partir de la cellule D4 je comprends que tu sélectionnes un service que l'on retrouve sur la feuille Tous et d'après le code tu copies les valeurs dans les feuilles 1010 pour le service 10, 1020 pour le service 20 etc ...
Si c'est ce que tu cherches, ton code ressemble plus à une usine à gaz et peut être simplifié.
Si tu dois ventiler tous les services dans les feuilles correspondantes le code peut être plus simple.
Si c'est que tu cherches, reste à savoir si tu souhaites copier ou couper le code dans les feuilles correspondantes
Si tu optes pour le copier des données il va falloir mettre un détrompeur pour ne pas copier deux fois les valeurs

Un exemple écrit pour une autre discussion avec copie de données dans deux feuilles que tu peux tester ainsi que ces deux lignes

Application.ScreenUpdating = True
Application.ScreenUpdating = False

Neutralisées par une apostrophe à tester puis effacer l'apostrophe devant les lignes et réessayer tu comprendras

https://www.cjoint.com/?fmxMYnfiUZ

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
Bonsoir Mike,

Merci pour ton aide !

Trop bien : Application.ScreenUpdating = True et Application.ScreenUpdating = False; justement je ne comprenais pas pourquoi mon écran réagissait ainsi....

Ce que je voudrai en fait c'est sélectionner de manière aléatoire parmi les lignes d'un même service du tableau de tous quelques unes les copier puis les coller dans la feuille du service correspondant.

Je voudrai arriver au résultat que j'obtiens en exécutant les 3 macros du fichier de mon précédent post. Je ne sais pas si c'est possible en une macro. Là j'en ai une pour copier coller, une autre qui sélectionne en coloriant certaines lignes et une autre qui affiche que les lignes coloriées.

Associer ce code à un bouton de la feuille 1 où à la cellule D4 de la feuille1.
Je voudrai par la suite envoyer chaque tableau au service concerné automatiquement avec un UserForm comme m'avait montré Zebulon2503 dans l'autre post.

Elsie
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
13 mai 2010 à 11:36
Re,

Application.ScreenUpdating n'est pas utilisable ou utile dans tous les codes, mais si on utilise avec false au début, il ne faut pas oublier de le remettre en True à la fin du code.

Pour en revenir à tes codes, quelque peu biscornus

Avec la macro 1 et 2, tu veux copier les valeurs correspondantes au service sélectionnées en D4 dans la feuille correspondante exemple 10 copier feuille1010
Jusque là le code est très simple

Ensuite la macro3 que doit-elle faire !

Pour terminer les formule en K1 et L1 servent à quoi, juste pour sélectionner la feuille de destination dans la macro3 !
si je vois bien, le code est très simple
0
Bonjour,

Non c'est que la macro 1 qui fait le copier coller ; la 2 permet de colorier certaines des lignes copiées collées selon une formule inscrite sur la Feuil1 en C11 ; la macro 3 elle, permet de n'afficher que les lignes coloriées.

D'ailleurs là ça me fait penser au lieu de masquer les lignes non coloriées, il faudrait plutôt que je les supprime.

C'est possible d'affecter ces 3 macros à un seul bouton ou une seule cellule ?

La formule en K1 permet de selectionner la feuille de destination et est aussi liée à la formule en B3 pour le titre. Celle en L1 .. heuu je vais voir.

Elsie
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
Modifié par Mike-31 le 13/05/2010 à 14:02
Re,

Alors les trois macros que tu as mis en haut de la discussion ne correspondent pas à tes besoins, (macro1 masque des lignes, la 2 copie et la 3 fait référence à D4 et K1)

En C11 la formule =ALEA()*(C10-1)+1 pourquoi C10-1)+1 si en C10 tu as 8 ce qui fait 8-1+1 c'est toujours = à 8 soit tu écris =ALEA()*(C10)+1
ou même simplement
=ALEA()*C10 ou =C10*ALEA()

le mieux est de tout est que tu reexpliques ton problème

A partir de la ligne D4 tu souhaites copier les valeurs correspondantes au service sur la feuille du service jusque la pas de problème

Ensuite quelles lignes, sur quelle feuille et comment veux tu les coloriser, exemple si en C11 la valeur est 4
A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
Utilisateur anonyme
13 mai 2010 à 14:49
Re,

« A partir de la ligne D4 tu souhaites copier les valeurs correspondantes au service sur la feuille du service jusque la pas de problème » c'est la macro compléter_feuilles qui fait cela.

Oui ensuite je veux sélectionner de manière aléatoire quelques unes de ces lignes grâce à la formule en C11 de la feuille 1. Pour cela j'ai utilisé la macro colorisation ; afin de pouvoir différencier les lignes sélectionnées des autres.

Et comme ce sont les seules lignes qui m'intéressent j'ai utilisé la macro1 afin de masquer les lignes non coloriées. Mais je voudrai plutôt les supprimer, car elles ne serviront pas.

https://www.cjoint.com/?fmxMYnfiUZ

en exécutant les 3 macros là, on obtient le résultat que je veux au final.

Suis-je claire là ?

Elsie
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
17 mai 2010 à 14:19
Salut,

Après ce long week-end end juste quelques modifs à tes macros

Dans la Thisworkbook allongé la prise de l'effacement qui s'arrêtait à la feuille 1060
Dans le cas de procédures en chaine, il vaut mieux conserver des codes bien séparé et soit créer une macro qui regroupe dans l'ordre le nom des macros qui doivent s'exécuter ou à la fin de la procédure comme je l'ai fait dans
Sub completer_feuilles()
Il est plus facile de retrouver des erreurs ou modifier un code.

Sur la feuille Test, j'ai supprimé les données inutiles en K1, L1 etc

En B3 je suis passé par une concatenation ce qui revient au même, ainsi que dans le code. Les données en J et K peuvent être masquée.

En haut de chaque feuille j'ai créé des formules pour faire patienter lors du déroulement des macros, le temps est plus ou moins long en fonction du nombre de ligne à traiter
En E1 le nombre de ligne
En F1 une barre de défilement de 0 à 100%
Ou en H de 100% à 0
En F et H1 des barres de défilement

https://www.cjoint.com/?frosWUhNBz
0
Utilisateur anonyme
17 mai 2010 à 17:01
Re,

Super les bandes pour attendre !

Encore une chose...

La macro de la Feuil1 s'exécute lorsqu'une valeur change sur la feuille « Test », que dois-je modifier pour que ce soit uniquement la modification de la cellule D4 qui exécute la macro.

Sur propriété de la feuille 1 j'ai la macro ci-dessous qui regroupe toute les autres :

Private Sub Worksheet_Change(ByVal Target As Range)
Call completer_feuilles
Call colorisation
Call Supprimer_ligne_inutile
Call SendMail
End Sub

Merci d'avance

Elsie
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
17 mai 2010 à 18:10
Re,

Si tu travailles sur mon fichier, j'ai intégré les codes à la fin de la première macro.

dans la propriétés de la feuille Test (SendMail qui est censé faire quoi)

Private Sub Worksheet_Change(ByVal Target As Range)
Call completer_feuilles
Call SendMail
End Sub


Pour les barres de défilement, il n'est peut être pas nécessaire de conserver la barre progressive et dégressive ainsi que les % de progressions et dégressifs. Suivant le cas il faudra peut être compléter avec une conditionnelle
Ces barres ne fonctionnent que si la fonction Application.ScreenUpdating n'est pas utilisée en début et evidemment en fin de procédure
0
Bonjour,

la macro sendmail afin d'envoyer la feuille choisie est la suivante

Function SendMail()
Dim y As String
Dim x As Integer
y = Sheets(1).Range("M1").Value
x = Sheets(1).Range("K1").Value
' Copy the sheet(1)
ThisWorkbook.Sheets(x).Copy
' Send Email
With ActiveWorkbook
.SendMail Recipients:=y, Subject:="test" & Format(Date, "dd/mmm/yy")
.Close SaveChanges:=False
End With
End Function

j'ai donc ceci sur les propriétés de la feuille 1:

Private Sub Worksheet_Change(ByVal Target As Range)
Call completer_feuilles
Call colorisation
Call Supprimer_ligne_inutile
Call SendMail
End Sub

je voudrai que cette macro se déclenche uniquement quand la cellule D4 est modifiée.

Merci d'avance.

Elsie
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
Modifié par Mike-31 le 18/05/2010 à 13:55
Re,

Avec Function SendMail()
que veux tu envoyer le classeur ou simplement la feuille sélectionnée après le filtrage !

y = Sheets(1).Range("M1").Value
en M1 qu'as tu !

x = Sheets(1).Range("K1").Value
en K1 tu avais une valeur qui tu permettait d'utiliser la RECHERCHEV

sans me donner l'adresse, ou veux tu expédier, à une adresse fixe saisie dans le code ou dans une cellule ou encore à saisir avant l'envoi !

que veux tu expédier uniquement la feuille issue de la sélection (Ex. si en D4 tu sélectionnes 10, tu veux envoyer la feuille 1010) ou copier le contenu de cette feuille dans ton mail

Avec quelle messagerie veux tu expédier, Outlook, Outlook express, Incredimail, ...

A+
Mike-31

Une période d'échec est un moment rêvé pour semer les graines du savoir.
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 mai 2010 à 14:33
Salut Mike,
Je reviens sur ce sujet.
En fait pour le mail, Elsie ne veux envoyer qu'une feuille (celle dont le n° apparait en K1) par Outlook.
On a déjà pas mal avancé sur ce sujet mais là je bloque....

Remarque : je ne sais pas si tu auras le courage de lire toute notre discussion...
Bonne journée à toi en tout cas.
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
18 mai 2010 à 15:19
Salut Pijaku,

Ce genre de lecture n'est pas ma tasse de thé, c'est pour cela que je pose souvent des questions déjà posé et noyées dans le flot des posts.

Sais tu, pour la messagerie, Outlook ou Outlook Express

Cordialement
0
Re Bonjour Mike, Pijaku,

Avec votre aide j'en suis là :

https://www.cjoint.com/?fspJdiUHq1

Le problème c'est ce que la macro "Envoyer_Fichier" ne me permet pas de mettre en forme mon message. Il me l'écrit tout à la suite.

J'obtien ceci : Bonjour,Vous trouverez ci-joint le tableau de Contrôle pour votre service.Merci de bien vouloir me faire un retour avec vos corrections.Cordialement, Elsie

Au lieu de ceci :

Bonjour,

Vous trouverez ci-joint le tableau de Contrôle pour votre service.
Merci de bien vouloir me faire un retour avec vos corrections.

Cordialement,

Elsie


Le message texte et le fichier sont envoyé via outlook.

Function Envoyer_Fichier()
Dim y, chemin, nom As String
Dim x As Integer
Dim ol As Object, myItem As Object
chemin = ActiveWorkbook.Path
y = Sheets(1).Range("M1").Value
x = Sheets(1).Range("K1").Value
nom = "Contrôle Aléatoire du Service " & Sheets(x).Name
ThisWorkbook.Sheets(x).Copy
ActiveWorkbook.SaveAs chemin & "\" & nom
Set ol = CreateObject("outlook.application")
Set myItem = ol.CreateItem(olMailItem)
myItem.To = y
myItem.Subject = "Contrôle Aléatoire des NBPORT"
myItem.Body = "Bonjour, " & "" & "Vous trouverez ci-joint le tableau de Contrôle Aléatoire des NBPORT pour votre service. " & "" _
& "Merci de bien vouloir me faire un retour avec vos corrections. " & "" & "Cordialement, " & "" & "Votre CSO. "
myItem.Attachments.Add ActiveWorkbook.FullName
myItem.Send
Set ol = Nothing
ActiveWorkbook.Close
End Function
0
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 745
18 mai 2010 à 16:15
as tu essayé ma dernière solution dans l'autre sujet???
@ Mike : je m'en doutais... C'est avec Outlook, il me semble.
0
Mike-31 Messages postés 18318 Date d'inscription dimanche 17 février 2008 Statut Contributeur Dernière intervention 26 avril 2024 5 078
19 mai 2010 à 09:49
Salut,

la syntaxe de retour paragraphe est vbCrL

myItem.Body = "Bonjour" & vbCrLf & vbCrLf & vbCrLf & "Vous trouverez ci-joint le tableau de Contrôle Aléatoire des NBPORT pour votre service." & vbCrLf & "Merci de bien vouloir me faire un retour avec vos corrections." & vbCrLf & "Cordialement," & vbCrLf & vbCrLf & vbCrLf & "Elsie."


Dès que j'ai un moment, j'apporte une petite modif au code de notre ami Pijaku et t'envoi un exemple.
Si l'adresse mail pour l'envoi de tes mails est unique il est possible de l'intégrer dans le code et la supprimer de la cellule M1 ce qui évitera des lien inutiles.
D'autre part le code génére un fichier dans le même répertoire est il nécessaire ou souhaites tu archiver le ou les derniers envoi
0
Bonjour Mike,

Oui pour le vbCrL Pijaku me l'avais proposé hier...j'avais du faire une erreur en utilisant...

Voici mon dernier fichier : https://www.cjoint.com/?ftkyrSlmhs

J'aimerai masquer les feuilles 4 à 11, mais là les macros ne fonctionnement plus correctement sauf completer_feuilles ?!?

Aussi ensuite j'aimerai bloquer certaines cellules, je ne sais pas si cela va bousiller les macros.

J'aimerai en fait que lors de l'exécution de la macro Traitement, le fichier reste ouvert sur la feuille 1. L'utilisateur verra le détail du fichier envoyé en cliquant sur un autre bouton qui affichera la feuille x (x variant de 4 à 11).

Non l'adresse du destinataire varie en fonction de la feuille, là j'ai 8 emails mais cela pourrait changer. Non je ne souhaite pas nécessairement archiver les derniers envois, vu que je les aurais déjà dans mon mail.

Ça serait vraiment très très très gentil de ta part de modifier les macros dans ce sens

Elsie
0
Mince, les copies des feuilles x (4 à 11) ne conserve pas la mise en forme(validation de donnée) que j'ai crée dans mon fichier.... que faire?
0