IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Creation ibcrementee d'une feuille à partir de deux autres feuilles et d'une table de correspondance


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Femme Profil pro
    Ingenieur environnement
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingenieur environnement
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Creation ibcrementee d'une feuille à partir de deux autres feuilles et d'une table de correspondance
    Bonjour,

    j'ai, d'un côté une feuille "S0" avec dans les trois premières colonnes, ce qui concaténé, sert d'identifiant PK.
    d'un autre coté, j'ai une autre feuille, S2 du meme format.

    A partir de ces deux feuilles, je veux constituer une troisième feuille en alternant les S0 et les S2 en fonction pour les lignes qui on un PK qui figure dans une table de correspondance (4 ieme feuille "conversion").


    J'ai utilisé une macro VBA mais je n'arrive pas à lire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    conv_flag = Sheets("lut").Cells(i + 1, 3).Value 'lit le code pour déterminer si la ligne va etre en S2
     
    nblignes_S0 = 0
    iii = 1
    xx = 0
    While Sheets("S0").Cells(iii + 1, 1).Value > 0
        xx = Sheets("S0").Cells(iii + 1, 1).Value
           nblignes_S0 = nblignes_S0 + 1
        iii = iii + 1
    Wend
     
     
    nblignes_S0 = nblignes_S0 - 1
    nb_li = 0   'nombre de lignes en sortie
    MsgBox (Str(nblignes_S0))
     
    nblignes_S2 = 0
    iiii = 1
    xxx = 0
    While Sheets("mgt2_S2").Cells(iiii + 1, 1).Value > 0
        xxx = Sheets("mgt2_S2").Cells(iiii + 1, 1).Value
           nblignes_S2 = nblignes_S2 + 1
        iiii = iiii + 1
    Wend
    nblignes_S2 = nblignes_S2 - 1
    nb_li = 0   'nombre de lignes du mgt2 en sortie
    MsgBox (Str(nblignes_S2))
     
     
      'conv_flag = Sheets("S3").Cells(i + 1, 3).Value 'pour déterminer si la ligne va etre en S2
          For a = 1 To nblignes_S2
              conv_flag = Sheets("S3").Cells(i + 1, 3).Value 
               If conv_flag = 1 Then 
     
                  PK(a, conv_flag) = Trim(v1 & "-" &v2 & "-" & v3) & conv_flag
                        For j = 1 To 67
                             Sheets("S3").Cells(a + 1, j + 0).Value = Sheets("mgt2_S2").Cells(a + 1, j + 0).Value
                       Next j
     
                          Sheets("S3").Cells(a + 1, 18).Value = Sheets("mgt2_S2").Cells(a + 1, 18).Value 
                          Sheets("S3").Cells(a + 1, 4).Value = Sheets("mgt2_S2").Cells(a + 1, 4).Value
                          Sheets("S3").Cells(a + 1, 10).Value = Sheets("mgt2_S2").Cells(a + 1, 4).Value  
     
                     End If
     
            If conv_flag = 0 Then     'cas du flag =0 -> la ligne n'est pas à convertir et on doit recopier les lignes du S0
     
              For b = 1 To nblignes_S0
                         For jj = 1 To 67
                           PK(b, conv_flag) = Trim(sbv & "-" & HRU) & conv_flag
                           Sheets("S3").Cells(b + 1, jj + 0).Value = Sheets("S0").Cells(b + 1, jj + 0).Value
                         Next jj
                           Sheets("S3").Cells(b + 1, 18).Value = Sheets("S0").Cells(b + 1, 18).Value
                           Sheets("S3").Cells(b + 1, 4).Value = Sheets("S0").Cells(b + 1, 4).Value
                           Sheets("S3").Cells(b + 1, 10).Value = Sheets("S0").Cells(b + 1, 4).Value  'sol SWAT
            Next b
        End If  ' de conv_flag
     
       Next a 
    Sheets("S3").Rows(1).Value = Sheets("mgt2_ligne1").Rows(1).Value
    J'arrive à lire le flag dans la feuille lut, qui indique ce qui doit etre recopié en S0 ou bien en S2 mais je n'arrive pas a copier séquentiellement les lignes S0 à la suite des lignes en S2 dans la feuille S3.

    Merci d'avance
    Aude

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Salut opl2014,

    J'ai commencé à lire ce que ton code et... hum... je pense qu'il faudrait revoir certaines choses.

    Je te propose de donner à la communauté un fichier exemple avec ce que tu as initialement et ce que tu souhaites au final pour avoir une plus grande visibilité sur ce que tu souhaites vraiment faire.

    La seule chose que j'ai compris c'est que tu as trois colonnes dans deux feuilles nommées S0 et S2 et qu'avec une table de correspondance tu souhaites faire... des choses.

    Bref, un peu plus d'explicitation ne serait pas de trop je pense !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Futur Membre du Club
    Femme Profil pro
    Ingenieur environnement
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingenieur environnement
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Points : 5
    Points
    5
    Par défaut LUT
    Bonjour Kimy,

    Bon ce n'etait pas clair Je vais essayer d'expliciter au mieux.

    Voila, je veux avoir au final une feuille S3 qui comporte des items de deux feuilles S1 et S2, selon ces contraintes :
    Mes items sont notés de 1 à 470. Chaque item noté de de 1 à 470 comprend entre 8 et 20 lignes.
    La feuille S3 doit etre construite à partir des deux autres feuilles : certains items sont à prendre dans la feuille S1 et d'autres dans S2.
    C'est la table de correspondance qui permet de donner l'appartenance (conv_flag).
    Au final par exemple si mes items 1 3 et 5 sont à piocher dans le S2 donc le reste dans dans le S1, j'aurais :
    N° de ligne N° item Venant de
    1 1 S2
    2 1 S2
    3 1 S2
    4 1 S2
    5 1 S2
    6 1 S2
    7 1 S2
    8 1 S2
    9 1 S2
    10 2 S1
    11 2 S1
    12 2 S1
    13 2 S1
    14 2 S1
    15 2 S1
    16 3 S2
    17 3 S2
    18 3 S2
    19 3 S2
    16 3 S2
    17 3 S2
    18 3 S2
    19 3 S2
    19 4 S1
    19 4 S1
    19 4 S1
    19 4 S1
    19 4 S1
    19 4 S1
    19 4 S1
    19 5 S2
    19 5 S2
    19 5 S2
    19 5 S2
    19 5 S2
    19 5 S2
    19 6 S1
    19 6 S1
    19 6 S1
    etc… jusqu'à item n° 470

    Merci d'avance,

    Bonne journée,
    Aude

  4. #4
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bon...

    Je reformule :
    S1 contient 2 colonnes. Colonne A = n° d'identifiant (1 à 470) Colonne B = 8 à 20 lignes de données (quelle type de données ?)

    Pareil pour S2 mais avec des ID différents.

    Tu veux en S3 concaténer les deux feuilles pour avoir une suite logique d'ID de 1 à 470.

    C'est ça ?
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  5. #5
    Futur Membre du Club
    Femme Profil pro
    Ingenieur environnement
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingenieur environnement
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est presque ça.
    S1 et S2 contiennent les mémes formats :
    - colonne A : un long integer qui s'incrémente automatiquement et qui n'a pas de fonction autre.
    - colonne B avec un identifiant (qui correspond à un item) mais cet identifiant est déroulé sur plusieurs lignes (qui correspondent aux opérations réalisées sur cet item)

    La seule différence entre les feuilles S1 et S2 c'est que les 470 items subissent des opérations différentes (pas le meme nombre de lignes au final donc).

    Ce que je veux faire pour le S3 est de "panacher" les opérations S1 et S2, en fonction de l'item.
    Ainsi le S3 doit comporter :
    -colonne A : un N° Auto (mais je peux le rajouter à la fin ce n'est pas important pour le cas présent)
    - colonne B = mon n° item (donc de 1 à 470)
    - pour les 65 autres colonnes : recopie des opérations S1 et S2
    en fcontion de chaque item et donc de la table de converion.

    Dans ma table de conversion, chacun des 470 items est identifié en conv_flag 0 ou en 1. Si c'est 0, alors on prend le bloc d'opérations du S1 tant que le n° d'item ne change pas et est identifié en conv_flag =0, si c'est 1, alors on prend le bloc d'operation deu S2, etc....
    Mon pb est d'ecrire le S3 au fur et à mesure, pour l'item 1 à 470, en prenant les blocs S1 et S2 de façon séquentielle.

  6. #6
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Un fichier exemple aurait tellement été plus simple...

    Bref, je rereformule :
    1) Tu veux faire un compteur de 1 à 470.
    2) On vérifie dans la table de correspondance si on a un conv_flag à 0 ou à 1 (juste un entier ?)
    3) On va chercher dans S1 ou S2 en fonction de la valeur le compteur
    4) On rapatrie dans S3 les 65 colonnes correspondantes (sauf la colonne A).

    C'est ça ?
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Ingenieur environnement
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingenieur environnement
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est ça sauf qu'on ne peut pas faire reelelement de compteur de 1 à 470 car dans S1 il y a 11000 lignes et dans S2 15000 environ. La condition de copier est double : ça dépend de conv_flag et de l'item à copier.

    Ex
    Si mon item L1 a pour conv_fla 1 alors il faut aller dans S2 et copier une apres l'autre toutes les lignes et colonnes correspondant à L1 (soit 20 lignes). Puis ensuite aller voir le conv_flag de l'item suivant, le L2.
    Si dans l'onglet lut, mon conv_flag pour L2 (talbe de correspondance) est égla à 0, alors il faut aller dans l'onglet S0 et copier l'une apres l'autre dans l'onglet S3, et à la suite de ce qui a déjà été copié pour L1, toutes les lignes coorespondant à L2 provenant de S0.
    Et ainsi de suite jusqu'au dernier item de la table de correspondances (L470).

  8. #8
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    opl2014,

    Voici ce que j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    Sub move_to_S3()
    Dim Rng As Range
    Dim dest As Range
    Dim var As String
     
    Set dest = Worksheets("S3").Range("A1")
     
    'Application.ScreenUpdating = False
    'Application.Calculation = xlManual
     
    For i = 1 To 470
        With Worksheets("Table")
            var = "L" & i
            Set Rng = .Columns(1).Find(var, LookIn:=xlValues, LookAt:=xlWhole)
            If Not Rng Is Nothing Then
                If Rng.Offset(0, 1) = 0 Then
                    With Worksheets("S0")
                        Set Rng = .Range("A1")
                        For j = 0 To .Columns(1).Find("*", , , , , xlPrevious).Row
                            If Rng.Offset(j, 1) = var Then
                                With Worksheets("S3")
                                    dest = dest.Row
                                    For k = 1 To 65
                                        dest.Offset(0, k) = Rng.Offset(j, k)
                                    Next k
                                    Set dest = dest.Offset(1, 0)
                                End With
                            End If
                        Next j
                    End With
                ElseIf Rng.Offset(0, 1) = 1 Then
                    With Worksheets("S2")
                        Set Rng = .Range("A1")
                        For j = 0 To .Columns(1).Find("*", , , , , xlPrevious).Row
                            If Rng.Offset(j, 1) = var Then
                                With Worksheets("S3")
                                    dest = dest.Row
                                    For k = 1 To 65
                                        dest.Offset(0, k) = Rng.Offset(j, k)
                                    Next k
                                    Set dest = dest.Offset(1, 0)
                                End With
                            End If
                        Next j
                    End With
                Else
                    MsgBox "Problème sur le conv_flag de l'ID " & var & " : ni 0, ni 1."
                End If
            Else
                MsgBox "Problème sur l'ID " & var & " : non trouvé."
            End If
     
        End With
    Next i
     
    'Application.Calculation = xlAutomatic
    'Application.ScreenUpdating = True
     
    End Sub
    Dans un premier temps je te propose de faire un test avec For i = 1 To 25 pour vérifier si les résultats sont bons.

    A toi d'adapter en fonction de tes onglets et des colonnes que tu vises.

    Par exemple, dans mon onglet "Table" (tableau de correspondance), j'ai placé les IDs en colonne A et les conv_flag en colonne B.

    Dernier point : dès que tu as un truc fonctionnel, enlève les "'" avant les "Application". Ta macro ira bien plus vite !

    Dis moi si ca te convient !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  9. #9
    Futur Membre du Club
    Femme Profil pro
    Ingenieur environnement
    Inscrit en
    Mai 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingenieur environnement
    Secteur : Service public

    Informations forums :
    Inscription : Mai 2014
    Messages : 10
    Points : 5
    Points
    5
    Par défaut RECOPIE BLOCS DE LINGES EN FONCTION DE LA CONCORDANCE AVEC TABLE DE CORRESPONDANCES
    Bonjour Kimmy,

    ça recopie dans le S3? mais bizarrement
    En fait la macro ne garde pas en mémoire, la derniere ligne où qui a été recopiée avant de passer aux suivantes.
    De ce faite les recopies successives s'écrasent les unes les autres, et au final au lieu d'avoir 10.000 lignes environ on a 82 lignes, avec les derniers items.

    Comment fait on pour garder en memoire la dernier ligne copiée en S3 ?
    Merci pour l'info,
    Cdt
    Aude

  10. #10
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Salut opl2014,

    Je te propose en pièce jointe d'essayer ma macro sur un fichier exemple : Macro_opl2014.zip.
    Elle fonctionne bien d'après ma compréhension du besoin.

    J'ai commenté le code pour que tu puisses savoir ce qu'il y a à adapter.

    N'hésite pas à me faire un retour.

    Cordialement;
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

Discussions similaires

  1. Réponses: 1
    Dernier message: 21/05/2014, 11h05
  2. [Débutant] Création d'une classe à partir de deux autres
    Par a.floranc dans le forum VB.NET
    Réponses: 13
    Dernier message: 10/06/2012, 20h41
  3. [XL-2003] inserez une cellule à partir d'un autre feuille
    Par jeanbi dans le forum Excel
    Réponses: 3
    Dernier message: 24/01/2011, 16h46
  4. Création d'une courbe à partir de deux autres
    Par Nathaniel_etudiant dans le forum Simulink
    Réponses: 2
    Dernier message: 12/10/2010, 15h01
  5. Réponses: 11
    Dernier message: 13/07/2006, 16h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo