MA MACRO

Résolu
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention   -  
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention   -
Salut a tous,

Je voudrais écrire une macro qui insert une cellule vide après chaque groupe d'article. En fait dans chaque cellule un article est répété plusieurs fois(bonbon, chocolat, biscuit etc...) voici ma macro qui ne fonctionne pas correctement :

Sub variables()
'Declaration des variables
Dim nbLignes As Integer, critere As String
'Attribution des valeurs
critere = "bonbons"
nbLignes = WorksheetFunction.CountIf(Range("A1:A19"), critere)
'Utilisation de la condition
Do
If critere = "bonbons" Then
nbLignes = WorksheetFunction.CountIf(Range("A1:A19"), critere)
Cells(nbLignes + 1, 1).Insert
ElseIf critere <> "bonbons" Then
nbLignes = WorksheetFunction.CountIf(Range("A1:A19"), critere)
Cells(nbLignes + 1, 1).Insert
   End If
   
   Loop While critere <> "bonbons"
   
End Sub
A voir également:

4 réponses

ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160
 
Bonjour Jean, bonjour le forum,

Peut-être comme ça :

Sub Macro1()
Dim O As Worksheet 'déclare la variable O (Onglet)
Dim TV As Variant 'déclare la variable TV (Tableau des Valeurs)
Dim D As Object 'déclare la variable D (Dictionnaire)
Dim I As Integer 'déclare la variable I (Incrément)
Dim J As Integer 'déclare la variable J (incrément)
Dim TL() As Variant 'déclare la variable TL (Tableau des Lignes)

Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
TV = O.Range("A1").CurrentRegion 'définit le tableau des valeur TV
Set D = CreateObject("Scripting.Dictionary") 'définit le dictionnaire D
For I = 2 To UBound(TV, 1) - 1 'boucle sur toutes les lignes I du tableau des valeurs TV (en partant de la seconde et sans la dernière)
    If TV(I + 1, 1) <> TV(I, 1) Then 'condition : si la donnée en ligne I + 1 est différente que la donnée en ligne I (dans la colonne 1)
        ReDim Preserve TL(J) 'redimensionne le tableau des lignes TL
        TL(J) = I + 1 'stocke le numéro de ligne I + 1
        J = J + 1 'incrémente J
    End If 'fin de la condition
Next I 'prochaine ligne de la boucle
For J = UBound(TL) To LBound(TL) Step -1 'boucle inversée sur tous les éléments J du tableau des lignes TL
    O.Rows(TL(J)).Insert shift:=xlShiftDown 'insère une ligne avant la ligne de l'élément J de TL
Next J 'prochain élément de la boucle
End Sub

À plus,
ThauTheme
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour et Merci pour votre aide si précieuse. Je suis un vrai débutant en VBA et j’espère qu'avec votre aide je pourrais me perfectionner.
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Salut Ça marche pour le cas ou les cellules contiennent un seul mot (ex: bonbon) mais pour les désignations comme : ABATTANT WC BLANC LOURD ca ne fonctionne pas.
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160 > jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Re,

Fais l'effort de fournir un fichier, on perdra moins de temps. Regarde du coté de https://www.cjoint.com/ par exemple...
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention   > ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention  
 
voici le lien : https://www.cjoint.com/c/FLAm3jJxJmL

il s’agit pour moi d’écrire une macro qui va m'aider a regrouper les articles par "famille"
0
ThauTheme Messages postés 1442 Date d'inscription   Statut Membre Dernière intervention   160 > jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Ton exemple n'a rien à voir avec tes explications. Désolé mais je passe la main. Trop compliqué pour moi...
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

Quel est l'objectif recherché, pourquoi détruire la base de données en y insérant des lignes ?
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Salut Patrice, l'objectif recherchée est le suivant, je voudrais écrire une macro qui va me permettre de séparer (inserer une ligne) une liste d'article en les regroupant par famille.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780 > jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Ça, je l''avais bien compris, mais ce n'est pas un objectif, dans quel but fais-tu ça ?
Sachant que ça aura pour effet de détruire la cohérence de ta base de données, ne serait-t-il pas préférable de travailler dans un autre onglet ?
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention   > Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention  
 
Patrice, il ne s’agit pas d'une base de données, je voudrais simplement automatisée une tache que j'ai l'habitude de faire manuellement pour gagner du temps. En fait le but est de faire des régularisations de stock. C'est un document d'inventaire.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Un exemple de différentiation par MFC, sans macro et sans insérer de ligne supplémentaire :
https://www.cjoint.com/c/FLBhPQoyNC1
Cordialement
Patrice
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Voici un exemple du résultat recherché dans l'onglet (Feuil2) :
https://www.cjoint.com/c/FLBirpP5OAL
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Re,


Donc l'objectif c'est de pouvoir faire des sous-totaux par famille !
Excel sait faire ça tout seul sans macro !

Par contre que ce soit avec une macro ou sans, il faut pouvoir identifier les familles.
Au vu de ton exemple, il s'avère que la méthode que tu envisageais (avec des mots clés) ne peut pas fonctionner. Le fichier MFC que je t'ai envoyé, montre les limites de cette méthode (que ce soit par formule ou par macro).


Le plus simple est d'ajouter une colonne qui identifie les familles. Dans ce cas il suffira de demander à Excel des sous-totaux.
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour Patrice, la methode des Sous-totaux ne marche pas. voici un apercu du resultat obtenu dans le fichier ci-joint (onglet Feuil3) :
https://www.cjoint.com/c/FLDhXmkfobL
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

La méthode fonctionne si tu fait ce que j'ai écrit :
Le plus simple est d'ajouter une colonne qui identifie les familles. Dans ce cas il suffira de demander à Excel des sous-totaux.

Par exemple :
https://www.cjoint.com/c/FLDiUNVfEj1

Patrice
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention   > Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour,

Effectivement ça marche, merci beaucoup. J'ai un autre soucis, je voudrais que vous m'expliquiez un peu la formule que vous avez tapé dans l'onglet Feuil1 colonne K, elle pourra m’être très utile.
0
Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention   1 780
 
Bonjour,

Dans la formule, la partie :
GAUCHE($B3;CHERCHE(" ";$B3&" "))

permet d'extraire le premier mot du texte de la cellule B3. C'est à dire depuis le début du texte jusqu'au premier espace, ou jusqu’à la fin si il n'y a pas d'espace dans le texte

Donc :
GAUCHE($B3;CHERCHE(" ";$B3&" "))=GAUCHE($B2;CHERCHE(" ";$B2&" "))
permet de comparer le premier mot de B3 avec le premier mot de B4

La partie :
N(K2)
donne la valeur du nombre situé dans la cellule précédente K2. Si la cellule contient du texte le résultat de N(K2) est 0.

La formule complète : Si le premier mot de la cellule précédente de la colonne désignation est égal au premier mot de la cellule de la colonne désignation, alors, le résultat est le même que celui de la cellule résultat précédente, sinon le résultat est égal au résultat de la cellule précédente + 1.

Quand à la formule de la MFC :
=MOD($K3;2)=0
elle es VRAI quand le reste de la division par 2 du nombre en K3 esr égal à 0, c'est a dire que la MFC apparaît pour tous les nombres pairs de la colonne K.

Patrice
0
jeandchanel Messages postés 135 Date d'inscription   Statut Membre Dernière intervention   > Patrice33740 Messages postés 8561 Date d'inscription   Statut Membre Dernière intervention  
 
Merci pour toutes vos explications . A bientot !
0