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 :

Regrouper lignes non vides


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Profil pro
    Président
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations professionnelles :
    Activité : Président

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Regrouper lignes non vides
    Bonjour à tous, Merçi aux forums

    Je suis nouveau sur developpez.net, et j'ai plusieurs centres d'intérets
    j'ai commencé une recherche sur le forum Excel VBA en lisant page à page les différentes discussions à partir de leurs titres, puis en utilisant recherches avancées mais je n'ai pas de réponse pour mes sujets.

    Je cherche à regrouper les lignes non vides d'une liste.

    j'ai construit une feuille "Articles et produits", environ 1000 lignes définissant par ligne un article unique (N° article, libellé, marque, Pa HT, Taux TVA, qu dispo en stock)
    sur cette feuille je traite un bordereau de réception fournisseur en indiquant sur la ligne de l'article la qu reçue et le prix achat HT.

    J'ai donc un certain nombre de lignes renseignées (ex: 200 lignes sur 1000 non successives)

    Afin de ne pas modifier le fichier articles, je recopie les cellules renseignées en utilisant des formules du type Si(QUarticle>=1;Narticle;"") etc, et j'obtiens une liste avec des lignes renseignées et des lignes renseignées par ""

    Pour pouvoir ensuite ventiler les fiches de stocks correspondantes, je souhaite regrouper dans une autre liste les lignes renseignées en les regroupants et en éliminant les lignes avec "", de façon à pouvoir transférer les infos dans un deuxième classeur (traitement stock et prix moyen pondéré) en utilisant une copie past spéciale valeur

    Est ce possible ?, et SVP ou trouver la procédure

    Pour info, j'ai réalisé le classeur traitant une gestion commerciale compléte me permettant d'avoir les infos recherchées, mais il très lourd 72 Mo, donc lent et inefficace.

    Pouvez m'orienter sur les bons tutos, ou des solutions deja développées sur les forums

    Merçi d'avance,

    Bien à vous Macjade62

  2. #2
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Ce que tu veux c'est supprimer les lignes entièrement vides ? Alors si c'est ça, regarde
    Tu dis si ça ne correspond pas
    A+

  3. #3
    Candidat au Club
    Profil pro
    Président
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations professionnelles :
    Activité : Président

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Re: regrouper lignes non vides
    Bonjour à tous,
    Bonjour et merçi ouskel'n'or,

    J'ai lu le lien que tu m'as proposé, ce qui m'a donné à réfléchir mieux.
    J'ai donc décidé de couper mon application en deux classeurs, pour accélérer le traitement des données
    un classeur : commerce environ 3 Mo
    un classeur : gestion et stock environ 65 Mo

    Pour le pbl évoqué je souhaite modifier ma question,

    Dans classeur commerce, je traite factures clients et bordereaux fournisseurs
    pour renseigner une feuille "mouvement du jour", en saisissant le n° article et la quantité vendue pour les factures et pour les bordereaux fournisseurs je saisie dans la liste articles (prés renseignée) la qu et le prix achat HT, toutes les autres infos sont issue de formules.



    Le problème est que je ne connais pas le nombre de lignes qui seront renseignées aussi bien pour facture que bordereaux fournisseurs, donc avant de renseigner "mouvement du jour", je fait un copier/coller paste speciale valeur dans plage (AJ1:AU1000), suivi d'un tri de cette plage en colonne 'AK)

    J'ai donc toutes les lignes renseignées regroupées et toute les lignes dont valeur est "" également regroupées

    Je souhaite recopier dans classeur "gestion et stock", uniquement les lignes renseignées par "AJ1.Select et ActiveCell.CurrentRegion.Copy" sans prendre en compte les lignes valeur ""

    Pour cela ,je cherche comment effacer le contenu des lignes "" de la plage (AJ1:AU100), sans les supprimer

    Est ce possible, et quel tuto utiliser

    Excusez moi je suis un peu long, j'utilise bien Excel en ce qui concerne les formules mais VBA je débute

    J'utilise Pc XP et Excel2003

    Merci d'avance
    Bien à vous Macjade62

  4. #4
    Candidat au Club
    Profil pro
    Président
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations professionnelles :
    Activité : Président

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Re: regrouper lignes non vides
    Bonsoir à tous,

    Suite de la reflexion, et aprés queques recherche sur forum et FAQ
    Est ce que ce petit bout de code est corect,

    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
    Sub Prepare mouvement du jour()
     
    ' Préparation pour renseigner Mouvements du jour
    ' Copie spéciale et tri de Z à A
    '
     Sheets("articles et produits ").Select
        Range("W14:AH876").Select
        Application.CutCopyMode = False
        Selection.Copy
     
        Range("AJ14").Select
        Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=True, Transpose:=False
        ActiveWorkbook.Worksheets("articles et produits ").Sort.SortFields.Clear
        ActiveWorkbook.Worksheets("articles et produits ").Sort.SortFields.Add Key:= _
            Range("AK14:AK876"), SortOn:=xlSortOnValues, Order:=xlDescending, _
            DataOption:=xlSortNormal
        With ActiveWorkbook.Worksheets("articles et produits ").Sort
            .SetRange Range("AJ14:AU876")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlTopToBottom
            .SortMethod = xlPinYin
            .Apply
        End With
     
    ' Rechercher et effacer lignes = 0
        Dim LastRow AS Long, FirstRow AS Long, x As Long
        LastRow = Range("AJ876")
        FirstRow = Range("AJ14")
        For x = LastRow To FirstRow Step -1
        If x = 0 Then Range("AJ&x:AU&x").Clearcontent
        Next x
    End Sub

  5. #5
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Corrige déjà cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If x = 0 Then Range("AJ" & x & ":AU" & x).Clearcontent

  6. #6
    Candidat au Club
    Profil pro
    Président
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations professionnelles :
    Activité : Président

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour au fil
    Bonjour ouskel'n'or

    Excusez, déplacement important, je n'ai pas travaillé sur le sujet, avant aujourd'hui

    J'ai testé le code, la première partie préparation mouvement du jour fonctionne

    Pour rechercher et effacer lignes = 0
    J'ai modifié la ligne de code, comme proposé

    If x = 0 Then Range("AJ" & x & ":AU" & x).Clearcontent

    En réponse j'ai, Erreur de compilation Erreur de syntaxe au niveau de la ligne.

    As tu un peu de temps à consacrer sur ce sujet

    Merçi d'avance, bien à vous macjade62

  7. #7
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut

    Bien sûr que tu ne peux pas faire ça. Je n'ai corrigé qu'un bout de code
    Range("AJ" & x & ":AU" & x) au lieu de Range("AJ&x:AU&x")
    Bon. J'ai besoin que tu précises :
    Pour qu'une ligne soit considérée vide, toutes les colonnes doivent être vides.
    Deux cas pour le contrôle :
    1 - Soit il suffit de tester une colonne, toujours la même, et toujours remplie quand la ligne est renseignée
    2 - Soit il est nécessaire de tester toutes les colonnes (si les colonnes renseignées peuvent changer d'une ligne à l'autre)
    Dans le premier cas c'est simple. Où NoCol est la colonne toujours remplie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For x = LastRow To FirstRow Step -1
             If Cells(x, NoCol) = 0 then Range("AJ" & x & ":AU" & x).Clearcontent
        Next
    A+

  8. #8
    Candidat au Club
    Profil pro
    Président
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations professionnelles :
    Activité : Président

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Re : Bonjour au fil, Bonjour particulier ouskel'n'or,
    Merçi de ton interêt,
    Bien sûr que tu ne peux pas faire ça. Je n'ai corrigé qu'un bout de code
    Range("AJ" & x & ":AU" & x) au lieu de Range("AJ&x:AU&x")
    Bon. J'ai besoin que tu précises :
    Pour qu'une ligne soit considérée vide, toutes les colonnes doivent être vides.
    Deux cas pour le contrôle :
    1 - Soit il suffit de tester une colonne, toujours la même, et toujours remplie quand la ligne est renseignée

    C'est bien ce cas, la plage (AJ14:AJ876) est toujours renseignée soit par un code alpha de 5 caractères, soit par un 0 et compte tenu du tri toutes les lignes renseignées par le code alpha sont regroupées a partir de AJ14, puis toutes les lignes renseignées =0

    Je ne peut pas joindre fichier essai, trop gros aprés zip (600 Ko)
    Est ce que cette explication est plus claire

    Bien à vous macjade62

  9. #9
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Points : 15 546
    Points
    15 546
    Par défaut
    Tu as essayé le dernier code que je t'ai passé ? S'il ne fonctionne pas alors le pb vient d'ailleurs. Tu peux tester en ajoutant value mais je ne crois pas que ça change grand chose
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For x = LastRow To FirstRow Step -1
             If Cells(x, NoCol).value = 0 then Range("AJ" & x & ":AU" & x).Clearcontent
        Next
    Par contre, tu peux essayer avec Empty
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        For x = LastRow To FirstRow Step -1
             If Cells(x, NoCol) = Empty then Range("AJ" & x & ":AU" & x).Clearcontent
        Next
    Tu peux aussi vérifier ce que tu as dans lastRow et FirstRow. Tu dis

    Edit
    Je n'avais pas vu ça
    LastRow = Range("AJ876")
    FirstRow = Range("AJ14")
    Avant tout, corrige en mettant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        LastRow = Range("AJ876").row
        FirstRow = Range("AJ14").row
    A+

  10. #10
    Candidat au Club
    Profil pro
    Président
    Inscrit en
    Mai 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France

    Informations professionnelles :
    Activité : Président

    Informations forums :
    Inscription : Mai 2007
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour au fil,
    Merçi ouskel'n'or de ton intérêt et de ta patience

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        For x = LastRow To FirstRow Step -1
             If Cells(x, NoCol).value = 0 then Range("AJ" & x & ":AU" & x).Clearcontent
    Je modifie le code comme indiqué, mais lorsque je passe à la ligne suivante,j'ai le message erreur de compilation attendu : séparateurde liste ou )

    Si tu as le temps, je suis assez novice en VBA
    Je suppose que NoCol est une variable à déclarer (NoCol= AJ)
    Pourquoi ajouter .row

    J'apprends VBA, par ce forum et avec Excel2002 et VBA le guide du développeur de john Walkenbach. Je n'ai pas trouvé explications

    Merçi d'avance
    macjade62

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 563
    Points : 1 691
    Points
    1 691
    Par défaut
    salut
    juste en passant, sans avoir étudier ton code, et sans vouloir faire de l'ombre a ouskel qui doit finir tranquilement son week end
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim LastRow AS Long, FirstRow AS Long, x As Long
        LastRow = Range("AJ876")
        FirstRow = Range("AJ14")
        For x = LastRow To FirstRow Step -1
        If x = 0 Then Range("AJ&x:AU&x").Clearcontent
        Next x
    LastRow signifie derniereligne et c'est un chiffre
    = Range("AJ876") est une zone, c'est l'emplacement d'une cellule
    Range("AJ876").row c'est le n° de ligne de cette zone
    et donc : lastrow = n° de ligne de la cellule aj876
    cela dis, puisque tu désigne tes n° de ligne sans les calculer dynamiquement, tu pourrais te passer de la faire en écrivant directement cette valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim  x As Long
          For x = 876 To 14 Step -1
        If Cells(x, NoCol).value = 0 Then Range("AJ&x:AU&x").Clearcontent
        Next x
    et ensuite come nocol est le numéro de la colonne et qu'il s'ajit toujour de la colonne AJ, tu peux aussi le remplacer par son numero

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    For x = 876 To 14 Step -1
        If Cells(x, 36).value = 0 Then Range("AJ&x:AU&x").Clearcontent
        Next x
    et enfin l'erreur de compilation vient du s a la fin de clearcontents, il faut etre vigilant avec l'orthographe
    ce qui pourrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For x = 876 To 14 Step -1
     u = Range("AJ" & x & ":AU" & x).Address
        If Cells(x, 36).Value = 0 Then Range(u).ClearContents
        Next x
    bonne fin de dimanche

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2013] Regrouper cellules non vides de plusieurs lignes
    Par Tiflo34 dans le forum Excel
    Réponses: 2
    Dernier message: 14/05/2015, 21h24
  2. Réponses: 3
    Dernier message: 13/02/2008, 10h10
  3. Ajouter des données après la dernière ligne non vide
    Par jnmab dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/11/2007, 10h21
  4. Filtre lignes Non Vide
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/06/2007, 17h25
  5. [VBA-E]derniere ligne non vide
    Par delamarque dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/07/2006, 10h48

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