Insertion ligne excel VBA

freedix Messages postés 20 Statut Membre -  
freedix Messages postés 20 Statut Membre -
Bonjour,

J'ai besoin d'aide pour créer une macro sous excel...

Mon problème est le suivant, j'ai un tableau avec une groupe de colonnes qui désigne la date (colonne A: le jour, colonne B: no de la semaine, colonne C: no du mois)... les colonnes de D à U contiennet diverses données...

J'aimerai créer une macro qui insère une ligne automatiquement dès que le no de la semaine et du mois change. Le but étant d'inscrire les moyennes hebdomadaires et mensuels des valeurs entrées en colonne T et U.

Est-il possible de créer une macro pour faire ça? (sachant que le nombre de lignes remplie par jour peut varier...)

5 réponses

  1. Bidouilleu_R Messages postés 1209 Statut Membre 296
     
    Voilà un petit code tout simple
    le principe est le suivant je regarde la différence de n° de semaine et la différence
    de numéro de mois
    si la fin de semaine tombe une fin de mois il y aura deux insertions.

    A+
    Bidouilleu_R

    Sub ajoutligne_sem_mois() 
    Dim DerLig As Long 
    Dim InsereSemaine As Boolean 
    Dim InsereMois As Boolean 
    
    Sheets("feuil1").Select ' on se place sur la feuille 
    ' où l'on veut inérer les ligness... 
    DerLig = Range("A65535").End(xlUp).Row 
    InsereSemaine = False 
    InsereMois = False 
    
    For i = 2 To DerLig 
        DerLig = Range("A65535").End(xlUp).Row 
        If Cells(i, 2).Value <> Cells(i + 1, 2).Value Then 
            'on teste si la semaine change 
            InsereSemaine = True 
        End If 
        If Cells(i, 3).Value <> Cells(i + 1, 3).Value Then 
            InsereMois = True 
             
        End If 
        If InsereSemaine Or InsereMois Then 
            If InsereSemaine And InsereMois Then 
                Rows(i + 1).Select 
                Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
                Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
                i = i + 2 
            Else 
                ' une seule insertion 
                Rows(i + 1).Select 
                Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
                i = i + 1 
            End If 
            ' pas d'insertion 
        End If 
         
        InsereSemaine = False 
        InsereMois = False 
    Next 
         
       cells(1,1).select
    
    
    End Sub
    1
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour,
    un peu à la bourre mais c'est lundi

    insère ligne au changement de semaine OU de mois

    Const lig As Byte = 2 'ligne de départ
    
    Sub separer_semaines_et_mois()
    Application.ScreenUpdating = False
    separer 2
    separer 3
    End Sub
    
    Sub separer(col As Byte)
    
    derlig = Cells(65536, col).End(xlUp).Row
    'liste les changements
    niveau = Cells(lig, col)
    For cptr = 1 To derlig
        test = lig + cptr
        If Cells(lig + cptr, col) > niveau And Cells(lig + cptr - 1, col) <> "" Then
            liste = liste & lig + cptr & ":" & lig + cptr & ","
            niveau = Cells(lig + cptr, col)
        End If
    Next
    
    '------insère les lignes
    Range(Left(liste, Len(liste) - 1)).Insert
    
    End Sub
    
    1
    1. Bidouilleu_R Messages postés 1209 Statut Membre 296
       
      Tu as raison michel, c'est lundi je ferai mieux la prochaine fois.
      Ton code est qund même joli le mien est plutôt visual et basic :-)
      0
  3. freedix Messages postés 20 Statut Membre 2
     
    Merci beaucoup pour vos propositions...
    J'ai essayé les deux, mais il semble y avoir une erreur, Vb m'affiche ce message "la méthode Insert de la classe range à échoué". Et quand je clique sur "débogage", VB me surligne en jaune la ligne 25 du programme de Bidouilleu_R et la ligne 24 sur celui de michel_m.

    Vous voyer d'où ça peut venir? La même erreur dans les 2 programmes, c'est surement moi qui ai mal fait la manip...??

    Merci pour votre aide.
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      re,

      pourtant j'avais testé.

      je ne sais pas compter jusqu'à 24 ! :-)

      qu'il y a t il marqué sur cette ligne ? je suppose quand m^me que c'est
      Range(Left(liste, Len(liste) - 1)).Insert ?

      quelle est ta version d'XL ?

      dans l'attente
      0
    2. freedix Messages postés 20 Statut Membre 2
       
      Oui c'est bien cette ligne.... J'ai excel 2007!
      C'est quand je clique sur exécuter la macro que j'ai le message
      0
    3. freedix Messages postés 20 Statut Membre 2
       
      oups, je viens de m'apercevoir que j'ai mis le mois en colonne B et le no de semaine en colonne C contrairement à ce que j'avais dis au départ... je sais pas si ça change quelque chose...!
      0
    4. freedix Messages postés 20 Statut Membre 2
       
      Je viens de trouver l'erreur... ce cou ci ça fonctionne, j'avais protéger certaine colonnes du document par un mot de passe... je viens d'enlever la protection et ça merche!

      J'en profite pour te poser une autre question... est-ce qu'il est possible de faire en sorte que la ligne insérée ait une mise en page différente des autres (en gros il faudrait que les cellules de A a S soient fusionnée et grisées et qu'on affiche total semaine, ou total mois dedans...). Tu vois ce que je veux dire?

      En tout cas merci beaucoup pour ton aide, j'aurais jamais pu faire un tel programme tout seul!
      0
    5. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      je ne crois pas mais essaies et tu nous dis
      0
  4. freedix Messages postés 20 Statut Membre 2
     
    Bon, c'est plus compliqué que ce que j'imaginais... grâce au programme de michel les lignes s'insèrent lorsqu'on éxecute la macro à chaque changement de mois ou de semaines, mais à l'origine, j'aurais préférer que la macro s'éxécute au fur et à mesure du remplissage du tableau sans qu'on ait à l'éxécuter manuellement... j'ai essayé une seconde macro:

    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Call separer_semaines_et_mois
    End Sub

    mais ça marche pas... et il n'est, apparemment, pas possible d'insérer une ligne avec un format particulier... tant pis! C'est déjà pas mal
    0
    1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
       
      Tu pourrais faire ceci mais cela colorie toute la ligne

      with Range(Left(liste, Len(liste) - 1))
      .Insert
      .Interior.ColorIndex = 15
      end with

      sinon la macro de mon ami bidoullieu pourrait être plus adaptée à ta demande
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. freedix Messages postés 20 Statut Membre 2
     
    Bonjour,

    Finalement j'ai opter pour une autre solution qui je pense sera plus simple! J'ai inséré 2 colonnes à la fin de mon tableau (à droite). Une colonne "Moyenne Semaine" et une colonne "Moyenne mois"...
    Il me rete à trouver un programme qui puisse me calculer ces moyennes... Mais ça devrait être plus simple!

    En tout cas, merci pour votre aide!
    0