Boucle limité à 12 valeurs et fonction range + variable

Résolu
arthrax Messages postés 35 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 31 décembre 2023 - 11 déc. 2006 à 16:50
arthrax Messages postés 35 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 31 décembre 2023 - 12 déc. 2006 à 15:37
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

TMONOD Messages postés 256 Date d'inscription mardi 25 novembre 2003 Statut Membre Dernière intervention 6 novembre 2009 1
11 déc. 2006 à 17:56
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é[^]
3
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
12 déc. 2006 à 00:10
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
3
cs_taikibaybay Messages postés 46 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 25 décembre 2007
11 déc. 2006 à 17:40
salut,
   Range("T,U,X,Y,Z," & NumLigne & ":" & NumLigne).Copy
je ne comprend pas ce que tu veux selection
plus de precision??
0
cs_taikibaybay Messages postés 46 Date d'inscription mercredi 1 mars 2006 Statut Membre Dernière intervention 25 décembre 2007
11 déc. 2006 à 23:32
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
arthrax Messages postés 35 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 31 décembre 2023
12 déc. 2006 à 11:20
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
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
12 déc. 2006 à 11:58
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
0
arthrax Messages postés 35 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 31 décembre 2023
12 déc. 2006 à 12:52
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
0
arthrax Messages postés 35 Date d'inscription mardi 20 septembre 2005 Statut Membre Dernière intervention 31 décembre 2023
12 déc. 2006 à 15:37
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
0
Rejoignez-nous