Insertion de chapitre - Dur dur

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 ), 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

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

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

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

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.

Bonjour,

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

ric

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.

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.

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 ).

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

Merci Ric,

Après quelques ajustements du fichier, cela semble fonctionner, je t'en remercie.

C'est noté pour les déclarations des variables en début de macro, ainsi vérification de la feuille active.

J'aurais certainement d'autre question, est-il préférable de mettre ce sujet en résolu, ou de le continuer ? (étant donné que les questions seront toujours en rapport avec l'insertion d'un chapitre).

Encore merci à vous.

Cordialement

Bonjour,

Même fichier et avancement du projet ... tu peux aisément rester dans ce fil.

ric

Bonjour,

J'ai un souci d'affectation de cellule.

En effet je souhaite indiquer dans une formule que je fais référence à la case $A$x sachant que x changera en fonction de chaque chapitre.

J'ai beau essayer de modifier la formule de plusieurs manières, mais rien n'y fait. Je me retrouve soit avec $A$1 soit avec Ax, mais jamais avec $A$x

Ci-dessous la partie du code concerné, ainsi que le fichier en question.

Merci

'Changer formule de suivi de numéro de chapitre colonne "A"
Effacer = 0
While Effacer <= 19
Rows(Adresse & ":" & Adresse).Select
Range("A" & Adresse).Select
ActiveCell.Offset(Effacer, 0).Select
Selection.Value = "=R1C1"
Effacer = Effacer + 1
Wend

Bonjour,

Oula! oula! oula! beaucoup de select ... la très grande majorité sont inutiles.

Je regarde cela ....

ric

Arf, oui je pense que le code peu grandement être amélioré.

Comme je débute, j'utilise des petits bout de code qui son simple (enfin que je comprends quoi), et je les réutilise comme je peux.

En tout cas merci pour votre aide.

Sinon, j'ai également un autre point sur lequel je bloque, sauf que là je bloque complètement et ne sais pas du tout comment m'y prendre (soit je ne trouve pas d'exemple correspondant à mon souhait, soit je ne comprends pas la façon de faire).

Je souhaite nommer la plage contenant le titre du chapitre, ainsi que la plage contenant le total du chapitre, dans le but de pouvoir les réutiliser dans la partie "récapitulatif".

Actuellement les titres sont nommés (manuellement) de la manière suivante "CHAP01" pour le chapitre 1, "CHAP02 pour le chapitre 2...

Et pour le total: "_TT01", pour le chapitre 1, "_TT02 pour le chapitre 2...

Si jamais vous avez une solution, ou même un début de piste...

Encore merci à vous.

Bonjour,

Voici une version avec tes nouvelles demandes .... moins la toute dernière (champs nommés automatiques).

Tu remarqueras que j'ai mis en commentaire des bouts ton ancien code afin que tu puisses comparer les façons de faire.

Aussi, tu réécrivais les formules en colonne A ... inutile, si ce sont les bonnes formules.

Voisin de récapitulatif, une cellule est bleue. C'est un champ nommé "LigRecap". Ce champ nommé sert de départ pour trouver la ligne du dernier chapitre à mettre en variable "Adresse".

Tu pourras enlever la couleur.

Examine cela ... en attendant que je te prépare le code pour les champs nommés des chapitres.

ric

Bonjour,

..... de la manière suivante "CHAP01" pour le chapitre 1, "CHAP02 pour le chapitre 2...

Et pour le total: "_TT01", pour le chapitre 1, "_TT02 pour le chapitre 2 .....

Dis-moi, il n'y aura jamais plus de 99 chapitres ??

Sinon, il faudra nommer dès le départ "CHAP001" et "_TT001".

ric

Bonjour Ric,

Merci pour ton dernier fichier, je vais analyser ça cet aprèm (je ne vais pas pouvoir ce matin).

Concernant le nombre de chapitre, on va rester sur 99 en maxi je pense (ce qui est déjà beaucoup), et je modifierais dans l'avenir s’il y a besoin de plus. À moins qu’il soit pas évident de le modifier par la suite, et dans ce cas on part si 999 dès maintenant.

Encore une fois, un GRAND MERCI

Bonjour,

On va donc utiliser 3 chiffres pour les noms.

Autres questions :

  • en ajoutant un chapitre, doit-on ajouter une ligne en bas de "Recapulatif" concernant ce nouveau chapitre ?
  • doit-on ajouter un bouton pour supprimer un chapitre ? (avec demande à l'utilisateur, quel chapitre supprimer)

Remarque, pour l'insertion et autre manipulation, le code fait mention de la ligne entière. Est-ce vraiment nécessaire que ce soit la ligne entière ? Colonne A à M me semble suffisant ...

ric

Ok pour les noms avec 3 chiffres.

Pour le récap, oui, à chaque insertion de chapitre, il doit être inséré la ligne de récap correspondante.

Pour la suppression d'un chapitre, oui ça peut être un plus appréciable. Mais…

Les chapitres ne seront pas toujours numérotés 1, 2, 3. Ils peuvent être numérotés A, B, C, ou I, II, III, ou … (numéro dans la colonne B à gauche du titre du chapitre).

Cela dépendra des devis (en fonction d"éléments externe). Mais le nommage des cellules sera quand-même "CHAP001". Donc physiquement on aura "CHAP001" et visuellement ont aura 1, 2, 3, ou A, B, C, ou I, II, III, ou …

Donc à voir si ça pose problème ou pas.

Concernant les manipulations, en effet il n'est peut-être pas nécessaire de manipuler la ligne entière. Les colonnes A à M sont en effet suffisante.

Rechercher des sujets similaires à "insertion chapitre dur"