Problêmes macros excel

Fermé
elGuitou - 19 mars 2008 à 08:26
 elGuitou - 21 mars 2008 à 10:40
Bonjour,
j'aimerais une petite aide sur deux macros que je n'arrive pas à faire.

J'utilise un fichier excel que je dois mettre à jour toutes les semaines. Pour cela, dans un tableau, je fais un "copier/coller" de la colonne de la semaine n sur la semaine n+1. Les formules de la colonne n sont donc incrémentées dans celle de la semaine n+1. Une fois que cela est effectué je fais un "copier/coller valeur" de la colonne n sur cette même colonne n pour figer les valeurs.
Il me faudrait donc une macro permettant cela, et d'après les premiers essais que j'ai réalisé (qui ont malheureusement tous échoués...) peut être qu'une boucle If permettant de savoir si la colonne n est vide ou déjà utilisée serait utile, voire nécessaire, afin de copier la dernière semaine.

Pour la deuxième macros, je crois qu'en fait je vais attendre un peu. Si déjà je pouvais avoir quelques réponses pour la première ca serait pas mal.

Merci par avance.
A voir également:

14 réponses

michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 mars 2008 à 08:46
Bonjour,

Mets nous un extrait de ton classeur sans données confidentielles sur www.cjoint.com. On pourra mieux comprendre ce que tu désires.
0
ok, voici le lien :

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

Dans ce fichier j'ai supprimer les formules de la derniere semaine, mais cela n'a pas d'incidence. J'espere que ca sera suffisant.
et tant qu'à faire je me lance dans le deuxième problème en fait, ca sera fait... Toujours pour ce même dossier (ce tableau n'étant qu'une toute petite partie du fichier que j'utilise, mais le raisonnement sera le même), mes tableaux ne comportent que 21 colonnes, soit 21semaines... or dans une année il y a 53 semaines... je suis donc amené, à un certain moment à faire des regroupements de semaines. Pour cela je regroupe par mois, en faisant la moyenne des semaines de chaques mois. J'aimerais donc trouver une macro qui lorsque je me place sur une semaine particulière (par rapport au fichie jointr on va se placer sur la case "C2") pouvoir activer une macro qui me remplace cette semaine par la moyenne des semaine 01 , 02 , 03 et 04 par exemple.
J'espere que cela est suffisament clair.

et encore merci aux personnes qui prendront le temps de m'aider.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 mars 2008 à 12:16
Re,

voici une proposition:

Sub passer_anouvelsem()
Dim dercol As Byte
'dernière colonne utilisée
dercol = Range("IV2").End(xlToLeft).Column
'recopie sur une nouvelle semaine
Columns(dercol).Copy Columns(dercol + 1)
'garde que les valeurs dans semaine de départ
With Columns(dercol)
.Copy
.PasteSpecial Paste:=xlValues
End With
End Sub

J'ai modifié le format personnalisé de la ligne des semaines au lieu de 0_) mets 00 ce qui permet d'avoir des nombres plutôt que du texte. tu écris 1 en C2 et en C3 tu écris la formule :
=C2+1 jusqu'à ta semaine en cours
La nouvelle semaine sera incrémentée avec la macro.

Pour la 2° question, je regarderai ct'aprem si j'ai un peu de temps.
Remarque préalable: Un mois dure plus de 4 semaines et la semaine 05 peut être à cheval sur le mois 1 et le mois 2; de même pour la semaine 01 (mois-1 et mois1) donc, précise ce que tu compte faire

dis moi si la 1° réponse te convient.

Michel
0
Tout d'abord merci pour cette première macros. Je viens de vérifier sur le fichier exemple et elle marche très bien. Cependant, (la question va surement paraitre idiote, mais mon niveau de programmation est plus que limité!!), lorsque je l'inserre dans mon fichier, la copie se fait sur la première colonne à partir de A1 et non pas sur mon tableau. Mon tableau est situé sur la plage (AQ220:BK270). Je dois surement utiliser la fonction Range, mais je n'y arrives pas. Une petite aide serait très utile!

Ensuite pour la seconde question, dans la logique que j'utilise, il y a 4 ou 5 semaines possible. Je prends en compte les lundis de chaques semaine. Si dans mon mois il y a 4 lundis, mon mois comportera 4 semaines, et réciproquement, s'il y a 5 lundis dans le mois, il y aura 5 semaines.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 mars 2008 à 14:25
Re,

macro modifiée:

Sub passer_a_nouvelsem()
Dim dercol As Byte
Dim col As Range
'dernière colonne utilisée
dercol = Range("IV220").End(xlToLeft).Column
'plage de la dernière semaine
Set col = Range(Cells(220, dercol), Cells(270, dercol))
'recopie sur une nouvelle semaine
col.Copy Cells(220, dercol + 1)
'garde que les valeurs dans semaine de départ
With col
.Copy
.PasteSpecial Paste:=xlValues
End With
Set col = Nothing
End Sub

Quant à la 2° question ce n'est pas de la tarte:
Suvant l'année par exemple Janvier peut comporter 4 ou 5 lundis, Février peut être bissectile ou pas... Il faut compter que tu nous indiques une cellule où serait inscrit l'année et une zone libre pour déterminer le nombre de lundi (ca doit être + simple avec des formules qu'en VBA, mais faut voir)... Bref! du boulôt.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 mars 2008 à 15:06
voici la formule qui donne le nombre de lundi par mois:

=ENT((FIN.MOIS(DATE(A1;A2;1);0)-TEXTE(DATE(A1;A2;1);"m/aaa")-MOD(TEXTE(DATE(A1;A2;1);"m/aaa")-3;7)+6)/7)+1

avec l'année en A1 et le mois en A2 sur cette maquette

donc il me faudrait l'adresse de 3 cellules: année, mois (peut-être pas), formule...
0

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

Posez votre question
Re!

après une ptite modification sur mon fichier, ta nouvelle macro marche très bien. Je n'ai plus qu'à l'adapter aux autres tableaux du fichier. Donc je te dis déjà un grand MERCI.

Pour la deuxième question, la date n'est pas vraiment un problème. Sur le fichier, rien n'indique que la semaine 05, par exemple, appartient a janvier ou fevrier. Je te renvois un lien ou ce que je veux faire sera mieux expliqué :

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

Si cela te parait vraiment trop compliqué ne t'épuise pas non plus! c'est déjà très simpas de ta part pour la 1ere question.

En tout cas merci.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
19 mars 2008 à 17:30
re,

voilà la bête (fais une copie de ton classeur pour vérifier!) Il faut que tu sélectionnes au préalable les cellules d'indication des semaines sur la ligne 220 (par ex: AQ220 à AU3220)

Sub regrouper()
Dim premcol As Byte, dercol As Byte, cptrcol As Byte, valid As Byte, report As Byte
Dim choix As Range
Dim coll As Collection
Dim titre As String
Dim plage

' la zone à regrouper doit être regroupée avant de lancer la macro
If Intersect(Selection, Range("AQ220:BK220")) Is Nothing Then Exit Sub

Set choix = Selection
With choix
'limites de la zone à regrouper
premcol = .Column
dercol = .Count + premcol - 1
End With
'message de confirmation
valid = MsgBox("semaines " & Cells(220, premcol) & " à " & Cells(220, dercol) & " sélectionnées. Continuer?", vbYesNo)
If valid = 7 Or valid = "" Then Exit Sub
' mémorise la semaine après la sélection (pour après destruction)
report = Cells(220, premcol) + choix.Count
Set coll = New Collection

'inscrit les N° de semaine
For cptrcol = premcol To dercol
titre = titre & Cells(220, cptrcol) & "/"
Next
coll.Add titre
'calcule et inscrit les moyennes
For cptr = 221 To 250
plage = Range(Cells(cptr, premcol), Cells(cptr, dercol))
If Application.CountA(plage) = 0 Then
plage = ""
Else
plage = Application.Average(plage)
End If
coll.Add plage
Next

'ecrit les calculs dans la colonne de départ
For cptr = 220 To 250
Cells(cptr, premcol) = coll(cptr - 219)
Next

'détruit les colonnes suivantes du tableau
Range(Cells(220, premcol + 1), Cells(250, dercol)).Delete Shift:=xlToLeft
'inscrit la semaine d'après
Range("AR220") = report

Set coll = Nothing
Set choix = Nothing

End Sub


Ca m'a passer le temps! suis bloqué à la maison!

Michel
0
Re michel!
dsl hier soir j'avais débauché et ce matin reunion, donc je viens de découvrir ta macro!
le problème (et oui encore....) que je rencontre, c'est que lorsque je lance la macro, il ne se passe rien... j'ai ma ptite idée... la macro doit se lancer a partir de la 1ere colonne du fichier (pour la plage 220-250) c'est a dire la colonne A, qui est vide dans mon fichier. Ce qui expliquerait qu'il ne se passe rien. Or mon tableau est situé entre les colonnes AQ et BK. Si tu as une idée, et que tu as le temps bien evidemment.

guillaume
0
ptite rectification.... une tite erreur de ma part expliquait le probleme... cependant la ligne
If valid = 7 Or valid = "" Then Exit Sub
crée un bug ds la macro. et la j'avou ne pas comprendre.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
20 mars 2008 à 15:58
bonjour,

effectivement!
au lieu de:
If valid = 7 Or valid = "" Then Exit Sub
ecris:
If valid = 7 Then: Exit Sub

( 7 correspond à "non")
Continue les essais et dis moi les résultats (la tendance est que quand je fais de l'auto-correction, j'évite inconsciemment les erreurs!...)

Quant à ta petite erreur de ce matin,si tu l'as fait d'autres la feront et donc, le truc part à la poubelle... Je regarde, j'ai le temps avec ce p... de Mistral qui te glace dès que tu mets le nez dehors.

A+
Michel
0
Bon en fait après pas mal de galères j'ai réussi... mais j'ai du abandonner l'idée d'avoir le message de confirmation:

'message de confirmation
valid = MsgBox("semaines " & Cells(220, premcol) & " à " & Cells(220, dercol) & " sélectionnées. Continuer?", vbYesNo)
If valid = 7 Or valid = "" Then Exit Sub

C'est dommage.
En tout cas merci pour tout Michel, ton aide a vraiment été précieuse!

Guillaume.
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
20 mars 2008 à 16:09
Et bing, une bosse!

Ce serait dommage de supprimer ce message car il rassure l'utilisateur.
0
ah j'ai loupé de peu ton mess... je viens d'essayer ca marche niquel! merci encore!
le seul hic (je profites du mistral la j'avou!!) c'est que la 1ere fois ca marche très bien, ca me marque 01/02/03/04/05 dans la case semaine, mais si je refais, au lieu d'avoir 06/07/08/09 j'ai 10!
mais c'est pas franchement un problème, si chaque semaine je dois prendre 10s a faire ca.... je vais pas m'en plaindre! ma mise a jour manuele (sans les macros) prenait jusqu'a present entre 1h15 et 1h35 selon les semaines et mois... donc ca va me changer la vie!
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
20 mars 2008 à 16:43
Re,

à la fin de la macro au lieu de
'inscrit la semaine d'après
Range("AR200") = report

écris
'inscrit la semaine d'après
Cells(220, premcol + 1) = report

Autre C... que je viens de voir: remplace 250 par 270 pour les lignes !!!

Enfin, si tu es tout seul à te servir du classeur, on pourrait laisser tomber la prévention de l'erreur matinale...

A+
0
Hello Michel!
dsl de ne repondre que maintenant... je viens d'essayer la modif... c'est parfait!! pour ce qui est du 250 a la place du 270, je m'en étais rendu compte, c'est encore dans mes moyens ca! En tout cas tu n'imagine pas l'aide précieuse que tu as pu m'apporter! et je t'en remercie grandement.

Guillaume
0
michel_m Messages postés 16603 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 303
21 mars 2008 à 08:26
Salut Guillaume,

Si c'est OK indique problème résolu avec l'icone au dessus de "répondre"

Heureux de t'avoir rendu service.

Michel.
0
Je pense qu'en tant qu'utilisateur anonyme je ne peux pas indiqué le problème comme étant résolu.... ou alors j'ai vraiment du mal (c vendredi en meme temps...)
Je sais pas si toi tu y a accès...
0