Problêmes macros excel

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

14 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  2. elGuitou
     
    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
  3. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. elGuitou
       
      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
  4. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. elGuitou
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      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
  7. elGuitou
     
    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
  8. elGuitou
     
    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
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  10. elGuitou
     
    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
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Et bing, une bosse!

      Ce serait dommage de supprimer ce message car il rassure l'utilisateur.
      0
  11. elGuitou
     
    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
  12. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  13. elGuitou
     
    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
  14. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    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
  15. elGuitou
     
    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