AutomaVB

Résolu
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   -  
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je veux terminer cette macro mais je n'y arrive pas:

ce que je veux faire c ajouter un p au début de la macro que je peux faire varier(dans la 1ère macro ci dessous c le cas particulier ou p=60 de DC à FJ y'a 60 colonnes comme de AU à DC, et pour la deuxième en dessou c p=40), ca serait plus facile de partir de la dernière colonne(celle ou ya les derniers chiffres dans la Feuil1 du fichier ci-joint:
http://www.cijoint.fr/cjlink.php?file=cj201101/cijgMdNsm1.xls
J'ai essayé avec la fonction Offset mais j'arrive pas.


Donc avec cette macro c le cas particulier ou p=60
Sub CCM()

Const imax = 1200


Dim lig As Long
Dim f1 As String, f2 As String, f3 As String, f4 As String

lig = 20

For i = 2 To imax Step 2

f1 = "=product('Coef Mul Titre Large Ret1m'!$DC$" & lig & ":$FJ$" & lig & ")-1"
f2 = "=Feuil1!$DB$" & lig

f3 = "=product('Coef Mul Titre Large Ret1m'!$AU$" & lig & ":$DC$" & lig & ")-1"
f4 = "=Feuil1!$AT$" & lig

Range("A" & i).Formula = f1
Range("B" & i).Formula = f2

Range("A" & (i + 1)).Formula = f3
Range("B" & (i + 1)).Formula = f4

lig = lig + 1

Next i

End Sub


Avec celle ci c'est le cas particulier ou p=40(résultat dans l'onglet p=40)

Sub CCM()

'cas p = 40

Const imax = 1800


Dim lig As Long
Dim f1 As String, f2 As String, f3 As String, f4 As String, f5 As String, f6 As String

lig = 20

For i = 2 To imax Step 3

f1 = "=product('Coef Mul Titre Large Ret1m'!$DW$" & lig & ":$FJ$" & lig & ")-1"
f2 = "=Feuil1!$DV$" & lig

f3 = "=product('Coef Mul Titre Large Ret1m'!$CJ$" & lig & ":$DW$" & lig & ")-1"
f4 = "=Feuil1!$CI$" & lig

f5 = "=product('Coef Mul Titre Large Ret1m'!$AW$" & lig & ":$CJ$" & lig & ")-1"
f6 = "=Feuil1!$AV$" & lig

Range("A" & i).Formula = f1
Range("B" & i).Formula = f2

Range("A" & (i + 1)).Formula = f3
Range("B" & (i + 1)).Formula = f4

Range("A" & (i + 2)).Formula = f5
Range("B" & (i + 2)).Formula = f6


lig = lig + 1

Next i

End Sub

Merci d'avance pour votre aide

30 réponses

Cindy001
 
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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
Cindy001
 
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
Cindy001
 
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

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

Posez votre question
Cindy001
 
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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
Cindy001
 
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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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
cindy001 Messages postés 102 Date d'inscription   Statut Membre Dernière intervention   2
 
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
ccm81 Messages postés 10909 Date d'inscription   Statut Membre Dernière intervention   2 433
 
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