AutomaVB - Page 2

Résolu
  1. C pour ca que j'avais dis on part de FJ, et on bouge de 6 en 6, le découpage AU:FJ j'en ai parlé pour me faire comprendre car au début si tu trapeles j'avais du mal.

    Mais pour le cas 24, 24*5=120 donc on ira bien jusqu'à AU cad 120 colonnes avant FJ, pour 60 c pareil, car c aussi un multiple de 120, 60*2, mais tous les autres cas 12, 18,(24 on l' déja) 30, 36, 42, 48, et 54 on s'arretera donc pas en AU(avant) mais c pas grave le but c d'aller aussi loin qu'on peut avant FJ, donc jusqu'à qu'on à plus de chiffre dans la feuille Feuille1, donc jusqu'à qu'on a plus de chiffres pour calculer a1 et b1.

    Mais je pense que j'y arriverai, jpense qu'avec ta macro c facilement modifiable.

    Premièrement, jcommencerai par remplacer Const colder = 166 par Const colder = DernièreColonne, en lui fesant calculer automatiquement ce DernièreColonne.....

    Jte tiendrai au courant car j'ai pas excel chez moi.

    Merci encore bonne fin de we
    0
    1. re

      aïe, c'est la premiere fois que tu me dis qu'on peut deborder par la gauche (avant la colonne 47), moi qui me faisais du souci pour la relation entre p, la taille des paquets et le nombre fatidique 120 !!!!
      j'ai amenage un peu pour que ça reponde a la nouvelle question,
      j'ai mis toute l'initialisation des données dans la feuille F0, ce sera a toi de remplir selon les besoins avant de lancer la creation de la feuille,
      RQ1. la valeur de p est calculée donc ne pas y toucher.
      RQ2. si tu dois modifier d'autres données, tu peux completer la feuille F0 et bien sur la procedure CreationFeuille (Module 7)
      RQ3. J'ai traité le cas p = 10 qui correspond à ton Cas 5, ça colle

      http://www.cijoint.fr/cjlink.php?file=cj201101/cij3p48aVN.xls

      RQ4. dans ton Cas2, les paquets ne sont pas disjoints
      ligne 20 > C107-166
      ligne 21 > C47-C107
      etc ..
      alors que dans ton cas 5 elle sont bien disjointes
      ligne 20 > C155-166
      ligne 21 > C143-C154
      etc ..

      ???

      bonne suite
      0
      1. jréponds pas encore parceque j'essai de la terminer par rapport à

        puis j'aimerai ensuite les cas 54, 48, 42, 36 jusqu'à 12(12 c le dernier cas que j'ai dis ou on coupe en 10(120/10)......on bouge de 6 en 6 à partir de FJ
        'si on bouge de 6 en 6, pour moi, on coupe en p = 20 (120/20 = 6) , si on coupe en 20 c le cas 6, puis j'essai d'ajouter la boucle: for p = 6 To 60 Step 6 pour tous les autres cas'

        en fait j'essaie de partir de la dernière collone que j'ai fais calculer automatiquement en fesant:
        With Sheets("Coef Mul Titre Large Ret1m")
        LastColumn = .Cells(20, .Columns.Count).End(xlToLeft).Column
        End With

        et de là faire le décalage de 6 en 6 jusqu'à ce qu'il y a plus de chiffre(dans la feuille Coef Mul Titre Large Ret1m) pour faire le product dans les formules.

        jte réponds quand je peux, si j'arrive ou pas.
        0
        1. Sub Window()

          With Sheets("Coef Mul Titre Large Ret1m")
          LastColumn = .Cells(20, .Columns.Count).End(xlToLeft).Column
          End With
          LastLine = Range("Feuille1!A65536").End(xlUp).Row

          Const co5 = 5
          Const co6 = 6

          colder = LastColumn
          Const FCoeff = "'Coef Mul Titre Large Ret1m'"
          Const f1 = "'Feuille1'"
          Const ideb = 20

          Dim lig As Long, col1 As Long, col2 As Long, i As Long, j As Long, pp As Long
          Dim a1 As String, a2
          Dim NomFeuille As String
          Dim NbFeuilles As Long

          For p = 3 To 10 Step 1
          ' creation de la feuille p
          NomFeuille = "p=" & (p * 6)
          NbFeuilles = Sheets.Count
          Sheets.Add
          ActiveSheet.Name = NomFeuille
          Sheets(NomFeuille).Move after:=Sheets(Sheets.Count)

          ' remplir la feuille p
          lig = 20
          'imax = (p * LastLine) - ((p - 1) * 19)

          pp = 6 * p
          i = ideb
          'While i < imax
          col1 = colder - pp + 1
          col2 = colder
          For j = 1 To p
          a1 = "=product(" & FCoeff & "!R" & lig & "C" & col1 & ":" & "R" & lig & "C" & col2 & ")-1"
          b1 = "=" & f1 & "!R" & lig & "C" & col1 - 1

          Cells(i, co1).FormulaR1C1 = a1
          Cells(i, co2).FormulaR1C1 = b1

          i = i + 1
          col1 = col1 - pp
          col2 = col2 - pp
          Next j
          lig = lig + 1
          'Wend
          Next p
          End Sub

          Alors voila ce qui faudrait mais j'ai un bug depuis hier que j'arive pas à corriger

          si jreprends ton commentaire:si on bouge de 6 en 6, pour moi, on coupe en p = 20 (120/20 = 6)
          on bouge de 6 en 6 ton sens ici ca veut dire en colonne dans la feuille Coef Mul Titre Large Ret1m, mais moi je voulais dire ca depuis le début: For p = 3 To 10 Step 1
          ' creation de la feuille p
          NomFeuille = "p=" & (p * 6)

          Y'a que ca comme bug le reste ca n'a pas l'air d'etre faux

          Merci encore d'etre rester avec moi.
          Cindy001
          0
          1. c ca que je veux, j'arrive pas à débuger mais c exactement ce que je veux:

            Sub AutomaVB()

            With Sheets("Coef Mul Titre Large Ret1m")
            LastColumn = .Cells(20, .Columns.Count).End(xlToLeft).Column
            End With

            Const co1 = 2
            Const co2 = 3

            colder = LastColumn
            Const FCoeff = "'Coef Mul Titre Large Ret1m'"
            Const f1 = "'Feuille1'"
            Const ideb = 20

            Dim lig As Long, col1 As Long, col2 As Long, i As Long, j As Long, pp As Long
            Dim a1 As String, a2
            Dim NomFeuille As String
            Dim NbFeuilles As Long

            For p = 3 To 10 Step 1
            ' creation de la feuille p
            NomFeuille = "p=" & (p * 6)
            NbFeuilles = Sheets.Count
            Sheets.Add
            ActiveSheet.Name = NomFeuille
            Sheets(NomFeuille).Move after:=Sheets(Sheets.Count)

            ' remplir la feuille p
            lig = 20
            imax = 70
            pp = 6 * p
            i = ideb
            While i < imax
            col1 = colder - pp + 1
            col2 = colder

            'For j = 1 To (LastColumn - 13) / pp j'aimerai avoir ca _
            mais en prenant l'entier le plus proche de (LastColumn - 13) / pp pour cette boucle mais comme j'arrive pas _
            je rajoute un While
            While j <= (LastColumn - 13) / pp

            a1 = "=product(" & FCoeff & "!R" & lig & "C" & col1 & ":" & "R" & lig & "C" & col2 & ")-1"
            b1 = "=" & f1 & "!R" & lig & "C" & col1 - 1

            j = j + 1

            Cells(i, co1).FormulaR1C1 = a1
            Cells(i, co2).FormulaR1C1 = b1

            i = i + 1
            col1 = col1 - pp
            col2 = col2 - pp
            Wend
            'Next j
            lig = lig + 1'Il est ici le bug
            Wend
            Next p

            End Sub

            Merci c fini c juste un problème de nug maintenant. Merci
            0
            1. re

              quelques remarques
              - j'avoue que j'ai toujours du mal a comprendre la gestion des paquets
              - je considere que ton code correspond a ce que tu veux exactement
              ceci etant précisé,
              - les variables ne sont pas toutes déclarées (il faut absolument plus de rigueur)
              - j n'a pas été initialisé (avec un while ce n'est pas très bon)
              - j'ai remplacé le while j par ton ancien essai for j (qui marche bien)
              - lig = lig+1 a l'air correct
              - ton code modifié

              Sub AutomaVB()
              
              Const co1 = 2
              Const co2 = 3
              
              Const FCoeff = "'Coef Mul Titre Large Ret1m'"
              Const f1 = "'Feuille1'"
              Const ideb = 20
              
              Dim lig As Long, col1 As Long, col2 As Long, i As Long, j As Long, pp As Long
              Dim a1 As String, b1 As String
              Dim NomFeuille As String
              Dim NbFeuilles As Long
              Dim lastcolumn As Long, lastrow As Long, colder As Long, p As Long, imax As Long, jmax As Long
              
              With Sheets("Coef Mul Titre Large Ret1m")
                lastcolumn = .Cells(20, .Columns.Count).End(xlToLeft).Column
              End With
              colder = lastcolumn
              imax = 70  'ici a modifier avec le nb de lignes
              
              For p = 3 To 4 Step 1
              
                ' creation de la feuille p
                pp = 6 * p
                NomFeuille = "p=" & pp
                NbFeuilles = Sheets.Count
                Sheets.Add
                ActiveSheet.Name = NomFeuille
                Sheets(NomFeuille).Move after:=Sheets(Sheets.Count)
              
                ' remplir la feuille NomFeuille
                lig = 20
                i = ideb
                jmax = (lastcolumn - 13) \ pp
                
                While i < imax
                  col1 = colder - pp + 1
                  col2 = colder
              
                  For j = 1 To jmax
              
                    a1 = "=product(" & FCoeff & "!R" & lig & "C" & col1 & ":" & "R" & lig & "C" & col2 & ")-1"
                    b1 = "=" & f1 & "!R" & lig & "C" & col1 - 1
              
                    Cells(i, co1).FormulaR1C1 = a1
                    Cells(i, co2).FormulaR1C1 = b1
              
                    i = i + 1
                    col1 = col1 - pp
                    col2 = col2 - pp
                  Next j
                  lig = lig + 1
                Wend
              Next p
              
              End Sub


              bon courage !!!
              0
              1. Merci d'etre encore là, dernière chose.

                Pour ca
                lig = 20
                lig = lig + 1

                j'arrive pas à le remplacer par
                For lig = 20 To 619

                Next lig

                Ca permet de calculer indirectement le imax.
                pour que la macro sache ou s'aréter et ne pas continuer dans le vide tout en bas des feuilles ceer et mettre des -1 partout en colonne B et des 0 partout en colonne C.
                et quand y'a des cellules vides en colonne C dans les feuilles créer ca m'interresse pas j'aimerai supprimer toutes ces lignes mais avec mon code c trop long:For i = Derlig To 20 Step -1

                If Cells(i, 3) = "" Then Rows(i).Delete

                Next

                Merci.
                0
                1. re

                  pour la 1° question,
                  ce que je comprends,
                  tu veux que lig decrive l'intervalle 20-619
                  si c'est ça :
                  jmax étant le nombre de lignes "i" pour une ligne "lig", il y a jmax fois moins de lignes "lig" que de lignes "i", il suffit de changer le controle du
                  While i < imax
                  par
                  While i < jmax*(imax-ideb)+ideb

                  tu peux aussi redefinir imax avant : imax = jmax*(imax-ideb)+ideb

                  ex pour p = 10 si imax = 70, il faut (70-20)*10+20-20 lignes "i" , pour que "lig" atteigne 50 (-20 puisqu'on commence a ideb=20)

                  pour la 2° question
                  ton code est correct, je ne vois pas mieux
                  tu peux peut etre enlever l'option de recalcul auto pour accelerer
                  a la main ou en VBA avec
                  Application.Calculation = xlManual
                  et en ressortant
                  Application.Calculation = xlAutomatic

                  bonne suite
                  0
                  1. Encorec merci pour ton aidela macro je l'ai lancé y'à 1h , elle est pas encore terminé'( quand je mets imx = 4300 donc jusqu'à la fin), tu connais pas un truc à rajouter pour l'accélérer, parce que elle me plante complètement le pc, ca me bloque tout, jpeus rien faire d'autre en atendant

                    Merci
                    0
                    1. re

                      j'ai essayé en vrai grandeur sur ma machine avec les valeurs suivantes

                        i = ideb  '=20     
                        jmax = (lastcolumn - 13) \ pp       
                        imax = 619                             ' derniere ligne actuelle       
                        imax = jmax * (imax - ideb) + ideb     ' pour un essai mettre 100


                      les durées d'exécution
                      pour p = 2 > 10 secondes
                      pour p = 10 > 2 secondes

                      ce qui est prudent, c'est qu'avant de lancer le tout
                      - controler en faisant un suivi des variable pour une execution
                      - faire quelques essais en augmentant progressivement la valeur de imax,
                      - tenter une seule valeur de p pour la vraie valeur de imax

                      plus d'une heure, ça ne me parait pas bon.
                      es tu sur d'avoir initialise la valeur de imax
                      imax = 619 pour mon classeur ou LastLine- je crois dans ton code)
                      avant de le recalculer en fonction de jmax ...
                      Si tu ne l'as pas fait, tu te retrouves avec une valeur negative de imax qui va etre impossible a atteindre dans la boucle (qui va etre infinie)
                      while i < imax
                      ce qui pourrait expliquer ton pb de durée d'execution

                      bonne suite
                      0
                      Précédent
                      • 1
                      • 2