Macro Excel pour mise en forme d'un tableau de données

Production12

XLDnaute Nouveau
Bonjour

Je souhaite créer une macro Excel qui va faire les actions suivantes par rapport au tableau ci-dessous :



en "Balayant" la Colonne N
( Je nomme un bloc toute ligne ou ensemble de ligne entre 2 lignes vides )

1) si dans un bloc la premiere ligne de la colonne N est 0 alors effacer ce bloc (exemple effacer les lignes dont la colonne P sont A303 A00 A319 A303 et A304) ; si dans un bloc la premiere ligne du bloc est différent de 0 dans la colonne N, conserver le bloc
et il faut passer tout la colonne N comme cela

2) effacer toute ligne vide

Merci pour votre aide


Cordialement
 

Grand Chaman Excel

XLDnaute Impliqué
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour Production12,

Essaie ceci :

Code:
Sub EffacerBlocs()
Dim rg As Range
Dim LastRow As Integer
Dim ws As Worksheet
Dim bEffacer As Boolean

Application.ScreenUpdating = False

Set ws = ActiveSheet
Set rg = ws.Range("N1")     'Ligne de départ

LastRow = ws.Range("P65000").End(xlUp).Row  'Dernière ligne du tableau

'..Identifier les blocs à effacer
On Error Resume Next
Do Until rg.Row = LastRow + 1
    bEffacer = False
    If rg.Offset(-1, 0) = "0" And rg.Offset(0, 1) <> "" Then  'on est en début de bloc
        If rg = "0" Then  bEffacer = True          'c'est un bloc à effacer
    End If
    If bEffacer Then rg = "0"
    Set rg = rg.Offset(1, 0)
Loop

'..Effacer les lignes vides et les Blocs identifiés
For i = LastRow To 1 Step -1
    If Range("N" & i).Value = "0" Or Range("N" & i).Offset(0, 1).Value = "" Then Rows(i).Delete
Next i

Application.ScreenUpdating = True

End Sub
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour Production et bienvenu, bonjour le forum,

Il est dommage que tu ais pris le temps de faire une capture d'écran mais que tu n'ais pas mis le fichier en piece jointe. Ce qui oblige ceux qui voudraient te venir en aide à recréer ton problème sur un fichier excel. J'estime que c'est plutôt à toi de faire cet effort...
Mais comme nous avons un Grand Chaman depuis peu parmi nous tu as quand même eu une réponse. Je te recommande vivement de lire la Lien supprimé pour connaître tous les bons plans pour obtenir de l'aide rapidement.
 

Production12

XLDnaute Nouveau
Re : Macro Excel pour mise en forme d'un tableau de données

Merci Grand chaman,

Mais le résultat n'est pas tout à fait bon.
Seule la première ligne du bloc est effacé et pas le bloc en entier.

Peux tu m'aider ou comme préconisé, il faut mieux que je joigne un fichier ?

Merci
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour le fil, bonjour le forum,

En pièce jointe ton fichier colorié... En jaune les lignes respectant ton critère, donc celles qui doivent être effacées (ou supprimées j'ai pas bien compris). En rouge celles qui doivent rester. En vert clair, celles qui ont plusieurs valeurs en N. Parfois c'est deux fois le 0 donc j'imagine qu'elles doivent être effacées/supprimées mais il y a un cas où il y a 1 et 0. Que doit faire la macro dans ce cas là ?

Que doit-on faire des lignes restantes (celles qui restent blanches) ?

la macro ci-dessous convient-elle ? Le second onglet montre la résultat après la macro...
Code:
Sub Macro1()
Dim dl As Integer 'déclare la variable dl (Dernière ligne)
Dim x As Integer 'déclare la variable x (incrément)
 
Application.ScreenUpdating = False 'masque les changements à l'écran
dl = Range("N65536").End(xlUp).Row 'définit la dernière ligne
For x = dl To 2 Step -1 'boucle inversée de la dernière ligne à la ligne 2
    If Cells(x, 14).Value = 0 And Cells(x, 14) <> "" Then 'condition 1 : si la cellule de la colonne N=0 (sans être vide)
        If Cells(x + 1, 15).Value <> "" Then 'condition 2 : si la cellule une ligne en dessous en colonne 0 n'est pas vide
            Range(Cells(x, 15), Cells(x, 15).End(xlDown)).EntireRow.Delete 'supprime les ligne
        Else 'sinon
            Cells(x, 15).EntireRow.Delete 'supprime la ligne
        End If 'fin de la condition 1
    End If 'fin de la condition 2
Next x 'prochaine ligne de la boucle
Application.ScreenUpdating = True 'affiche les changements à l'écran
End Sub

Dernière remarque, tu pouvais joindre ton fichier directement dans le forum vu sa taille. Une rubrique au tout début de forum Excel explique comment faire et les limites de taille...
 

Pièces jointes

  • Production_v01.xls
    94 KB · Affichages: 128

Production12

XLDnaute Nouveau
Re : Macro Excel pour mise en forme d'un tableau de données

Re Bonjour et surtout merci ces réponses d'une grande qualité et aussi rapide.

Donc, il faut supprimer les lignes jaunes et les lignes restantes.

Concernant les lignes vert clair : là où il y a 2 "0" qui se suivent, ces lignes de ce type doivent être supprimés.
Le cas où on aura un "1" (ou un autre nombre d'ailleurs autre que 0) puis un 0 mais sans saut de ligne, il faut garder les lignes du 1 inclus au 0 non inclus et supprimer le reste (en clair : garder les lignes 206 à 212 et supprimer 213 à 216 et supprimer la 217 puisque c'est une ligne vide).

Merci encore pour la modification à venir.

Cordialement,
 
Dernière édition:

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour le fil, bonjour le forum,

Une version 2 avec la macro ci-dessous (deux boucles pour en venir à bout) :
Code:
Sub Macro1()
Dim dl As Integer 'déclare la variable dl (Dernière ligne)
Dim x As Integer 'déclare la variable x (incrément)
 
Application.ScreenUpdating = False 'masque les changements à l'écran
 
dl = Range("A65536").End(xlUp).Row 'définit la dernière ligne
For x = dl To 2 Step -1 'boucle inversée de la dernière ligne à la ligne 2
    If Cells(x, 14).Value = 0 And Cells(x, 14).Value <> "" Then 'condition 1 : si la cellule de la colonne N=0 (sans être vide)
        If Cells(x + 1, 15).Value <> "" Then 'condition 2 : si la cellule une ligne en dessous en colonne 0 n'est pas vide
            Range(Cells(x, 15), Cells(x, 15).End(xlDown)).EntireRow.Delete 'supprime les lignes
        Else 'sinon
            Cells(x, 15).EntireRow.Delete 'supprime la ligne
        End If 'fin de la condition 2
    End If 'fin de la condition 1
Next x 'prochaine ligne de la boucle
 
dl = Range("A65536").End(xlUp).Row 'redéfinit la dernière ligne
For x = dl To 2 Step -1 'boucle inversée de la dernière ligne à la ligne 2
    If Cells(x, 15).Value = "" Then 'condition : si la cellule de la colonne O est vide
        Cells(x, 15).EntireRow.Delete 'supprime la ligne
    End If 'fin de la condition
Next x 'prochaine ligne de la boucle
 
Application.ScreenUpdating = True 'affiche les changements à l'écran
End Sub
 

Pièces jointes

  • Production_v02.xls
    81.5 KB · Affichages: 55

Production12

XLDnaute Nouveau
Re : Macro Excel pour mise en forme d'un tableau de données

Bon je continue la mise en forme.
Je souahite insérer une colonne en Q pour y concaténer les colonnes O et P de chaque ligne restante. Puis faire un copier-coller valeur de cette colonne Q.
Le nombre de lignes du fichier est variable à chaque fichier à traiter.

Merci pour vos aides.

Cordialement,
 

Pièces jointes

  • essai pour macro.xls
    67 KB · Affichages: 176
  • essai pour macro.xls
    67 KB · Affichages: 171
  • essai pour macro.xls
    67 KB · Affichages: 174

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour le fil, bonjour le forum,

En pièce jointe une version 3 avec la macro2 ci-dessous (inspirée de la tienne). J'ai fait un appel de la marco2 dans la macro1, donc en lançant la macro1 ça devrait resoudre tous les problèmes...
Code:
Sub Macro2()
Dim dl As Integer 'dédlare la variable dl (Dernière Ligne)
Dim ori As Range 'dédlare la variable ori (Origine)
Dim re As Range 'dédlare la variable re (Remplissage)
 
Columns("O:O").Insert Shift:=xlToRight 'insère une colonne
dl = Range("A65536").End(xlUp).Row 'définit la dernière ligne
Set ori = Range("O2") 'définit l'origine
Set re = Range("O2:O" & dl) 'définit la plage de remplissage
ori.FormulaR1C1 = "=RC[-2]&RC[-1]" 'place la formule en O2
ori.AutoFill Destination:=re 'remplissage automatique
re.Copy 'copie la plage de remplissage
re.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 'colle les valeur
Application.CutCopyMode = False 'supprime le clignotement du copié
End Sub
 

Pièces jointes

  • Production_v03.xls
    79.5 KB · Affichages: 59

Production12

XLDnaute Nouveau
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour à nouveau,

Ca avance, ça avance, c'est génial.
Bon maintenant, une fois la macro 'suivi journalier' executée (voir fichier joint), je souhaiterai pouvoir faire l'action suivante :
En balayant toujours toute les lignes du tableau, si dans la colonne B, j'ai le code VIS, je souhaite rajouter à la colonne M de la même ligne,le texte suivant : "visserie" à la suite de la désignation déjà existante (concaténation en quelque sorte).

Merci

Cordialement,
 

Pièces jointes

  • essai pour macro.xls
    75 KB · Affichages: 44
  • essai pour macro.xls
    75 KB · Affichages: 48
  • essai pour macro.xls
    75 KB · Affichages: 47

Robert

XLDnaute Barbatruc
Repose en paix
Re : Macro Excel pour mise en forme d'un tableau de données

Bonsoir le fil, bonsoir le forum,

Nous voilà arrivés à la version 04... J'ai supprimé les Select inutiles qui ralentissent le code et rajouté la macro ci-dessous que j'ai aussi appelée dans Suivi_Journalier :
Code:
Public Sub Visserie()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim cel As Range 'déclare la variable cel (CELlule)
 
dl = Range("A65536").End(xlUp).Row 'définit la dernière ligne
Set pl = Range("B2:B" & dl) 'définit la plage pl
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    'si la valeur de cel (mise en majuscule)= "VIS" , rajoute " visserie"à la valeur de la cellule correpondante en colonne M
    If UCase(cel.Value) = "VIS" Then cel.Offset(0, 11).Value = cel.Offset(0, 11).Value & " visserie"
Next cel 'prochaine cellule cel de la plage pl
Range("A1").Select 'sélectionne A1
End Sub
 

Pièces jointes

  • Production _v04.xls
    90.5 KB · Affichages: 53
Dernière édition:

Production12

XLDnaute Nouveau
Re : Macro Excel pour mise en forme d'un tableau de données

Bonjour à tous,

Pas pu m'occuper de la macro tôt aujourd'hui. J'ai donc avancé et là c'est l'étape finale, reste dans la procedure mise_en_forme_impression d'effectuer une selection générale (sélectionner les cellules ayant une valeur), là en enregistrant c'est des valeurs que pour l'exemple et non pas une sélection générale. Donc merci la correction à y apporter.

Cordialement,
 

Pièces jointes

  • essai pour macro.xls
    141.5 KB · Affichages: 50
  • essai pour macro.xls
    141.5 KB · Affichages: 49
  • essai pour macro.xls
    141.5 KB · Affichages: 48

Discussions similaires

Réponses
7
Affichages
432
Réponses
3
Affichages
326

Statistiques des forums

Discussions
312 590
Messages
2 090 040
Membres
104 354
dernier inscrit
Chass