Récupération de données et boucle

riri78 -  
pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

j'ai un classeur excel prep_nouvelle_organisation qui contient deux pages, une importations et une aideprep

je souhaite faire une (ou plusieurs) macros, qui

1) récupère automatiquement les informations des cellules Ai, Ci, Di, Ii, Mi de la feuille importations vers la feuille aideprep dans les cellules B3, B4, B5, B6, B7.

Pour le moment, j'ai réussi à créer la macro suivante:
Sub Macro7()
'
' Macro7 Macro
'
    ActiveCell.FormulaR1C1 = "=importation!R[-1]C[-1]"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=importation!R[-2]C[1]"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=importation!R[-3]C[2]"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=importation!R[-4]C[7]"
    ActiveCell.Offset(1, 0).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=importation!R[-5]C[11]"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub


Je voudrais faire une boucle qui, quand je clique sur le bouton suivant efface les informations des cellules de la feuille importations et récupère celles de la ligne suivante de la feuille aideprep

2) je rajoute une contrainte: il faut que si/tant que Ai (feuille importation)= Ai+1 (feuille importation),
C3 (feuille aideprep) = Ai (feuille importation)
et C4 (feuille aideprep) = Ci+1 (feuille importation)
et C5 (feuille aideprep) = Di+1 (feuille importation)
et C6 (feuille aideprep) = Ii+1 (feuille importation)
et C7 (feuille aideprep) = Mi+1 (feuille importation)

Sinon,
on reprend la première macro
B3 (feuille aideprep) = Ai (feuille importation)
et B4 (feuille aideprep) = Ci (feuille importation)
et B5 (feuille aideprep) = Di (feuille importation)
et B6 (feuille aideprep) = Ii (feuille importation)
et B7 (feuille aideprep) = Mi (feuille importation)

Merci beaucoup de votre aide, ça fait plusieurs jours que je galère.
N'hésitez pas à me dire si vs n'avez pas assez d'infos!

3 réponses

  1. riri78
     
    ma variable i va de 1 à 1000 par exemple, ce sont les numéros des lignes remplies sur ma feuille importation.

    et non je ne souhaite pas concaténer le contenu de plusieurs cellules dans une seule mais simplement mettre 5 cellules de la feuille importation dans 5 cellules de la feuille aideprep. Et ensuite, en appuyant sur un bouton suivant, mettre 5 autres cellules de la feuille importation (celles la ligne en dessous) dans les mêmes 5 cellules de la feuille aideprep (les autres sont donc effacées c'est pas un problème).

    En fait, la feuille importation c'est mon stock de données et la feuille aideprep vient tirer 5 infos clés pour chaque ligne.
    Donc Le bouton effectuera ces actions pour toutes les valeurs de i et je veux inscrire mes infos dans 5 cellule de la feuille aideprep et pas les stocker
    0
  2. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    Bonjour,

    Un exemple, avec une variable de portée module Ligne As Long et un bouton sur la feuille aideprep :

    Dim Ligne As Long
    
    Private Sub CommandButton1_Click()
        Dim i As Integer
        
            Ligne = Ligne + 1
            With Sheets("importations")
                If .Range("A" & Ligne) = "" Then Exit Sub
            
                Do While .Range("A" & Ligne + i) = .Range("A" & Ligne)
                    i = i + 1
                Loop
                i = i - 1
            End With
            With Sheets("aideprep")
                .Range("B3") = Sheets("importations").Range("A" & Ligne)
                .Range("B4") = Sheets("importations").Range("C" & Ligne)
                .Range("B5") = Sheets("importations").Range("D" & Ligne)
                .Range("B6") = Sheets("importations").Range("I" & Ligne)
                .Range("B7") = Sheets("importations").Range("M" & Ligne)
                If i > 0 Then
                    Ligne = Ligne + i
                    .Range("C3") = Sheets("importations").Range("A" & Ligne)
                    .Range("C4") = Sheets("importations").Range("C" & Ligne)
                    .Range("C5") = Sheets("importations").Range("D" & Ligne)
                    .Range("C6") = Sheets("importations").Range("I" & Ligne)
                    .Range("C7") = Sheets("importations").Range("M" & Ligne)
                Else
                    .Range("C3") = ""
                    .Range("C4") = ""
                    .Range("C5") = ""
                    .Range("C6") = ""
                    .Range("C7") = ""
                End If
            End With
    End Sub
    
    Sub RAZ()
        Ligne = 0
    End Sub

    0
    1. riri78
       
      Bonjour pijaku,

      tout d'abord merci bp de ton aide!!

      ensuite, j'ai testé ta macro, j'ai un souci, ça me dit erreur de compilation, end sub attendu
      0
    2. riri78
       
      Je te mets mes deux macro sur VBA


      Sub Macro_tout_en_un()
      '
      ' Macro_tout_en_un Macro
      '
      Dim Ligne As Long

      Private Sub CommandButton1_Click()
      Dim i As Integer

      Ligne = Ligne + 1
      With Sheets("importations")
      If .Range("A" & Ligne) = "" Then Exit Sub

      Do While .Range("A" & Ligne + i) = .Range("A" & Ligne)
      i = i + 1
      Loop
      i = i - 1
      End With
      With Sheets("aideprep")
      .Range("B3") = Sheets("importations").Range("A" & Ligne)
      .Range("B4") = Sheets("importations").Range("C" & Ligne)
      .Range("B5") = Sheets("importations").Range("D" & Ligne)
      .Range("B6") = Sheets("importations").Range("I" & Ligne)
      .Range("B7") = Sheets("importations").Range("M" & Ligne)
      If i > 0 Then
      Ligne = Ligne + i
      .Range("C3") = Sheets("importations").Range("A" & Ligne)
      .Range("C4") = Sheets("importations").Range("C" & Ligne)
      .Range("C5") = Sheets("importations").Range("D" & Ligne)
      .Range("C6") = Sheets("importations").Range("I" & Ligne)
      .Range("C7") = Sheets("importations").Range("M" & Ligne)
      Else
      .Range("C3") = ""
      .Range("C4") = ""
      .Range("C5") = ""
      .Range("C6") = ""
      .Range("C7") = ""
      End If
      End With
      End Sub
      <code>



      Sub RAZ()
      Ligne = 0
      End Sub
      <code>
      0
  3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773
     
    1- Ligne doit être déclarée Public en entête d'un module, en dehors et au dessus de toute Sub ou Function.
    2- Tu as "encapsulé" ma macro Private Sub Bouton_Click dans ta propre Sub...

    Donc, dans le module de ta feuille, tu dois avoir :
    [sauf si tu rattaches ta macro directement à un bouton de commande de type formulaire, auquel cas tu n'auras pas à insérer ces codes]
    Private Sub CommandButton1_Click()
        Macro_tout_en_un
    End Sub


    Dans un module standard :

    Option Explicit
    
    Public Ligne As Long
    Sub Macro_tout_en_un()
    '
    ' Macro_tout_en_un Macro
    '
    
        Dim i As Integer
        
            Ligne = Ligne + 1
            With Sheets("importations")
                If .Range("A" & Ligne) = "" Then Exit Sub
            
                Do While .Range("A" & Ligne + i) = .Range("A" & Ligne)
                    i = i + 1
                Loop
                i = i - 1
            End With
            With Sheets("aideprep")
                .Range("B3") = Sheets("importations").Range("A" & Ligne)
                .Range("B4") = Sheets("importations").Range("C" & Ligne)
                .Range("B5") = Sheets("importations").Range("D" & Ligne)
                .Range("B6") = Sheets("importations").Range("I" & Ligne)
                .Range("B7") = Sheets("importations").Range("M" & Ligne)
                If i > 0 Then
                    Ligne = Ligne + i
                    .Range("C3") = Sheets("importations").Range("A" & Ligne)
                    .Range("C4") = Sheets("importations").Range("C" & Ligne)
                    .Range("C5") = Sheets("importations").Range("D" & Ligne)
                    .Range("C6") = Sheets("importations").Range("I" & Ligne)
                    .Range("C7") = Sheets("importations").Range("M" & Ligne)
                Else
                    .Range("C3") = ""
                    .Range("C4") = ""
                    .Range("C5") = ""
                    .Range("C6") = ""
                    .Range("C7") = ""
                End If
            End With
    End Sub

    0
    1. riri78
       
      Salit Pijaku,

      j'ai tester de nouveau la macro avec ta correction mais il me dit qu'il y a un pb à la ligne With Sheets("importations") surlignée en jaune.
      J'ai mis ça dans VBA


      Private Sub CommandButton1_Click()
      Macro_tout_en_un
      End Sub
      <code>



      Sub Macro_tout_en_un()
      '
      ' Macro_tout_en_un Macro
      '

      Dim i As Integer

      Ligne = Ligne + 1
      With Sheets("importations")
      If .Range("A" & Ligne) = "" Then Exit Sub

      Do While .Range("A" & Ligne + i) = .Range("A" & Ligne)
      i = i + 1
      Loop
      i = i - 1
      End With
      With Sheets("aideprep")
      .Range("B3") = Sheets("importations").Range("A" & Ligne)
      .Range("B4") = Sheets("importations").Range("C" & Ligne)
      .Range("B5") = Sheets("importations").Range("D" & Ligne)
      .Range("B6") = Sheets("importations").Range("I" & Ligne)
      .Range("B7") = Sheets("importations").Range("M" & Ligne)
      If i > 0 Then
      Ligne = Ligne + i
      .Range("C3") = Sheets("importations").Range("A" & Ligne)
      .Range("C4") = Sheets("importations").Range("C" & Ligne)
      .Range("C5") = Sheets("importations").Range("D" & Ligne)
      .Range("C6") = Sheets("importations").Range("I" & Ligne)
      .Range("C7") = Sheets("importations").Range("M" & Ligne)
      Else
      .Range("C3") = ""
      .Range("C4") = ""
      .Range("C5") = ""
      .Range("C6") = ""
      .Range("C7") = ""
      End If
      End With
      End Sub
      <code>
      0
      1. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > riri78
         
        Salut,

        Tu n'as vraiment pas envie de faire le moindre effort?
        Ni ici, ni sur l'autre forum?
        Tu ne comprends rien aux codes que l'on te donne et, pire encore, tu ne fais aucun effort pour comprendre.

        Que signifie donc, pour toi : l'indice n'appartient pas à la sélection ?
        0
      2. riri78 > pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention  
         
        bonjour, non je n'ai aucune formation au langage vba donc c'est très difficile pour moi et je ne sais pas ce que cela signifie. et si je fais des efforts pour comprendre mais je pars de 0.
        0
      3. pijaku Messages postés 13513 Date d'inscription   Statut Modérateur Dernière intervention   2 773 > riri78
         
        Le message d'erreur l'indice n'appartient pas à la sélection signifie, entres autres, qu'un "objet" référencé dans ton code n'existe pas.

        Comment, dans ton fichier Excel, est nommée la feuille "importations"?
        "importation" ?
        "Importation" ?
        "importations" ?
        "Importations" ?
        "importation " ?
        etc...
        Place le bon nom de ta feuille dans le code donné précédemment, fais la même chose avec l'autre feuille et reviens...
        0