Insertion de chapitre - Dur dur

Y compris Power BI, Power Query et toute autre question en lien avec Excel
a
asaussereau
Membre habitué
Membre habitué
Messages : 65
Inscrit le : 10 avril 2015
Version d'Excel : 2010

Message par asaussereau » 17 août 2018, 12:30

Bonjour a toutes et tous.

Je début en VBA, et ne suis pas un grand expert d'excel.
On m'a demander de créer un outil de devis depuis un fichier excel existant.
J'ai jusqu'ici réussi pas mal de petite chose et je suis plutôt surpris de ce que j'ai pu réaliser jusqu'ici (verrouillage du fichier, différente impression depuis des boutons, insertion de lignes, suppression de ligne, insertion de détail...). Bref ça correspond à ce que l'on me demandais. Du coup on me demande plus (forcément :P ), mais là je bloque ! ::(

Dans le fichier (que je ne peut transmettre...), il y a des chapitres et un récapitulatif qui indique le numéro, le titre et les montants des chapitre. Chaque titre et chaque total de chapitre sont nommés.
Le fichier à un certain nombre de chapitre, mais seul 3 sont apparent, les autres sont masqués. Lorsque l'on a besoin de chapitre supplémentaire, on les affiche, idem pour les ligne de récap qui y sont associées.

Ce que l'on me demande c'est que l'on puisse avoir un bouton qui insère un chapitre (et donc également ça ligne de récap). afin de ne pas avoir tout les chapitres masqué inutilement, et que s'il y en a besoin de plus, on puisse en ajouter (chose pas possible aujourd'hui).

Aujourd'hui j'arrive à insérer un chapitre, mais je ne contrôle pas ça position (il peut être inséré au milieu d'un autre chapitre alors qu'il devrait être à la suite). Je n'arrive pas à nommer les lignes correspondant au titre et au total. Je sais encore moins comment faire pour que le nommage se face de manière à s'incrémenter, n'y comment insérer une nouvelle ligne de récap...

Bref je bloc et ça va au delà de mes faible compétence dans le domaine.

Ci-dessous le code que j'ai pour le moment (je sais que sans le fichier c'est difficile...).
Si des personnes peuvent me donner des piste ou des bout de code pour me permettre d'avancer, se serait top et je vous en remercie par avance.

PS: Je sais que mon code est loin d'être parfait, mais je début vraiment seulement quelque jour. Je parcours le web pour avancer, mais pas facile... Merci de votre compréhension.

Cordialement
Sub Insertion_chapitre()
'
'Déprotection de la feuille
ActiveSheet.Unprotect Password:="KGV"
'Désactivation de l'actualisation de l'écran (pour accélérer l'exécution du code)
Application.ScreenUpdating = False
'Passage en calcul manuel
    With Application
        .Calculation = xlManual
        .MaxChange = 0.001
    End With

    'Déclaration de la variable "adresse"
    Dim adresse As String
    'Atribution d'une valeur à la variable "adresse" = ligne sélectionnée lors du lancement de la macro
    adresse = ActiveCell.Row
    'Déclaration de la variable "titre"
    Dim titre As String
    ''Atribution d'une valeur à la variable "titre"
    ''titre = Rows("18:18")
    'Sélection et copie de la variable "titre"
    Rows("18:26").Select
    Selection.Copy
    'Sélection de ligne sélectionnée lors du lancement de la macro
    Rows(adresse & ":" & adresse).Select
    'Insersion des lignes précédemment copiées
    Selection.EntireRow.Insert
    'Création d'un groupe
    Selection.Rows.Group
    'Sélection des lignes collées
    Rows(adresse & ":" & adresse + 8).Select
    'Ajout d'une couleur aux cellules copiées pour les repérer
     With Selection.Interior
        .ColorIndex = 0
        .Pattern = xlGray25
        .PatternColorIndex = 6
    End With
    'Suppresion texte colonne C
    Rows(adresse & ":" & adresse).Select
    Range("c" & adresse).Select
    ActiveCell.Offset(1, 0).Select
    Selection.ClearContents
    Rows(adresse & ":" & adresse).Select
    Range("c" & adresse).Select
    ActiveCell.Offset(2, 0).Select
    Selection.ClearContents
    Rows(adresse & ":" & adresse).Select
    Range("c" & adresse).Select
    ActiveCell.Offset(3, 0).Select
    Selection.ClearContents
    Range("c" & adresse).Select
    ActiveCell.Offset(1, 0).Select
    
    

'Passage en calcul automatique
    With Application
        .Calculation = xlAutomatic
        .MaxChange = 0.001
    End With
'Activation de l'actualisation de l'écran
Application.ScreenUpdating = True
'Protection de la feuille
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:= _
    False, AllowFormattingCells:=True, AllowFormattingColumns:=True, _
    AllowFormattingRows:=True, AllowInsertingColumns:=True, AllowInsertingRows _
    :=True, AllowInsertingHyperlinks:=True, AllowDeletingColumns:=True, _
    AllowDeletingRows:=True, AllowSorting:=True, AllowFiltering:=True, _
    AllowUsingPivotTables:=True, UserInterfaceOnly:=True, Password:="KGV"
End Sub
Avatar du membre
ric
Membre impliqué
Membre impliqué
Messages : 2'255
Appréciations reçues : 191
Inscrit le : 29 mai 2018
Version d'Excel : 365 fr 32 bits

Message par ric » 17 août 2018, 12:46

Bonjour,
mais je ne contrôle pas ça position
Selon ton code, l'insertion se fera à la ligne de la cellule sélectionnée avant de lancer la macro
    adresse = ActiveCell.Row
C'est sur ce bout là qu'il faut regarder ... à savoir "où je veux insérer mes lignes?".


ric
Un bon dépanneur : la touche F8 pour faire un Pas-à-Pas sur le code. :mrgreen:
a
asaussereau
Membre habitué
Membre habitué
Messages : 65
Inscrit le : 10 avril 2015
Version d'Excel : 2010

Message par asaussereau » 17 août 2018, 13:55

Merci Ric pour ton retour.

En fait c'est moi qui me suis mal exprimé.
En effet j'insère le chapitre dans la cellule qui était sélectionnée avant de lancer la macro.

Car actuellement je pars du principe que l'utilisateur c'est positionné au bon endroits, mais je sais pertinemment que ce ne sera pas toujours le cas.
C'est pourquoi j'aimerais qu'il soit inséré à la fin du chapitre précédent (car le fichier sera minimum avec un chapitre, non utilisable par l'utilisateur, car il me sert de base pour l'insertion des suivant), et non pas dans la cellule qui était sélectionné avant de lancer la macro.

Cordialement
Avatar du membre
ric
Membre impliqué
Membre impliqué
Messages : 2'255
Appréciations reçues : 191
Inscrit le : 29 mai 2018
Version d'Excel : 365 fr 32 bits

Message par ric » 17 août 2018, 17:53

Bonjour,

Pour placer au bas... supposons qu'on parle de la colonne A.
Trouver la dernière ligne non vide de la colonne et on ajoute 1 pour la première cellule vide.
Puis, change la valeur de adressse.
Dim Dlig As Integer
Dlig = ActiveSheet.Range("A" & Rows.Count).End(xlUp).Row + 1
   adresse = Range("A" & Dlig)

ric
Un bon dépanneur : la touche F8 pour faire un Pas-à-Pas sur le code. :mrgreen:
a
asaussereau
Membre habitué
Membre habitué
Messages : 65
Inscrit le : 10 avril 2015
Version d'Excel : 2010

Message par asaussereau » 18 août 2018, 07:40

Bonjour Ric,

De nouveau, merci pour ta participation.
Le problème est que ce code va me placer mon chapitre à la fin de mon document (du moins c’est ce que je comprends, je ne peux pas le tester avant lundi), hors ce n’est pas le cas dans mon fichier, car il faut que les chapitres soit inséré avant le récap et d’autres éléments.

L'idéal je pense serais de nommer la zone qui correspond à la récap, et de trouver la dernière ligne non vide au-dessus de cette zone nommée. Mais je ne sais pas si c'est possible.
Avatar du membre
ric
Membre impliqué
Membre impliqué
Messages : 2'255
Appréciations reçues : 191
Inscrit le : 29 mai 2018
Version d'Excel : 365 fr 32 bits

Message par ric » 18 août 2018, 10:27

Bonjour,

Sans fichier représentatif, c'est difficile de visualiser.


ric
Un bon dépanneur : la touche F8 pour faire un Pas-à-Pas sur le code. :mrgreen:
a
asaussereau
Membre habitué
Membre habitué
Messages : 65
Inscrit le : 10 avril 2015
Version d'Excel : 2010

Message par asaussereau » 19 août 2018, 07:49

Bonjour,

J'en suis tout à fait conscient.
Dès lundi, je vais voir pour essayer d’anonymiser le fichier sans que ça ne dénature le fichier afin de pouvoir le joindre.
Mais comme le fichier d'origine n'est pas de moi, il y a des choses que je ne comprends, maitrise pas.
Donc je fais de mon mieux. Si j'y arrive je le joindrais.

Bon weekend.
a
asaussereau
Membre habitué
Membre habitué
Messages : 65
Inscrit le : 10 avril 2015
Version d'Excel : 2010

Message par asaussereau » 20 août 2018, 09:43

Bonjour,

Je pense avoir réussi à anonymiser le fichier le plus possible sans que ça ne perturbe le fonctionnement.
Pour rappel ce fichier est un fichier qu'un collègue utilisait il y a longtemps et qui a beaucoup été modifié et dénaturé avant qu'il me soit donné pour en faire une matrice devis qui nous correspond (Le fichier n'était plus fonctionnel tellement il avait été maltraité :? ).
Certain élément sont donc des choses du "passé" que je ne maîtrise pas forcément.

J'espère que ce fichier pourra aider pour la compréhension de ce que je souhaite faire.

Cordialement.
Matrice devis forum.xlsm
(116.67 Kio) Téléchargé 20 fois
a
asaussereau
Membre habitué
Membre habitué
Messages : 65
Inscrit le : 10 avril 2015
Version d'Excel : 2010

Message par asaussereau » 20 août 2018, 13:07

J'ai modifié mes différentes macros pour les rendre le plus lisible et compréhensible possible (ce qui m'a permis de remettre un peu d'ordre :P ).
Matrice devis forum V2.xlsm
(116.06 Kio) Téléchargé 19 fois
Avatar du membre
ric
Membre impliqué
Membre impliqué
Messages : 2'255
Appréciations reçues : 191
Inscrit le : 29 mai 2018
Version d'Excel : 365 fr 32 bits

Message par ric » 20 août 2018, 16:35

Bonjour,

Dans le menu onglet "Formules" > "Gestionnaire de noms", on constate que les premiers chapitres sont espacés de 9 lignes et les suivants de 10 lignes ... je suggère d'uniformiser à 10 lignes pour la facilité des traitements.
J'ai remonté la déclaration des variables au début de la macro.
Pour placer un nouveau chapitre (si 10 lignes), on part de la ligne "Récapitulatif" (317), on remonte en colonne B jusqu'au dernier chapitre inscrit et on redescend de 10 lignes. Voilà, on est positionné. Le reste du code n'a pas été modifié.
Voir si ça convient ...
Sub Insertion_chapitre()
   Dim Adresse As String      'Déclaration de la variable "adresse"
   Dim Titre As String        'Déclaration de la variable "titre"
   Dim DerC As Integer        'Décolaration dernier/prochain chapitre

         'Raccourci macro = "Ctrl + i"

   Worksheets("Bordereau").Activate    'S'assurer qu'on travaille sur la bonne feuille


   ActiveSheet.Unprotect Password:="KGV"    'Déprotection de la feuille

   'Désactivation de l'actualisation de l'écran (pour accélérer l'exécution du code)
   Application.ScreenUpdating = False

   'Passage en calcul manuel
   With Application
      .Calculation = xlManual
      .MaxChange = 0.001
   End With

   DerC = Cells(317, "B").End(xlUp).Row + 10    ' trouver le dernier chapitre et descendre de 10 lignes

   'Atribution d'une valeur à la variable "adresse" = ligne sélectionnée lors du lancement de la macro
   Adresse = DerC  '''ActiveCell.Row
   ...
   ...

ric
Un bon dépanneur : la touche F8 pour faire un Pas-à-Pas sur le code. :mrgreen:
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message