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 :

Procédure de nettoyage d'enregistrement


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par défaut Procédure de nettoyage d'enregistrement
    Bonjour à tous,
    Je suis actuellement en train de travailler sur une procédure qui doit nettoyer un tableau d'enregistrement sous excel. La règle de nettoyage est de supprimer du tableau les lignes dont certaines valeurs s'annulent.
    Je suis nouveau dans la programmation vba et plutôt habitué à la programmation.
    J'ai essayé de m'affranchir un maximum des fonctions type "enregistreur de macro" car la volumétrie peut-être importante (jusqu'à 1 millions de ligne).
    J'ai créé dans un traitement précédent une colonne ID qui permet de filtrer l'enregistrement "négatif" et celui qui l'annule.
    Le principe de l'algorithme est le suivant :
    1. récupération de l'ID de ligne négative dans une colonne d'un onglet suite au traitement précédent
    2. récupération des numéros de ligne associés à cet ID et récupération des données dans tableau temporaire
    3. traitement des données dans tableaux
    4. mise à jour du tableau d'entrée suivant contenu dans tableau temporaire

    Mon souci c'est que je n'arrive pas à rajouter la donnée numéro de ligne à mon tableau temporaire (l42 à 46)
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    Public Sub NettoyageLigneNegativesWithID1Neg()
     
    Dim DonneesIn As Range 'Plage de recherche
    Dim ID1NegCell As Range 'Plage appelante
    Dim FiltreID1Neg As Range 'Filtre du tableau d'entrée avec l'ID1
    Dim NumLigneNeg As Collection
    Dim firstRow As Long
    Dim TabTemporaire() As Variant
    Dim TabTemporairePos() As Variant
    Dim TabTemporaireNeg() As Variant
    Dim NumLigneTemp As Variant
    Dim LigneTemp As Range
     
    Dim i As Long
    Dim j As Long
    Dim n As Long
     
    i = 1
     
    Set DonneesIn = DatasIn.Range("A1", Range("AN1").End(xlDown))
     
    Set ID1NegCell = ID1Neg.Range("A" & i)
     
    Set NumLigneNeg = New Collection
     
    Do While Not (IsEmpty(ID1NegCell))
        Set ID1NegCell = ID1Neg.Range("A" & i)
        Set FiltreID1Neg = DonneesIn.Find(ID1NegCell.Value, DatasIn.Range("AN1"), xlValues, xlWhole, xlByRows, xlNext)
        If Not FiltreID1Neg Is Nothing Then
            firstRow = FiltreID1Neg.Row
            Do
                NumLigneNeg.Add (FiltreID1Neg.Row)
                Set FiltreID1Neg = DonneesIn.FindNext(FiltreID1Neg)
            Loop While Not FiltreID1Neg Is Nothing And FiltreID1Neg.Row <> firstRow
        End If
        j = 0
        For Each NumLigneTemp In NumLigneNeg
        'remplir un tableau temporaire contenant les lignes trouvées
        'comparer les données du tableau comme un tri http://silkyroad.developpez.com/vba/tableaux/#LXIV-D
        ' - pour trouver lignes positive et negative
        ' - si ligne positive et négative s'annule on supprime les deux et on met en rouge ID1NegCell sinon on met en bleu
            Set LigneTemp = DatasIn.Range("A" & NumLigneTemp & ":AM" & NumLigneTemp)
            ReDim Preserve TabTemporaire(j)
            TabTemporaire(j) = LigneTemp.Value
            ReDim Preserve TabTemporaire(0 To 40, 0 To j) 'ca bug ici : l'indice n'appartient pas à la sélection 
    TabTemporaire(j, 40) = NumLigneTemp
            j = j + 1
        Next
        Do While Not (IsEmpty(TabTemporaire))
            If UBound(TabTemporaire) = 1 Then 'une seule ligne dans tableau on laisse la ligne dans DatasIn et on supprime dans TabTemporaire
                ReDim TabTemporaire(1)
            Else
                For n = 0 To UBound(TabTemporaire)
                    If TabTemporaire(n)(1, 21) + TabTemporaire(n + 1)(1, 21) = 0 And TabTemporaire(n)(1, 26) + TabTemporaire(n + 1)(1, 28) = 0 And TabTemporaire(n)(1, 28) + TabTemporaire(n + 1)(1, 28) = 0 Then
                    'on supprime les éléments n et n+1 du tableau
                    End If
                Next n
            End If
        Loop
     
        Set FiltreID1Neg = DonneesIn.FindNext(FiltreID1Neg)
        i = i + 1
    Loop
     
    Debug.Print "fin traitement lignes negatives"
     
    End Sub
    Merci d'avance à vous pour votre aide.

    Thomas

  2. #2
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonjour,

    Pourquoi le nombre de dimension de tableau augmente-t-il ? (J) => (40,J)

  3. #3
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par défaut
    Je vais apporter quelques précisions sur la partie que je n'arrive pas à passer c'est à dire rajouter une valeur a mon tableau temporaire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    For Each NumLigneTemp In NumLigneNeg
            Set LigneTemp = DatasIn.Range("A" & NumLigneTemp & ":AM" & NumLigneTemp)
            ReDim Preserve TabTemporaire(j)
            TabTemporaire(j) = LigneTemp.Value
            ReDim Preserve TabTemporaire(0 To 40, 0 To j) 'ca bug ici : l'indice n'appartient pas à la sélection 
    TabTemporaire(j, 40) = NumLigneTemp
            j = j + 1
        Next
    La variable TabTemporaire (j) est de la forme suivante avant plantage :
    - : TabTemporaire(j)(1) : : Variant(1 to 39)

    Pour répondre à la question, je voulais rajouter une valeur et m'étais basé sur la forme renvoyée par l'espion positionné sur la variable TabTemporaire.
    J'ai l'impression que cette table est à 2 dimensions d'ou la redimension. Après je pense que je ne le fais pas comme il le faut.
    Quelqu'un peut-il m'aider ?

    Un petit up !
    Merci

  4. #4
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par défaut
    Bon... J'ai réussi à ajouter ma valeur en fin de tableau (en passant par tabtemp) quand je passe la première fois dans la boucle et malheureusement cela plante quand je passe la deuxième fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       For Each NumLigneTemp In NumLigneNeg
               Set LigneTemp = DatasIn.Range("A" & NumLigneTemp & ":AM" & NumLigneTemp)
            LigneTempTab = LigneTemp.Value
            ReDim Preserve TabTemporaire(j, 1 To k)
            For k = 1 To 39
                ReDim Preserve TabTemporaire(0 To j, k)  ' 2 ème passage dans la boucle for each: l'indice n'appartient pas à la sélection
                TabTemporaire(j, k) = LigneTempTab(1, k)
            Next k
            ReDim Preserve TabTemporaire(j, 40)
            TabTemporaire(j, 40) = NumLigneTemp
            j = j + 1
        Next

  5. #5
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    J'ai du mal à saisir ton algo...

    sinon Redim Preserve.. permet seulement de modifier la dernière dimension du tableau...

  6. #6
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par défaut
    Ma problématique initiale est que je veux supprimer des lignes qui s'annulent dans un tableau excel.
    Ex : ligne 1 et 3 ci-dessous
    A | B | C | D
    1 : xxxxx | -1 | -2 |-3
    2 : aaaaa| 0 | 5 | 8
    3 : xxxxx | 1 | 2 | 3
    La seule solution que j'ai trouvé est de retrouver grace un filtre par ID (dans l'exemple la colonne A) les deux lignes qui s'annulent.
    Je mets ensuite les deux lignes dans un tableau temporaire (contenant les colonnes + le numéro de la ligne) et je compare les éléments n et n+1 du tableau temporaire s'ils s'annulent je les supprime du tableau temporaire et grâce au numéro de ligne je les supprime aussi dans mon tableau (deleteentirerow).
    La partie où je galère est celle quand je veux rajouter le numéro de ligne à mon élément du tableau qui contient les colonnes de ma ligne...
    Je ne sais pas si je suis assez clair ou s'il y a un moyen de faire ce que je veux de manière plus simple.

    J'ai réussi à passer la partie qui posait en inversant les dimensions mais j'ai l'impression de faire des choses trop compliquées au niveau algorithmique.
    Est-ce qu'au vue de mon post précédent, il n'y aurait pas une manière plus simple de faire ce que je veux ?

  7. #7
    Membre averti
    Inscrit en
    Septembre 2008
    Messages
    21
    Détails du profil
    Informations forums :
    Inscription : Septembre 2008
    Messages : 21
    Par défaut
    ultime demande d'aide !

Discussions similaires

  1. Procédure stockée avec n enregistrements
    Par Raphael1980 dans le forum HyperFileSQL
    Réponses: 15
    Dernier message: 15/07/2011, 19h32
  2. Réponses: 0
    Dernier message: 26/01/2010, 16h01
  3. Procédure stockée, copie d'enregistrement d'une table vers une autre
    Par sarah65536 dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 15/06/2009, 18h02
  4. [SQL SERV 2K] Problème d'update enregistrement dans procédure
    Par Tankian dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 08/06/2006, 09h42
  5. procédure du bouton enregistrer d'une commondialog
    Par ANOVA dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 29/11/2005, 12h18

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