Boucle limité à 12 valeurs et fonction range + variable [Résolu]

Signaler
Messages postés
30
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
3 décembre 2018
-
Messages postés
30
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
3 décembre 2018
-
Bonjour,

Je dois faire un script VBA sous excel pour récupérer les champs des 12 derniers mois.

J'ai commencer à faire un script où je récupère les derniers jours de chaque mois mais comment arreter la récupération à 12 occurences ?

Ensuite une fois les 12 derniers mois déterminé, je dois voir à quel ligne ils correspondent et récupéré 2 champs + le mois et la date. Et là 2e problème, je n'arrive pas à utilisé la fonction range pour récupérer ces champs. Quel est la bonne syntaxe ?

Merci
Arthrax

           T                           U                          X         Y         Z
    CapacitéDisk     %OccupationDisk       Année    Mois   Jour
1        120                        12                        2006      12      8
2        120                        11                        2006      12      5
3        120                        11                        2006      11      25
4        120                        10                        2006      11      15
5        120                          9                        2006      10      21

Sub Taux()

    Dim MoisCourant As Range
    Dim MoisSuivant As Range
    Dim NumLigne As Integer

    Set MoisCourant = ActiveSheet.Range("Y")     'Y= dernier mois (déjà trier)
'Boucle pour récupérer le dernier jour de chaque mois Comment limiter à 12 occurence ?
   Do While Not IsEmpty(MoisCourant) = True 'arret de la boucle si cellule vide 
        Set MoisSuivant = MoisCourant.Offset(1, 0) 'descendre d'une ligne
        If MoisSuivant.Value <> MoisCourant.Value Then
        MoisCourant.Activate
        NumLigne = ActiveCell.Row     'afin de connaitre le numéro de ligne
        Range("T,U,X,Y,Z," & NumLigne & ":" & NumLigne).Copy 'sélection des champs à copier
Quel est la bonne syntaxe pour le range ? car là Erreur d'execution 1004 : La méthode ' range' de l'objet "_Global" a echoue
        Selection.Copy
        Range("B3").PasteSpecial xlPasteValues
        End If
        Set MoisCourant = MoisSuivant 'passage à la ligne suivante
   Loop
End Sub

8 réponses

Messages postés
256
Date d'inscription
mardi 25 novembre 2003
Statut
Membre
Dernière intervention
6 novembre 2009
1
Bonjour,
Tu as essayé en mettant un compteur dans ta boucle while ?

dim compteur as integer
...
 Do While Not IsEmpty(MoisCourant) = True  and compteur<13 'arret de la boucle si cellule vide  

.....
compteur=compteur+1
           Loop
Jcbé[^]
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Tu écris
Set MoisCourant = ActiveSheet.Range("Y")
mais Y quoi ?
peut-être
Set MoisCourant = ActiveSheet.Columns("Y:Y")
et peut-être que je me trompe...(?)

Pour une sélection multiple, voici la méthode:
Dim Ligne As Integer
Ligne = 10
Range("A" & Ligne & ", C" & Ligne & ", F" & Ligne).Select

Essaie ta macro en pas à pas (F8)
et regarde ce qui se passe sur ta feuille à chaque ligne de code

MPi
Messages postés
46
Date d'inscription
mercredi 1 mars 2006
Statut
Membre
Dernière intervention
25 décembre 2007

salut,
   Range("T,U,X,Y,Z," & NumLigne & ":" & NumLigne).Copy
je ne comprend pas ce que tu veux selection
plus de precision??
Messages postés
46
Date d'inscription
mercredi 1 mars 2006
Statut
Membre
Dernière intervention
25 décembre 2007

je te donne une astuc pour tout VBA sous excel
quand tu es sur une feuille excel, tu lance une nouvelle macro puis tu fais ce que tu veux faire comme un utilisateur normale donc tes selection, puis tu arrete la macro puis va voir le code dans la mcro??? tu n as qu a changé le code selon tes besoin
C cooooollll non
Messages postés
30
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
3 décembre 2018

Merci à toute les personnes qui m'ont répondu

taikibaybay : j'ai fait une erreur de syntaxe, la vrai syntaxe est
Range("A" & Ligne & ", C" & Ligne & ", F" & Ligne).SelectMerci à Mpi
et oui je connais l'enregistreur de macro (qui est fort utile d'ailleur), merci.

TMONOD : Merci c'est exactement ce qu'il me fallait.
Mpi : Set MoisCourant ActiveSheet.Range("Y") est équivalent à Set MoisCourant ActiveSheet.Columns("Y:Y").
Merci de m'avoir donné la bonne syntaxe pour mon range et pour l'astuce avec F8.

Par contre maintenant j'ai un autre soucis, lorsque je copie ma sélection avec Range("B3").PasteSpecial xlPasteValues
et à cause de ma boucle, les valeurs sont écrasées au fur et à mesure. Donc j'ai cherché et trouvé Range("BK3").Insert Shift: =xlDown pour insérer des données vers le bas mais ça ne marche pas. Erreur de syntaxe ??

Merci grâce à vous je progresse énormément en vba.
Arthrax

Dim MoisCourant As Range
Dim MoisSuivant As Range
Dim NumLigne As Integer
Dim Compteur As Integer
Set MoisCourant = ActiveSheet.Range("Y")
    Do While Not IsEmpty(MoisCourant) = True And Compteur < 12
        Set MoisSuivant = MoisCourant.Offset(1, 0)
        If MoisSuivant.Value <> MoisCourant.Value Then
            MoisCourant.Activate
            NumLigne = ActiveCell.Row
            Range("T" & NumLigne & ", U" & NumLigne).Select
            Selection.Copy
            Range("BK3").Insert Shift:=xlDown
            Compteur = Compteur + 1
        End If
    Set MoisCourant = MoisSuivant
    Loop
Messages postés
3877
Date d'inscription
mardi 19 mars 2002
Statut
Membre
Dernière intervention
23 août 2018
18
Plutôt que Range("BK3").insert
essaie
Rows("B:B").Insert  'insère une ligne complète
ou
Range("B3:K3").insert  'insère des cellules sur la section B à K

MPi
Messages postés
30
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
3 décembre 2018

Je viens d'essayer tes codes MPi mais ça ne fonctionne pas . Rien n'est affiché.
Je me suis peut être mal exprimé mais lorsque j'ai mis Range("BK3"), cela correspond à la cellule de l'intersection de la colonne BK et de la ligne 3, c'est l'endroit où les résultats doivent être collés.
Je me demande comment fonctionne la fonction Insert Shift:=xlDown car logiquement elle doit coller les valeurs les une en dessous des autres. Et si c'est le cas, à cause de la boucle Do While dans mon code, ça ne peut pas fonctionné : les valeurs sont écrasés d'une itération à l'autre ...

Arthrax
Messages postés
30
Date d'inscription
mardi 20 septembre 2005
Statut
Membre
Dernière intervention
3 décembre 2018

Je viens de trouver une solution pas très propre mais qui fonctionne, j'utilise le compteur (qui s'incremente de 1 à chaque itération) pour mettre le résultat sur la ligne
suivante.
Au lieu de mettre Range("BK3").Insert Shift:= xlDown
Je met  Range("BK" & Compteur).PasteSpecial xlPasteValue

Merci pour vos aides au combien précieuses
Arthrax

P.S. : Toujours pas compris comment utiliser insert Shift:=xlDown

Dim MoisCourant As Range
Dim MoisSuivant As Range
Dim NumLigne As Integer
Dim Compteur As Integer
Set MoisCourant = ActiveSheet.Range("Y")
    Do While Not IsEmpty(MoisCourant) = True And Compteur < 12
        Set MoisSuivant = MoisCourant.Offset(1, 0)
        If MoisSuivant.Value <> MoisCourant.Value Then
            MoisCourant.Activate
            NumLigne = ActiveCell.Row
            Range("T" & NumLigne & ", U" & NumLigne).Select
            Selection.Copy
            Range("BK" & Compteur).PasteSpecial xlPasteValues
            Compteur = Compteur + 1
        End If
    Set MoisCourant = MoisSuivant
    Loop