AutomaVB

Résolu
cindy001 Messages postés 108 Statut Membre -  
ccm81 Messages postés 11033 Statut Membre -
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

  • 1
  • 2
Résumé de la discussion

On cherche à modifier une macro VBA pour intégrer un paramètre p et démarrer les calculs à partir de la dernière colonne détectée, p=60 couvrant DC à FJ et p=40 DW à CJ. Plusieurs réponses suggèrent de partir de FJ et de se décaler par pas fixes, ou de remplacer FJ par une détection automatique de LastColumn via xlToLeft. L’une des solutions avancées est une macro AutomaVB qui calcule LastColumn, crée des feuilles pour p et remplit les formules sur plusieurs lignes avec des références dynamiques. Des échanges indiquent aussi l’intérêt de clarifier le rôle de p et de préciser le ciblage des plages et des feuilles pour éviter des ajustements manuels répétés.

Bobot (l'IA à votre service)
  1. cindy001 Messages postés 108 Statut Membre 2
     
    C trop compliquer?
    0
  2. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    bon, je vois que je ne suis pas le seul dans l'expectative
    peut etre pas trop compliqué, mais ta demande est difficile a comprendre, je vais tenter d'éclaircir la situation
    - la valeur de p a apparemment un lien avec tes noms de feuilles (lequel)
    - veux tu une creation auto de feuille, une recopie de feuille modele) avec modif de formule ?
    - ta macro doit elle avoir p comme parametre ?
    - quelle(s) formule(s) est concernée par p?
    - que veux tu faire de p?
    - si tu donnais un exemple où p figure, et par quoi tu veux le remplacer (formule - même mal redigée contenant p - avant remplacement de p, formule après remplacement de p par 40 par exemple)

    bon courage
    0
  3. cindy001 Messages postés 108 Statut Membre 2
     
    Merci de me répondre

    Pour le p je voulais dire:
    le calcul product on le bas dans chaque cas sur AU-FJ, y'a en tout 120 colonnes normalement:
    dans le premier cas ci dessus on l'a couper en deux en gros: AU-DC DC-FJ
    (c'était ca mon p = 2)
    dans le deuxième cas en trois(ici p = 3)
    normalement FJ correspon à une date je dis n'importe quoi:31/12/2009
    et AU à 31/12/1999, pour moi le p c'est par exemple couper ca en 2 fois, 3 fois, 4fois, et arreter cette boucle jusqu'à 10, un p ou un i ou j dans cette boucle ca n'a pas d'importance

    l'idée c d'automatiser ca

    demain jpourrais meme un autre fichier plus précis si je ne suis toujours pas très clair?

    une creation auto de feuille pour ces 10 cas serait parfait.

    Merci encore
    0
  4. cindy001 Messages postés 108 Statut Membre 2
     
    Merci de m'avoir répondu
    Alors dans ma formule j'ai mis FJ en f1 parceque dans la feuille Coef Mul Titre Large Ret1m les chiffres s'arretent en FJ mais j'ai d'autres fichiers ou ca se termine plus loin donc j'aimerai que ma macro sache reconnaitre quelle est cette dernière colonne
    donc remplacer FJ par un LastColumn qu'on ferait calculer.

    FJ ca correspond par exemple à la date 31/12/2009 et AU 31/12/1999(y' a 120 mois)

    le premier cas que j'ai fais au dessus correpondrait au cas ou on coupe cette intervalle en deux(AU-DC en f1 et DC-FJ en f3) donc 120mois/2 = 60 c'était ca mon p =60 mais je me suis mal exprimer

    la deuxième cas on le coupe en 3(qu'on peut mettre dans une autre feuille) c'était ca mon cas: p= 40 au dessus car 120/3(3 car on coupe en 3)

    puis ensuite j'en ai besoin en 4, 5 ..... jusqu'à 10, qu'on peut mettre à chaque fois dans une nouvelle feuille, en automatique je sais pas comment faire mais ca serait parfait

    c ca que je voulais dire que jai dis p mais je me suis mal exprimer

    p comme paramètre ou autre aucune importance
    pour la formule f2
    f2 = "=Feuil1!$DB$" & lig , DB c en fait une colonne avant le DC de f1 ci dessous
    automatiser ca serait

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

    comme pour f4
    f4 = "=Feuil1!$AT$" & lig
    le AT c en fait une colonne avant le AU de f3:
    f3 = "=product('Coef Mul Titre Large Ret1m'!$AU$" & lig & ":$DC$" & lig & ")-1"

    si je suis pas assez précis dis le moi??? comme ca demain jpourrais mettre un autre fichier sur cijoint en fesant plus de cas

    Merci encore
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    sur le fichier de ton pos1, il y a deux feuilles p=60 et p=40
    donc si je comprends p = 60 coreespond a quelque chose coupé en 2 et les 4 cellules A2:B3 se referent à la ligne 20.
    et p=40 à coupé en 3 ? et les 6 cellules A2:B4 se referent à la ligne 20.
    donc le probleme est la gestion (numerique) des n° de colonnes
    pour cela il faudrait passer en mode L1C1 (outils/option/general/Style L1C1 (en VBA style R1C1 et ça devient cells(lig,col).formulaR1C1 = fxx )

    questions
    - pour chaque feuille la reference $FJ$J (col 166) est elle la même
    - expliquer alors comment la valeur de p influe t'elle sur $DC$20 (de combien recule t'on depuis FJ en fonction de p?)
    - la 1° col du cas p=40 est AW (col 49) et celle du cas p=60 et AU (col 47) est ce normal, comment varie cette colonne en fonction de p?
    - quels sont les 10 cas pour p : comment couper 120 en autre chose qu'en 2,3,4,6 (seuls diviseurs de 120 <= 10) me parait bizarre!
    - si tu eux m'expliquer tout ça en utilisant des numéros de colonnes (numérique), ça serait plus clair
    - envoies ton exemple avec les premieres lignes de chaque cas

    bonne suite
    0
  7. cindy001 Messages postés 108 Statut Membre 2
     
    - la 1° col du cas p=40 est AW (col 49) et celle du cas p=60 et AU (col 47) est ce normal, comment varie cette colonne en fonction de p? NON c une erreur
    pour cette 3 ème question c une bonne question car on a en tout 120 colonnes et on veut donc couper en 2, 3... jusqu'à 10 donc c pas AW mais AU, bref on veut couper de 6 en 6(je parle en colonne là)
    on coupe en 2: on aura 60 et 60 colonnes(120/2)
    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)...... au lieu du 60 juste au dessus donc de 6 en 6 je veux qu'on fasse cette boucle(c la réponse à ta deuxième question on bouge de 6 en 6 à partir de FJ (enfin non à partir de la dernière colonne qui est FJ dans ce cas ci)FJ qu'on fige enfin on part de là, on fait donc 60 àpartir de FJ, 54 à partir de FJ,.....jusqu'à 12 à partir de FJ)

    le cas p = 40 on coupe en 3 c'était juste pour illustrer ce que je voulais
    mais jpense que t'as compris c bien ca:

    sur le fichier de ton pos1, il y a deux feuilles p=60 et p=40
    donc si je comprends p = 60 coreespond a quelque chose coupé en 2 et les 4 cellules A2:B3 se referent à la ligne 20.
    et p=40 à coupé en 3 ? et les 6 cellules A2:B4 se referent à la ligne 20.

    Merci encore
    0
  8. cindy001 Messages postés 108 Statut Membre 2
     
    Alors voila comme je l'avais dis

    j'ai fait d'autres cas, 4 en tout et les résultats sont bon ils sont dans les feuilles cas1(p=120 c tout AU-FJ macro CCM1 module1) cas2(p = 60 c la macro CCM2 que j'ai lancé) cas3(macro CCM3) et cas4(p = 24 j'ai coupé AU-FJ en 5(120/5 pour le p=24) )
    http://www.cijoint.fr/cjlink.php?file=cj201101/cijLrxkd2S.xls

    Merci
    0
  9. cindy001 Messages postés 108 Statut Membre 2
     
    Et enfin avec le dernier cas on coupe AU-FJ en 10, les formules c ca:

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

    f3 = "=product('Coef Mul Titre Large Ret1m'!$EM$" & lig & ":$EX$" & lig & ")-1"
    f4 = "=Feuil1!$EL$" & lig

    f5 = "=product('Coef Mul Titre Large Ret1m'!$EA$" & lig & ":$EL$" & lig & ")-1"
    f6 = "=Feuil1!$DZ$" & lig

    f7 = "=product('Coef Mul Titre Large Ret1m'!$DO$" & lig & ":$DZ$" & lig & ")-1"
    f8 = "=Feuil1!$DN$" & lig

    f9 = "=product('Coef Mul Titre Large Ret1m'!$DC$" & lig & ":$DN$" & lig & ")-1"
    f10 = "=Feuil1!$DB$" & lig

    f11 = "=product('Coef Mul Titre Large Ret1m'!$CQ$" & lig & ":$DB$" & lig & ")-1"
    f12 = "=Feuil1!$CP$" & lig

    f13 = "=product('Coef Mul Titre Large Ret1m'!$CE$" & lig & ":$CP$" & lig & ")-1"
    f14 = "=Feuil1!$CD$" & lig

    f15 = "=product('Coef Mul Titre Large Ret1m'!$BS$" & lig & ":$CD$" & lig & ")-1"
    f16 = "=Feuil1!$BR$" & lig

    f17 = "=product('Coef Mul Titre Large Ret1m'!$BG$" & lig & ":$BR$" & lig & ")-1"
    f18 = "=Feuil1!$BF$" & lig

    f19 = "=product('Coef Mul Titre Large Ret1m'!$AU$" & lig & ":$BF$" & lig & ")-1"
    f20 = "=Feuil1!$AT$" & lig

    c la dernière macro CCM5 résultats Feuille Cas5
    http://www.cijoint.fr/cjlink.php?file=cj201101/cijvtryCLz.xls

    Bon si j'arrive toujours pas à me faire comprendre, dis le moi stp comme ca je le fais à la main, en tout y'a que 10 cas j'en ai déja fais 5 (document cijoint)
    0
  10. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    bon ccm etait dans les choux du moins depuis chez moi .... ce qui m'a obligé a reflechir tranquille !!!

    je n'ai pas vu ton dernier ccm5

    ce qui est sur c'est que le style L1C1 convient beaucoup mieux a ton pb que le style A1, ça permet de travailler sur les n° de colonnes ce qui est nettement plus commode que les lettres (ça permet des calculs)
    j'ai traité les cas p = 2 et p = 3 (sans macro - avec decaler)
    j'ai traité le cas p = 2 avec macro.
    les numéros de colonnes doivent pouvoir se calculer en fonction de p (a toi de voir)

    RQ. j'ai ajouté une feuille F0 pour essayer d'y voir clair !!! elle ne m'a pas servi, mais on ne sait jamais !

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

    bonne suite
    0
  11. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    excuses, ce message est une erreur

    bonne suite
    0
  12. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    j'ai repris ton dernier envoi
    en essayant d'automatiser le cas p = 3
    j'ai mis un bouton sur cette feuille et code la procedure
    MAIS il y a pb voir RQ dans le code du bouton

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

    tu peux toujours t'en inspirer pour les cas suivants, mais si on veut vraiment automatiser, , il faut regler le pb des tailles de paquets

    bonne suite
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Salut ccm81,
      Avant de me pencher sur le problème en cours, je désirais attirer ton attention sur la déclaration de variables. Tu dis, dans ton code VBA ne pas être obligé de déclarer toutes les variables, car cela fonctionne. Il faut déclarer systématiquement toutes les variables utilisées dans la macro! Voici deux liens cadeaux :
      http://www.info-3000.com/vbvba/variableconstante.php
      et surtout :
      ftp://ftp-developpez.com/silkyroad/VBA/LesVariables/LesVariables.pdf

      Si tu veux être sur de ne jamais oublier de déclarer tes variables, commence systématiquement tes macros par :
      Option Explicit
      Sub ...()
      Cordialement,
      0
  13. cindy001 Messages postés 108 Statut Membre 2
     
    Ok
    donc tu comprends ce que je voulais faire maintenant

    mais bon c peut etre impossible d'aller aussi loin dans l'automatisation.

    meme si raisonner en terme de L C plutot que mettre les lettres des colonnes FJ... c'était une bonne idée

    sinon t'as rien touché aux macros t'as juste changé dans les formules FJ en C166..... à la main.

    Merci quand meme d'avoir regardé
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bonjour vous deux,
      Besoin d'un coup de main?
      J'ai téléchargé le fichier joint à la dernière réponse de ccm81, mais honnêtement, je ne comprends pas du tout ou vous voulez en venir.
      Pourriez vous, si vous en avez toujours besoin, reposer votre question simplement?
      0
  14. cindy001 Messages postés 108 Statut Membre 2
     
    Merci de répondre merci à vous deux
    http://www.cijoint.fr/cjlink.php?file=cj201101/cijpb4ged3.xls

    Je veux juste une macro qui soit capable de me créer ces onglets( que j'ai appelé Cas1...cas6 mais peu importe les noms) automatiquement avec ces formules à l'interieur dépendant des 3 premières feuilles, mon idée du Offset n'est peut etre pas terrible mais peut importe la méthode ou fonction utiliser.

    J'ai 6 macros que j'ai lancé chacune dans un onglet que j'ai créer à la main.

    Mais je crois que c trop dur à faire?
    0
    1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
       
      Bon je n'ai touché à rien dans le code, je n'ai même pas cherché à en comprendre le but.
      Ce que j'ai fait par contre :
      création du module : "création onglets" dans lequel j'ai automatisé la création des feuilles et réunit les 6 macros.
      Vous dites...
      http://www.cijoint.fr/cjlink.php?file=cj201101/cijldex3Ga.xls
      0
  15. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    j'ai toujours des pb pour me connecter au site !!!

    au vu de ton dernier envoi, il y a bien cette fois une logique de découpage selon la valeur de p
    du coup, le code est grandement simplifié

    - tu mets un bouton (avec la boite a outils controle) dans la feuille
    - tu y attaches le code suivant

    Const p = 10   
    Const imax = 70   
    Const co1 = 5   'j'ai execute en colonnes 4 et 5   
    Const co2 = 6   
    Const colder = 166   
    Const FCoeff = "'Coef Mul Titre Large Ret1m'"   
    Const f1 = "'Feuil1'"   
    Const ideb = 20    ' ligne 1 feuille cas = 3   
    
    Dim lig As Long, col1 As Long, col2 As Long, i As Long, j As Long, pp As Long   
    Dim a1 As String, a2 as string   
    
    lig = 20   
    pp = 120 \ 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   
    


    - tu changes la valeur de p
    - et les valeurs de constantes col1 et col2 (colonnes pour l'affichge des resultats)

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

    RQ1. on peut aussi passer la valeur de p en parametre à la procedure, histoire de n'avoir qu'un seul exemplaire du code
    RQ2. pijaku a reglé le problème de la creation des onglets donc ...

    bonne suite
    0
  16. cindy001 Messages postés 108 Statut Membre 2
     
    j'avou que je ne suis pas assez fort en vb pour comprendre tout de suite .

    j'ai mis un bouton sur la feuille j'y ai mis le code.
    Mais quend je clique dessus il se passe.

    Jconnais pas trop ca, peut-etre faut il que je rajoute mon code avant le End Sub avec??

    jvais continuer à essayer de le comprendre il mfaut ptere juste un peu de temps

    Merci de rseter avec moi
    0
  17. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re
    as tu
    - regarde le la feuille cas 5 de mon dernier post
    (clic-droit sur l'onglet/Visualiser le code)
    - mis ton bouton dans la feuille a remplir
    - mis un bouton avec la boite a outils controle
    Au cas où !!
    - Affichage/boite a outils controle/
    - passer en mode creation (le petit triangle bleu)
    - clic-clic sur le bouton pour passer a l'editeur VB
    - et mettre le code entre Private Sub CommandButton1_Click() et end sub
    - repasser en mode execution (le petit triangle bleu)
    bonne suite
    0
  18. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    Bonjour le forum,
    J'ai parcouru le topic en diagonal et je compte pas aller plus loin, mais ce qui me fait intervenir c'est... pourquoi faire une macro qui insère une formule plutôt que de mettre directement la fonction qui génère la réponse. ???
    Ce serait quand même plus rationnel.
    A+
    0
    1. ccm81 Messages postés 11033 Statut Membre 2 434
       
      > lermitte222
      - à l'origine, la demande a ete faite avec des formules
      - si les données changent, les formules permettront la mise a jour
      a+
      -
      0
    2. lermite222 Messages postés 9042 Statut Contributeur 1 199
       
      Mais oui, mais avec des fonctions ça se met à jour aussi !!
      0
  19. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re

    j'ai rajouté la creation et le remplissage des feuilles selon la valeur de p > feuille F0, (p =2 correspond a ton 60, p = 3 à ton 40 etc ... )

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

    les modules deviennent inutiles (sauf module 6 qui contient le code) et pourront etre supprimes
    si c'est bon, il te faudra modifier dans le code de CreerFeuille, les valeurs de col1, col2 et imax

    bonne suite
    0
  20. cindy001 Messages postés 108 Statut Membre 2
     
    bon jpeux pas rgarder la parceque j'ai pas excel chez moi mais comme t'as compris ce que je voulais jpense que t'as bien traité ca:(c ce que j'avais mis plus haut le 12 jan 2011 à 23:33)

    on coupe en 2: on aura 60 et 60 colonnes(120/2)
    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

    quand jdisais à la fin 120 , puis 120/2(p = 2), puis 120/3 (p =3)....., c'était pour que tu saisisses le truc, qui était un peu difficile à expliquer.

    Mais bon c peut etre ce que t'as fais.

    Alors Merci jpourrais rgarder ca que lundi.
    0
  21. ccm81 Messages postés 11033 Statut Membre 2 434
     
    re
    en relisant ton dernier post, j'ai encore quelques doutes, donc je re-précise comment j'ai compris/traité le decoupage

    - le cas p=5 correspond au decoupage de C47:C166 (AU:FJ) en 5 paquets de 120/5 = 24 colonnes (166:143 , 142:119 , ... , 70:47)
    - donc pour p (obligatoirement diviseur de 120) on découpe C47:C166 en p paquets de 120/p

    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)

    sur mon envoi, j'ai traité le cas p = 10,
    enfin, tu verifies avec les cas que tu as déjà fabriqués et tu dis ...

    bonne suite
    0
  • 1
  • 2