Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 26/01/2012, 15h39   #1
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Par défaut Macro avec Autofill

Bonjour,

Je découvre l'univers des macros sur Excel 2007, et je vous avoue que quand ça ne marche pas je ne sais pas trop comment corriger mes erreurs.
J'ai un fichier avec plus de 4000 lignes, que je voudrais traiter.

Pour l'instant je m'entraine sur un petit fichier exemple, et ça ne marche pas
Je veux par exemple créer une macro qui me remplit la case A1 avec un chiffre quelconque (1 par exemple), et qui l'étend jusqu'à A10. Ensuite, je voudrais que la macro copie A1:A10 dans la colonne B. J'ai créé une macro qui reproduit ces actions, mais quand je la ré-éxécute, elle ne fonctionne même pas !
Voici le code que j'ai après avoir fait les actions à la main :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
Sub Macro4()
'
' Macro4 Macro
'
    Range("A1").Select
    ActiveCell.FormulaR1C1 = "1"
    Selection.AutoFill Destination:=Range("A1:A10"), Type:=xlFillDefault
    Range("A1:A10").Select
    Selection.Copy
    Range("B1").Select
    ActiveSheet.Paste
End Sub

Quand je l'exécute, j'ai ".AutoFill" qui se surligne et le message "Erreur de compilation: Membre de méthode ou de données introuvable".

Pourquoi ça ne marche pas ?
Merci d'avance
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 16h38   #2
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

L’enregistreur de macro donne de bonnes indications pour rédiger un code mais il a la fâcheuse tendance à abuser de la méthode SELECT.
Voici ton code modifié et commenté

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Macro4()
'Je définis la feuille sur laquelle je souhaite appliquer mon code
With Worksheets("Feuil1")
    'j'affecte la valeur 1 à la cellule A1
    .Range("A1") = 1 ' le point avant Range indique que cette plage est associée à la feuille référencée Worksheets("Feuil1")
    'j'affecte la valeur 2 à la cellule A2
    .Range("A2") = 2
    'J'effectue une recopie incrémentée dans les cellules de la plage A1:A10.
    .Range("A1:A2").AutoFill Destination:=Range("A1:A10"), Type:=xlFillDefault
    'J'effectue une copie de la plage A1:A10 vers une plage débutant en B1
    .Range("A1:A10").Copy Destination:=.Range("B1")
End With
End Sub
L'intérêt avec cette méthode, c'est que tu indiques explicitement l'objet sur lequel tu effectues l'opération (objet feuille "Feuil1" dans ce cas).

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/01/2012, 18h17   #3
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Bonjour,

Merci beaucoup de ta réponse, ça marche très bien !
En utilisant Worksheets("feuil1"), cela veut dire que dans la même macro je peux jongler entre différentes feuilles d'un même classeur ? Ca serait pratique car je risque de devoir utiliser des données de feuil1 sur une feuil2

Maintenant que ça marche, j'essaie de faire une moyenne entre 2 cellules d'un tableau de données, toutes les 2 cellules (En clair, faire la moyenne entre A1 et A2, puis A3 et A4 ...etc.). Cela fonctionne avec la macro réalisée à la main, mais je vais essayer de reprendre ta syntaxe, c'est plus clair.

Je risque d'avoir d'autres questions à venir

Merci en tout cas !
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 18h30   #4
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Oui, tu as bien compris.

Si tu écris
Code :
Worksheets("Feuil1").Range("A1:A10").Copy Destination:=Worksheets("Feuil2").Range("B1")
tu vas effectuer la copie d'une plage de la feuille "Feuil1" dans la feuille "Feuil2"

Bon courage

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 19h51   #5
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Je te remercie, je vais essayer d'avancer comme un grand maintenant

Bon, j'ai réussi à faire ce que je voulais.
Maintenant, un autre souci se pose à moi. Voilà le contexte : J'ai un relevé de vent et de puissance pour 3 éoliennes sur un mois, avec un pas de 10'. Soit environ 4000 lignes. Et c'est c'est ces données que je veux trier.
Disons qu'elles sont sur feuil1, et qu'il y a 3 colonnes : Dans la colonne A, l'identifiant de l'éolienne (E1, E2, E3), dans B le vent, et dans C la puissance.

Ce que je voudrais, c'est trier pour une éolienne, sachant que le nombre de ligne par éolienne est variable. Donc sélectionner la plage de B et C en fonction de la "valeur" en A, puis copier les données sur feuil2 pour les traiter. C'est possible ça ?
Je voudrais en être sûr parce que mes recherches sont pas très fructueuses pour l'instant sur le sujet
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/01/2012, 21h30   #6
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
C’est possible ? Faut voir !
Tu peux commencer avec l’enregistreur de macro.

Sélectionner la plage de la feuille 1
Filtrer
Sélectionnez la valeur correspondant à l’éolienne dans la liste des valeurs de texte
Copier la plage
Sélectionner la feuille 2
Collage spécial / Valeurs / Blancs non compris

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 14h04   #7
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Bonjour,

Désolé du retard, je n'ai pas pu travailler dessus depuis 3 jours, mais j'ai réussi à coder ce que je voulais. C'est un mélange entre ta syntaxe et celle de l'enregistreur de macro, donc c'est très laid, mais ca fonctionne et pour l'instant c'est le principal

Maintenant que mes 2 colonnes A et B sont triées, je voudrais filtrer A avec un critère et récupérer les colonnes de B correspondantes.

Par exemple, je souhaite sélectionner toute la colonne A (ça je sais faire ), et lui faire afficher les lignes dont la valeur est comprise entre 0.95 et 1.05.
J'ai essayé le filtre automatique, seulement il se sert de la valeur de la cellule active pour faire le tri. Je voudrais m'en affranchir et faire un tri avec ma propre valeur que je lui donne.

Je sais pas si je suis clair, mais merci d'avance de vos réponses
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/01/2012, 15h11   #8
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Tu peux obtenir le résultat attendu avec le filtre automatique.
Avec l’enregistreur de macro :
Tu sélectionnes A1 puis Menu Accueil / Filtrer
Choix du filtre en A1 : Filtres numériques / Entre … / puis choix des valeurs (haute et basse).

La seule « anomalie » lors de cet enregistrement, c’est que les valeurs de critères sont enregistrées avec une virgule. Pour que cela fonctionne, il faut remplacer ces virgules par un point.

Ensuite, tu fais une copie des cellules visibles vers la feuille 2.
Voici le code correspondant pour la plage A1:C50
Code :
1
2
3
4
5
6
7
Sub Test()
    Range("A1").AutoFilter
    ActiveSheet.Range("$A$1:$C$15").AutoFilter Field:=1, Criteria1:=">=0.7", _
        Operator:=xlAnd, Criteria2:="<=0.9"
        Range("A1:C50").SpecialCells(xlCellTypeVisible).Copy Destination:=Sheets("Feuil2").Range("A1")
    Range("A1").AutoFilter
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 10h11   #9
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Bonjour,

Merci de ton aide. J'ai un peu adapté ton code, parce que le filtrage gardait la valeur de A1, même si celle-ci ne faisait pas partie de l'intervalle de valeur
Mon souci, c'est que je répète ce filtrage pour d'autres valeurs. En fait je cherche à trier sur un intervalle de +/- 0.05 autour d'un entier :

1 --> [0.95;1.05]
2 --> [1.95;2.05]
3 --> [2.95;3.05]
... jusqu'à N

J'ai donc pensé à ce code :
Code :
1
2
3
4
5
6
7
Dim i As Integer
For i = 1 To 10 Step 1
'Je filtre sur i, de la première cellule jusqu'à la dernière (qui est variable)
ActiveSheet.Range("G1", [G65000].End(xlUp)).AutoFilter Field:=1, Criteria1:=">=(i-0.05)", _
Operator:=xlAnd, Criteria2:="<=(i+0.05)"
Next i
End Sub
Mais quand j'exécute, ca ne reconnait pas i
De même, comment je peux lui dire de copier une valeur dans la cellule H associée à la valeur de i ?
i=1 --> H1
i=2 --> H2 ...etc.

Désolé de toutes ces questions, mais je trouve pas grand chose sur le net pour avancer seul

Merci d'avance
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2012, 13h36   #10
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Citation:
J’ai un peu adapté ton code, parce que le filtrage gardait la valeur de A1, même si celle-ci ne faisait pas partie de l'intervalle de valeur.
Pour utiliser AutoFilter, il faut réserver la première ligne à l’en-tête.
Citation:
quand j'exécute, ca ne reconnait pas i
Le critère est une chaine de caractères.
Théoriquement, pour intégrer i au critère, il faudrait écrire Criteria1=">=" & Cstr( i-0.05)
Avec i=1, cela se traduirait par Criteria1= ">=0,95"
Mais comme je te l’ai indiqué précédemment, pour que cela fonctionne il faut remplacer la virgule par un point.
D’où la solution pour déclarer le critère :
Code :
C1 = Replace(">=" & CStr(i - 0.05), ",", ".")
Et idem pour la valeur haute.
Voici le code correspondant
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub test()
Dim i As Integer
Dim C1 as String, C2 as String
For i = 1 To 10
    C1 = Replace(">=" & CStr(i - 0.05), ",", ".")
    C2 = Replace("<=" & CStr(i + 0.05), ",", ".")
    'Je filtre de la première cellule jusqu'à la dernière (qui est variable)
    ActiveSheet.Range("G1", [G65000].End(xlUp)).AutoFilter Field:=1, Criteria1:=C1, _
    Operator:=xlAnd, Criteria2:=C2
    'Je copie
    Range("A1:C50").SpecialCells(xlCellTypeVisible).Copy Destination:=Sheets("Feuil2").Range("A1")
Next i
End Sub
Citation:
Comment je peux lui dire de copier une valeur dans la cellule H associée à la valeur de i ?
Pour copier la valeur de la cellule G dans la cellule H
ActiveSheet.Range("H" & i) = ActiveSheet.Range("G" & i)

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 11h59   #11
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Merci encore une fois de ton aide, tout ça m'a bien servi !
Je tâtonne mais j 'avance petit à petit malgré tout

Bon, j'ai fini de coder mes macros de manière indépendante mais quand je veux les réunir, j'ai un problème ...

J'ai ma macro qui trie mes données par ordre croissant, qui fonctionne très bien (j'ose pas montrer le code tellement c'est laid).
J'ai ma macro qui filtre les données par intervalle, et qui calcule la moyenne associée, dont voici le code :
Code :
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
Sub Filtre()
'
' Filtre Macro
 
Dim i As Integer
Dim c As Range
Dim Total, Moyenne As Double
Dim Compteur As Integer
Dim C1 As String, C2 As String
i = 1
 
For i = 1 To 10
    Compteur = 0
    Total = 0
 
'Je filtre sur mon intervalle    
    C1 = Replace(">=" & CStr(i - 0.05), ",", ".")
    C2 = Replace("<=" & CStr(i + 0.05), ",", ".")
    ActiveSheet.Range("G1", [G65000].End(xlUp)).AutoFilter Field:=1, Criteria1:=C1, _
    Operator:=xlAnd, Criteria2:=C2
 
'Je sélectionne mes données triées 
Range("I2:I" & Range("I65536").End(xlUp).Row).SpecialCells(xlVisible).Select
 
'Je fais la moyenne
        For Each c In Selection
            Total = Total + c.Value
            Compteur = Compteur + 1
        Next c
        Moyenne = (Total) / (Compteur)
        Cells(i, 13) = Moyenne
Next i
End Sub
Ces 2 macros fonctionnent très bien, mais quand j'intègre la macro Filtre à l'autre, j'ai un problème au niveau de la boucle "For Each c in Selection" puisque j'ai le message d'erreur qui s'affiche :"Erreur de compilation : Fonction ou variable attendue".

Je ne comprends pas pourquoi ça ne marche plus
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 13h46   #12
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
Bonjour,

Avec ce que tu me donnes, difficile de pousser l’analyse très loin (je ne peux pas voir les éléments qui peuvent interagir).
Essaie avec ce code (changement du nom des variables).
Code :
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
Option Explicit
Sub Filtre()
' Filtre Macro
Dim i As Integer
Dim c As Range
Dim TotalX As Double, MoyenneX As Double
Dim CompteurX As Long, DerLigX
Dim C1 As String, C2 As String
Dim MaPlageX As Range
i = 1
 
For i = 1 To 10
    CompteurX = 0
    TotalX = 0
 
    'Je filtre sur mon intervalle
    C1 = Replace(">=" & CStr(i - 0.05), ",", ".")
    C2 = Replace("<=" & CStr(i + 0.05), ",", ".")
    ActiveSheet.Range("G1", [G65000].End(xlUp)).AutoFilter Field:=1, Criteria1:=C1, _
    Operator:=xlAnd, Criteria2:=C2
 
    'Je sélectionne mes données triées
    DerLigX = Range("I65536").End(xlUp).Row
    Set MaPlageX = Range("I2:I" & DerLigX).SpecialCells(xlVisible)
 
    'Je fais la moyenne
        For Each c In MaPlageX
            TotalX = TotalX + c.Value
            CompteurX = CompteurX + 1
        Next c
        MoyenneX = (TotalX) / (CompteurX)
        Cells(i, 13) = MoyenneX
Next i
End Sub
Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h11   #13
Invité de passage
 
Homme
Étudiant
Inscription : janvier 2012
Messages : 22
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : Industrie

Informations forums :
Inscription : janvier 2012
Messages : 22
Points : 1
Points : 1
Bonjour,

Ca marche parfaitement ! Ca a l'air tellement simple, mais n'ayant aucune base, je suis très vite perdu ...
Merci encore !
Dadadidou est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/02/2012, 15h26   #14
Membre Expert
 
Homme
Retraité
Inscription : avril 2011
Messages : 700
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Retraité

Informations forums :
Inscription : avril 2011
Messages : 700
Points : 1 460
Points : 1 460
As-tu trouvé la variable qui provoquait le dysfonctionnement ?

Si O.K, n'oublie pas de cliquer sur

Cordialement.
gFZT82 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h35.


 
 
 
 
Partenaires

Hébergement Web