IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Tri selectif d'un fichier excel en VBA


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut Tri selectif d'un fichier excel en VBA
    bonjour, je suis débutant en VBA mais j'ai quelques connaissances en C, html et php
    je voudrai créer une macro qui synchroniserai plusieurs fichiers excel à partir d'un fichier excel selon deux critères:

    si la colonne D = "presta1" et la colonne E="erreur" de la ligne X
    copie de la ligne X a la suite sur fichier "presta1.xls"
    sinon
    si la colonne D = "presta2" et la colonne E="erreur" de la ligne X
    copie de la ligne X a la suite sur fichier "presta2.xls"
    ...ainsi de suite....

    puis tous ça imbriqué dans une matrice de balayage pour balayer tous le fichier a trier


    alors voici mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
     
    Sub tri()
     
    Dim l As Integer
    Dim i As Integer
    Dim WBSource As Workbook, WBDest As Workbook
    Dim DerniereLigne As Integer
    DerniereLigne = Range("D50").CurrentRegion.End(xlDown).Row
    Set WBSource = Workbooks("SUIVI")
    Set WBDest = Workbooks("presta1")
    Set WBDest1 = Workbooks("presta2")
     
    'sauvegarde une copie avec la date de l'execution
    ActiveWorkbook.SaveAs Filename:=suivi_
    "chemin\suivi" & Date & ".xlsm", _
    FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False
     
    For l = 1 To DerniereLigne
     'balayage de toute ligne de 1 à 50
     
    If (ActiveSheet.Cells(l, D) = "presta1") And (ActiveSheet.Cells(l, E) = "erreur") Then
    'test si la cellule lD = presta1 et si la cellule lE = erreur
     
    'alors faire ceci
     i = WBDest.Worksheets(1).Range("A65536").End(xlUp).Row + 1
    'cherche une ligne vide dans WBdest
     
    'copie la ligne l sur fichier destinataire
    WBSource.Worksheets(1).Rows(l).Copy _
        Destination:=WBDest.Worksheets(1).Cells(i, 1)
     
    'suprime la ligne de la source
    WBSource.Worksheets(1).Rows(l).Delete
    end if
    If (ActiveSheet.Cells(l, D) = "presta2") And (ActiveSheet.Cells(l, E) = "erreur") Then
    'test si la cellule lD = presta2 et si la cellule lE = erreur
     
    'alors faire ceci
     i = WBDest1.Worksheets(1).Range("A65536").End(xlUp).Row + 1
    'cherche une ligne vide dans WBdest1
     
    'copie la ligne l sur fichier destinataire
    WBSource.Worksheets(1).Rows(l).Copy _
        Destination:=WBDest1.Worksheets(1).Cells(i, 1)
     
    'suprime la ligne de la source
    WBSource.Worksheets(1).Rows(l).Delete
     end if
    Next l
     
    End Sub
    mais ceci ne fonctionne pas, pouvez vous m'aidez?

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Il est judicieux de faire un filtre automatique et de transférer le résultat en bloque que de balayer toutes les lignes.

    Je suppose que le fichier contenant la macro et les fichiers presta1.xls et presta2.xls se trouvent dans le même répertoire

    Les lignes correspondant aux critères presta1 ou presta 2 en D et erreur en E seront transférés dans le fichier adéquat et supprimés du fichier contenant la macro. Ce dernier sera enregistré sous forme suivi_aaaammjj.xlsm

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    Option Explicit
     
    Sub TRANSFERT()
    Dim Chemin As String, Presta As String, Suivi As String
    Dim Ws As Worksheet, Wsd As Worksheet
    Dim LastLig As Long, NewLig As Long
    Dim Wbk As Workbook
    Dim k As Byte
    Dim Tb
     
    Application.ScreenUpdating = False
    Chemin = ThisWorkbook.Path & "\"
    Tb = Array("presta1", "presta2")
     
    Set Ws = ThisWorkbook.Worksheets(1)
    For k = LBound(Tb) To UBound(Tb)
        Presta = Chemin & Tb(k) & ".xls"
        If Dir(Presta) <> "" Then
            With Ws
                .AutoFilterMode = False
                LastLig = .Cells(.Rows.Count, "D").End(xlUp).Row
                .Range("D1:E" & LastLig).AutoFilter Field:=1, Criteria1:=Tb(k)
                .Range("D1:E" & LastLig).AutoFilter Field:=2, Criteria1:="erreur"
     
                If .Range("D1:D" & LastLig).SpecialCells(xlCellTypeVisible).Count > 1 Then
                    Set Wbk = Workbooks.Open(Presta)
                    Set Wsd = Wbk.Worksheets(1)
                    NewLig = Wsd.Cells(Wsd.Rows.Count, 1).End(xlUp).Row + 1
                    With .Rows("2:" & LastLig).SpecialCells(xlCellTypeVisible)
                        .Copy Wsd.Cells(NewLig, 1)
                        .Delete
                    End With
                    Set Wsd = Nothing
                    Wbk.Close True
                End If
     
                .AutoFilterMode = False
            End With
        End If
    Next k
    Set Ws = Nothing
     
    Suivi = Chemin & "Suivi_" & Format(Date, "yyyymmdd")
    Application.DisplayAlerts = False
    ThisWorkbook.SaveAs Suivi, xlOpenXMLWorkbookMacroEnabled
    Application.DisplayAlerts = True
    MsgBox "Traitement terminé"
    End Sub
    Edit: les fichiers presta1.xls et presta2.xls doivent être fermés

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    merci pour cette rapidité,
    alors pour le moment le suivi est dans le même répertoire mais à terme non, pour bien séparer l'extract donc j'aurai trois répertoire échantillonnage , un suivi et un avec tous les presta
    mais déjà que sa fonctionne sur le même répertoire après c'est juste le chemin d’accès qui change.
    ton code termine sans erreur avec le message "Traitement terminé"
    j'ai bien une copie identique avec la date du jour
    mais le fichier presta 1 et presta 2 sont vides ils ne se remplissent pas.

    en gros le but est de remplir les fichiers presta1,presta2,....(il y en a 20) avec les lignes en erreur de chaque presta du fichier suivi.

    échantillonnage semaine regroupant 20 presta.
    en fin de semaine on renvoi les lignes en erreur a chaque presta.
    et au lieu de trier presta par presta copier collé ...
    je veux automatiser tous ça.

    donc voici mon logigramme
    Nom : algo.PNG
Affichages : 1809
Taille : 51,0 Ko

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Si tes fichiers sont vide, c'est à dire quand on applique le filtre automatique sur D (critère presta1) et sur E (critère erreur) ça ne donné pas de lignes répondant aux 2 critères

    Exécute le code pas à pas à l'aide de F8 et regarde ce qu'il faut adapter.

    PS. Tu ne t'attends quand même pas à une solution fonctionnelle à 100% sans adaptation à tes fichiers

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13
    Par défaut
    non j’attends pas quelques chose de tous fais, j'ai mis le logigramme pour mieux comprendre le projet.

    et j'ai un peu de mal a comprendre ton code.
    mais le premier if si presta différent de ""
    retourne toujours faux
    donc il ne fais pas de comparaison des cellules

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Tu sais faire manuellement un filtre automatique sur une feuille excel?
    Si oui, le code fait de même

Discussions similaires

  1. [VBA] comment lire un fichier Excel en VBA
    Par mdmdmd dans le forum SDK
    Réponses: 1
    Dernier message: 17/07/2007, 16h19
  2. envoi mail fichier excel en VBA
    Par natie_49 dans le forum Excel
    Réponses: 1
    Dernier message: 09/07/2007, 19h56
  3. Fermeture fichier excel en vba
    Par avyrex dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 19/11/2006, 21h30
  4. créer un fichier excell avec VBA(access)
    Par JCH dans le forum Access
    Réponses: 1
    Dernier message: 19/09/2006, 19h07
  5. Ouverture d'un fichier Excel en VBA par Access
    Par illight dans le forum Access
    Réponses: 2
    Dernier message: 02/11/2005, 11h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo