Récupération de données et boucle

Fermé
riri78 - Modifié par pijaku le 17/05/2016 à 12:31
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 - 18 mai 2016 à 10:00
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

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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
17 mai 2016 à 14:33
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
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754
17 mai 2016 à 15:56
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
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754 > riri78
18 mai 2016 à 09:06
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
riri78 > pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024
18 mai 2016 à 09:56
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
pijaku Messages postés 12263 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 4 janvier 2024 2 754 > riri78
18 mai 2016 à 10:00
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